diff --git a/.github/composite/ci-build/action.yaml b/.github/composite/ci-build/action.yaml
new file mode 100644
index 000000000..49c42f4d0
--- /dev/null
+++ b/.github/composite/ci-build/action.yaml
@@ -0,0 +1,58 @@
+name: "CI Build"
+description: "Build the application on the CI"
+inputs:
+ target:
+ description: The target OS {iOS, Android}
+ required: true
+ build-target:
+ description: The build target {ios or apk}
+ required: true
+ build-args:
+ description: The arguments for flutter build
+ required: false
+ build-path:
+ required: true
+ asset-extension:
+ required: true
+ default: zip
+ asset-content-type:
+ required: true
+ default: application/zip
+ github-api-token:
+ description: the Github API token
+ required: true
+ app-name:
+ required: true
+
+runs:
+ using: "composite"
+ steps:
+ - name: Build the application
+ shell: bash
+ run: flutter build -v ${{ inputs.build-target }} ${{ inputs.build-args }} --release --dart-define=GH_API_TOKEN=${{ inputs.github-api-token }}
+
+ - name: Set environment
+ shell: bash
+ run: |
+ echo "APP_PATH=${{ github.workspace }}/${{ inputs.app-name }}_${{ inputs.target }}.${{ inputs.asset-extension }}" >> $GITHUB_ENV
+ echo $APP_PATH
+
+ - name: Rename Android build
+ if: inputs.target == 'Android'
+ shell: bash
+ run: mv app-release.${{ inputs.asset-extension }} $APP_PATH
+ working-directory: ${{ inputs.build-path }}
+
+ - name: Compress iOS build
+ if: inputs.target == 'iOS'
+ shell: bash
+ run: |
+ mv Runner.app ${{ inputs.app-name }}.app
+ ditto -c -k --sequesterRsrc --keepParent ${{ inputs.app-name }}.app $APP_PATH
+ working-directory: ${{ inputs.build-path }}
+
+ - name: Upload build artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ inputs.target }}
+ path: $APP_PATH
\ No newline at end of file
diff --git a/.github/composite/flutter-setup/action.yaml b/.github/composite/flutter-setup/action.yaml
new file mode 100644
index 000000000..8149bb0b7
--- /dev/null
+++ b/.github/composite/flutter-setup/action.yaml
@@ -0,0 +1,86 @@
+name: "Flutter setup"
+description: "Setup flutter"
+inputs:
+ encrypted-signets-api-cert-password:
+ required: true
+ encrypted-google-service-password:
+ required: true
+ encrypted-etsmobile-keystore-password:
+ required: true
+ encrypted-keystore-properties-password:
+ required: true
+ encrypted-android-service-account-credentials-password:
+ required: false
+ encrypted-ios-service-account-credentials-password:
+ required: false
+ encrypted-ios-matchfile-password:
+ required: false
+ target:
+ description: "Build target: {Android, iOS}"
+ required: false
+ default: 'Android'
+
+runs:
+ using: "composite"
+ steps:
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: '3.19.x'
+ channel: 'stable'
+ cache: true
+
+ # Get flutter dependencies.
+ - name: Get flutter dependencies
+ shell: bash
+ run: flutter pub get
+
+ - name: Install Android dependencies
+ if: ${{ inputs.target == 'Android' }}
+ uses: actions/setup-java@v4
+ with:
+ distribution: 'temurin'
+ java-version: '17'
+
+ - name: Install iOS dependencies
+ if: ${{ inputs.target == 'iOS' }}
+ shell: bash
+ run: |
+ cd ios
+ pod update
+
+ - name: Commit pod updates
+ if: ${{ inputs.target == 'iOS' }}
+ id: commit_pod_versions
+ uses: stefanzweifel/git-auto-commit-action@v5
+ with:
+ file_pattern: "ios/*"
+ commit_user_name: github-actions[bot]
+ commit_user_email: 41898282+github-actions[bot]@users.noreply.github.com
+ commit_message: "[BOT] Applying pod update."
+ add_options: '-u'
+
+ # Fail workflow, because new commit will execute workflow
+ - if: ${{ inputs.target == 'iOS' && steps.commit_pod_versions.outputs.changes_detected == 'true' }}
+ name: Fail workflow if pod version change
+ shell: bash
+ run: |
+ echo 'Pod update applied, running bot commit workflow'
+ exit 1
+
+ - name: Run flutter doctor
+ shell: bash
+ run: flutter doctor
+
+ - name: Decrypt SignETS certificate and Google Services files
+ shell: bash
+ run: |
+ chmod +x ./scripts/decrypt.sh
+ ./scripts/decrypt.sh
+ env:
+ ENCRYPTED_SIGNETS_API_CERT_PASSWORD: ${{ inputs.encrypted-signets-api-cert-password }}
+ ENCRYPTED_GOOGLE_SERVICE_PASSWORD: ${{ inputs.encrypted-google-service-password }}
+ ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD: ${{ inputs.encrypted-etsmobile-keystore-password }}
+ ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD: ${{ inputs.encrypted-keystore-properties-password }}
+ ENCRYPTED_ANDROID_SERVICE_ACCOUNT_CREDENTIALS_PASSWORD: ${{ inputs.encrypted-android-service-account-credentials-password }}
+ ENCRYPTED_IOS_SERVICE_ACCOUNT_CREDENTIALS_PASSWORD: ${{ inputs.encrypted-ios-service-account-credentials-password }}
+ ENCRYPTED_IOS_MATCHFILE_PASSWORD: ${{ inputs.encrypted-ios-matchfile-password }}
diff --git a/.github/composite/tag-validation/action.yaml b/.github/composite/tag-validation/action.yaml
new file mode 100644
index 000000000..ce9c05c71
--- /dev/null
+++ b/.github/composite/tag-validation/action.yaml
@@ -0,0 +1,31 @@
+name: "Tag validation"
+description: "Check if the tag already exists."
+outputs:
+ description: "The version in the pubspec.yaml file."
+ version: ${{ steps.split.outputs._0 }}
+
+runs:
+ using: "composite"
+ steps:
+ - name: Get the version from the pubspec
+ id: pubspecVersion
+ uses: CumulusDS/get-yaml-paths-action@v1.0.2
+ with:
+ file: pubspec.yaml
+ version: version
+ - uses: winterjung/split@v2.1.0
+ id: split
+ with:
+ msg: ${{ steps.pubspecVersion.outputs.version }}
+ separator: '+'
+ - name: Validate that version doesn't exists
+ uses: mukunku/tag-exists-action@v1.6.0
+ id: checkTag
+ with:
+ tag: ${{ steps.split.outputs._0 }}
+ - if: ${{ steps.checkTag.outputs.exists == 'true' }}
+ name: Post comment on PR and fail.
+ shell: bash
+ run: |
+ echo '${{ steps.split.outputs._0 }} already exists, please update the pubspec version.'
+ exit 1
diff --git a/.github/composite/tests/action.yaml b/.github/composite/tests/action.yaml
new file mode 100644
index 000000000..663ac0576
--- /dev/null
+++ b/.github/composite/tests/action.yaml
@@ -0,0 +1,61 @@
+name: "Tests and checks"
+inputs:
+ format:
+ description: "If the project needs formatting"
+ required: false
+ default: true
+
+runs:
+ using: "composite"
+ steps:
+ - name: Generate mocking files
+ shell: bash
+ run: dart run build_runner build
+
+ # Check the format of the code and commit the formatted files.
+ - name: Format files in lib and test directories
+ if: ${{ inputs.format == true }}
+ shell: bash
+ run: dart format lib test
+
+ - name: Commit formatted files
+ if: ${{ inputs.format == true }}
+ id: commit_formatted
+ uses: stefanzweifel/git-auto-commit-action@v5
+ with:
+ file_pattern: "*.dart"
+ commit_user_name: github-actions[bot]
+ commit_user_email: 41898282+github-actions[bot]@users.noreply.github.com
+ commit_message: "[BOT] Applying format."
+ add_options: '-u'
+
+ # Fail workflow, because new commit will execute workflow
+ - if: ${{ inputs.format == true && steps.commit_formatted.outputs.changes_detected == 'true' }}
+ name: Fail workflow if linting commit
+ shell: bash
+ run: |
+ echo 'Linting applied, running bot commit workflow'
+ exit 1
+
+ # Check if the code has any errors/warnings
+ - name: Analyze code
+ shell: bash
+ run: flutter analyze
+
+ - name: Run tests
+ shell: bash
+ run: flutter test --coverage
+
+ - name: Upload coverage file
+ uses: actions/upload-artifact@v4
+ with:
+ name: lcov.info
+ path: ${{ github.workspace }}/coverage/lcov.info
+
+ - name: Get code coverage
+ shell: bash
+ run: |
+ chmod +x ./scripts/determine_code_coverage.sh
+ export COV="$(./scripts/determine_code_coverage.sh coverage/lcov.info)"
+ echo "Coverage detected is: $COV"
+ echo "percentage=$COV" >> $GITHUB_OUTPUT
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 84ebc8f7c..2289c92a1 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -16,7 +16,6 @@
- [ ] If it is a core feature, I have added thorough tests.
- [ ] If needed, I added analytics.
- [ ] Make sure to add either one of the following labels: `version: Major`,`version: Minor` or `version: Patch`.
-- [ ] Make sure golden files changes were reviewed and approved.
### 🖼️ Screenshots (if useful):
diff --git a/.github/workflows/dev-workflow.yaml b/.github/workflows/dev-workflow.yaml
index af34a7af6..784bd0389 100644
--- a/.github/workflows/dev-workflow.yaml
+++ b/.github/workflows/dev-workflow.yaml
@@ -15,104 +15,25 @@ concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- MAPS_API_KEY: ${{ secrets.MAPS_API_KEY }}
APP_NAME: 'notre_dame'
jobs:
- ##############################################################
- # Testing
- ##############################################################
testing:
name: Tests and checks
runs-on: ubuntu-latest
- outputs:
- coverage: ${{ steps.coverage.outputs.percentage }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
token: ${{ secrets.PTA }}
- - uses: actions/setup-java@v4
+ - uses: ./.github/composite/flutter-setup
with:
- distribution: 'temurin'
- java-version: '17'
- - uses: subosito/flutter-action@v2
- with:
- flutter-version: '3.19.x'
- channel: 'stable'
- cache: true
- - run: flutter doctor
- - name: Decrypt SignETS certificate and Google Services files
- run: |
- chmod +x ./scripts/decrypt.sh
- ./scripts/decrypt.sh
- env:
- ENCRYPTED_SIGNETS_API_CERT_PASSWORD: ${{ secrets.ENCRYPTED_SIGNETS_API_CERT_PASSWORD }}
- ENCRYPTED_GOOGLE_SERVICE_PASSWORD: ${{ secrets.ENCRYPTED_GOOGLE_SERVICE_PASSWORD }}
-
- # Get flutter dependencies.
- - run: |
- flutter pub get
- dart run build_runner build --delete-conflicting-outputs
-
- # Check the format of the code and commit the formatted files.
- - name: Format files in lib and test directories
- run: dart format lib test
- - name: Commit formatted files
- id: commit_formatted
- uses: stefanzweifel/git-auto-commit-action@v5
- with:
- file_pattern: "*.dart"
- commit_user_name: github-actions[bot]
- commit_user_email: 41898282+github-actions[bot]@users.noreply.github.com
- commit_message: "[BOT] Applying format."
- add_options: '-u'
-
- # Fail workflow, because new commit will execute workflow
- - if: ${{ steps.commit_formatted.outputs.changes_detected == 'true' }}
- name: Fail workflow if linting commit
- run: |
- echo 'Linting applied, running bot commit workflow'
- exit 1
-
- # Check if the code has any errors/warnings
- - name: Analyze code
- run: flutter analyze
+ encrypted-signets-api-cert-password: ${{ secrets.ENCRYPTED_SIGNETS_API_CERT_PASSWORD }}
+ encrypted-google-service-password: ${{ secrets.ENCRYPTED_GOOGLE_SERVICE_PASSWORD }}
+ encrypted-etsmobile-keystore-password: ${{ secrets.ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD }}
+ encrypted-keystore-properties-password: ${{ secrets.ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD }}
+ - uses: ./.github/composite/tests
- # Run the tests with --update-goldens.
- - name: Run tests
- run: flutter test --coverage --update-goldens
-
- # Commit and push the goldens files updated.
- - name: Commit golden files
- id: commit_golden
- uses: stefanzweifel/git-auto-commit-action@v5
- with:
- file_pattern: test/*
- commit_user_name: github-actions[bot]
- commit_user_email: 41898282+github-actions[bot]@users.noreply.github.com
- commit_message: '[BOT] Update golden files'
-
- # Fail workflow, because new commit will execute workflow
- - if: ${{ steps.commit_golden.outputs.changes_detected == 'true' }}
- name: Fail workflow if golden commit
- run: |
- echo 'Golden files changes commit, running bot commit workflow'
- exit 1
-
- - name: Upload coverage file
- uses: actions/upload-artifact@v4
- with:
- name: lcov.info
- path: ${{ github.workspace }}/coverage/lcov.info
- - name: Get code coverage
- id: coverage
- run: |
- chmod +x ./scripts/determine_code_coverage.sh
- export COV="$(./scripts/determine_code_coverage.sh coverage/lcov.info)"
- echo "Coverage detected is: $COV"
- echo "percentage=$COV" >> $GITHUB_OUTPUT
coverage:
name: Update coverage
needs:
@@ -123,16 +44,12 @@ jobs:
uses: actions/download-artifact@v4
with:
name: lcov.info
- # Comment coverage report
- name: Comment the coverage of the PR
uses: romeovs/lcov-reporter-action@v0.4.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
lcov-file: ./lcov.info
- ##############################################################
- # Build
- ##############################################################
build:
name: Create ${{ matrix.target }} build
runs-on: ${{ matrix.os }}
@@ -160,78 +77,25 @@ jobs:
- testing
steps:
- uses: actions/checkout@v4
- - uses: subosito/flutter-action@v2
- with:
- flutter-version: '3.19.x'
- channel: 'stable'
- cache: true
- - name: Install Android dependencies
- if: matrix.target == 'Android'
- uses: actions/setup-java@v4
with:
- java-version: '17'
- distribution: 'temurin'
- - run: flutter doctor -v
- - name: Install iOS dependencies
- if: matrix.target == 'iOS'
- run: |
- flutter pub get
- dart run build_runner build --delete-conflicting-outputs
- cd ios
- pod update
- flutter clean
-
- - name: Commit pod updates
- if: matrix.target == 'iOS'
- id: commit_pod_versions
- uses: stefanzweifel/git-auto-commit-action@v5
+ ref: ${{ github.head_ref }}
+ token: ${{ secrets.PTA }}
+ - uses: ./.github/composite/flutter-setup
with:
- file_pattern: "ios/*"
- commit_user_name: github-actions[bot]
- commit_user_email: 41898282+github-actions[bot]@users.noreply.github.com
- commit_message: "[BOT] Applying pod update."
- add_options: '-u'
-
- # Fail workflow, because new commit will execute workflow
- - if: ${{ matrix.target == 'iOS' && steps.commit_pod_versions.outputs.changes_detected == 'true' }}
- name: Fail workflow if pod version change
- run: |
- echo 'Pod update applied, running bot commit workflow'
- exit 1
-
- # Get dependencies and decrypt needed files.
- - run: |
- flutter pub get
- dart run build_runner build --delete-conflicting-outputs
+ encrypted-signets-api-cert-password: ${{ secrets.ENCRYPTED_SIGNETS_API_CERT_PASSWORD }}
+ encrypted-google-service-password: ${{ secrets.ENCRYPTED_GOOGLE_SERVICE_PASSWORD }}
+ encrypted-etsmobile-keystore-password: ${{ secrets.ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD }}
+ encrypted-keystore-properties-password: ${{ secrets.ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD }}
+ target: ${{ matrix.target }}
- - name: Decrypt SignETS certificate and Google Services files
- run: |
- chmod +x ./scripts/decrypt.sh
- ./scripts/decrypt.sh
- env:
- ENCRYPTED_SIGNETS_API_CERT_PASSWORD: ${{ secrets.ENCRYPTED_SIGNETS_API_CERT_PASSWORD }}
- ENCRYPTED_GOOGLE_SERVICE_PASSWORD: ${{ secrets.ENCRYPTED_GOOGLE_SERVICE_PASSWORD }}
- ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD: ${{ secrets.ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD }}
- ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD: ${{ secrets.ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD }}
-
- # Build the application.
- - name: Build the application
- run: flutter build -v ${{ matrix.build_target }} ${{ matrix.build_args }} --release --dart-define=GH_API_TOKEN=${{ secrets.GH_API_TOKEN }}
-
- - name: Rename Android build
- if: matrix.target == 'Android'
- run: mv app-release.${{ matrix.asset_extension }} ${{ github.workspace }}/${{ env.APP_NAME }}_${{ matrix.target }}.${{ matrix.asset_extension }}
- working-directory: ${{ matrix.build_path }}
-
- - name: Compress iOS build
- if: matrix.target == 'iOS'
- run: |
- mv Runner.app ${{ env.APP_NAME }}.app
- ditto -c -k --sequesterRsrc --keepParent ${{ env.APP_NAME }}.app ${{ github.workspace }}/${{ env.APP_NAME }}_${{ matrix.target }}.${{ matrix.asset_extension }}
- working-directory: ${{ matrix.build_path }}
-
- - name: Upload build artifact
- uses: actions/upload-artifact@v4
+ - uses: ./.github/composite/ci-build
with:
- name: ${{ matrix.target }}
- path: ${{ github.workspace }}/${{ env.APP_NAME }}_${{ matrix.target }}.${{ matrix.asset_extension }}
+ target: ${{ matrix.target }}
+ build-target: ${{ matrix.build_target }}
+ build-args: ${{ matrix.build_args }}
+ build-path: ${{ matrix.build_path }}
+ asset-extension: ${{ matrix.asset_extension }}
+ asset-content-type: ${{ matrix.asset_content_type }}
+ github-api-token: ${{ secrets.GH_API_TOKEN }}
+ app-name: ${{ env.APP_NAME }}
+
diff --git a/.github/workflows/master-workflow.yaml b/.github/workflows/master-workflow.yaml
index 4eb6e5aad..b08ef65a6 100644
--- a/.github/workflows/master-workflow.yaml
+++ b/.github/workflows/master-workflow.yaml
@@ -17,8 +17,6 @@ concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- MAPS_API_KEY: ${{ secrets.MAPS_API_KEY }}
APP_NAME: 'notre_dame'
jobs:
@@ -26,37 +24,15 @@ jobs:
# Setup
##############################################################
tag_validation:
- name: Tag validation
runs-on: ubuntu-latest
outputs:
- version: ${{ steps.split.outputs._0 }}
+ description: "The version in the pubspec.yaml file."
+ version: ${{ steps.tag_validation.outputs.version }}
steps:
- uses: actions/checkout@v4
- - name: Get the version from the pubspec
- id: pubspecVersion
- uses: CumulusDS/get-yaml-paths-action@v1.0.2
- with:
- file: pubspec.yaml
- version: version
- - uses: winterjung/split@v2.1.0
- id: split
- with:
- msg: ${{ steps.pubspecVersion.outputs.version }}
- separator: '+'
- - name: Validate that version doesn't exists
- uses: mukunku/tag-exists-action@v1.6.0
- id: checkTag
- with:
- tag: ${{ steps.split.outputs._0 }}
- - if: ${{ steps.checkTag.outputs.exists == 'true' }}
- name: Post comment on PR and fail.
- run: |
- echo '${{ steps.split.outputs._0 }} already exists, please update the pubspec version.'
- exit 1
+ - uses: ./.github/composite/tag-validation
+ id: tag_validation
- ##############################################################
- # Tests
- ##############################################################
testing:
name: Tests and checks
runs-on: ubuntu-latest
@@ -64,53 +40,15 @@ jobs:
coverage: ${{ steps.coverage.outputs.percentage }}
steps:
- uses: actions/checkout@v4
+ - uses: ./.github/composite/flutter-setup
with:
- ref: ${{ github.head_ref }}
- - uses: actions/setup-java@v4
- with:
- distribution: 'temurin'
- java-version: '17'
- - uses: subosito/flutter-action@v2
- with:
- flutter-version: '3.19.x'
- channel: 'stable'
- cache: true
- - run: flutter doctor
- - name: Decrypt SignETS certificate and Google Services files
- run: |
- chmod +x ./scripts/decrypt.sh
- ./scripts/decrypt.sh
- env:
- ENCRYPTED_SIGNETS_API_CERT_PASSWORD: ${{ secrets.ENCRYPTED_SIGNETS_API_CERT_PASSWORD }}
- ENCRYPTED_GOOGLE_SERVICE_PASSWORD: ${{ secrets.ENCRYPTED_GOOGLE_SERVICE_PASSWORD }}
-
- # Get flutter dependencies.
- - run : |
- flutter pub get
- dart run build_runner build --delete-conflicting-outputs
-
- # Check if the code has any errors/warnings
- - name: Analyze code
- run: flutter analyze
-
- # Run the tests.
- - name: Run tests
- run: flutter test --coverage
-
- - name: Upload coverage file
- uses: actions/upload-artifact@v4
+ encrypted-signets-api-cert-password: ${{ secrets.ENCRYPTED_SIGNETS_API_CERT_PASSWORD }}
+ encrypted-google-service-password: ${{ secrets.ENCRYPTED_GOOGLE_SERVICE_PASSWORD }}
+ encrypted-etsmobile-keystore-password: ${{ secrets.ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD }}
+ encrypted-keystore-properties-password: ${{ secrets.ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD }}
+ - uses: ./.github/composite/tests
with:
- name: lcov.info
- path: ${{ github.workspace }}/coverage/lcov.info
-
- - name: Get code coverage
- id: coverage
- run: |
- chmod +x ./scripts/determine_code_coverage.sh
- export COV="$(./scripts/determine_code_coverage.sh coverage/lcov.info)"
- echo "Coverage detected is: $COV"
- echo "percentage=$COV" >> $GITHUB_OUTPUT
-
+ format: false
coverage:
name: Update coverage
needs:
@@ -162,63 +100,24 @@ jobs:
- testing
steps:
- uses: actions/checkout@v4
- - uses: subosito/flutter-action@v2
+ - uses: ./.github/composite/flutter-setup
with:
- flutter-version: '3.19.x'
- channel: 'stable'
- cache: true
- - name: Install Android dependencies
- if: matrix.target == 'Android'
- uses: actions/setup-java@v4
- with:
- java-version: '17'
- distribution: 'temurin'
- - run: flutter doctor -v
- - name: Install iOS dependencies
- if: matrix.target == 'iOS'
- run: |
- flutter pub get
- dart run build_runner build --delete-conflicting-outputs
- cd ios
- pod install
- flutter clean
-
- # Get dependencies and decrypt needed files.
- - run: |
- flutter pub get
- dart run build_runner build --delete-conflicting-outputs
-
- - name: Decrypt SignETS certificate and Google Services files
- run: |
- chmod +x ./scripts/decrypt.sh
- ./scripts/decrypt.sh
- env:
- ENCRYPTED_SIGNETS_API_CERT_PASSWORD: ${{ secrets.ENCRYPTED_SIGNETS_API_CERT_PASSWORD }}
- ENCRYPTED_GOOGLE_SERVICE_PASSWORD: ${{ secrets.ENCRYPTED_GOOGLE_SERVICE_PASSWORD }}
- ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD: ${{ secrets.ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD }}
- ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD: ${{ secrets.ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD }}
-
- # Build the application.
- - name: Build the application
- run: flutter build -v ${{ matrix.build_target }} ${{ matrix.build_args }} --release --dart-define=GH_API_TOKEN=${{ secrets.GH_API_TOKEN }}
-
- - name: Rename Android build
- if: matrix.target == 'Android'
- run: mv app-release.${{ matrix.asset_extension }} ${{ github.workspace }}/${{ env.APP_NAME }}_${{ matrix.target }}.${{ matrix.asset_extension }}
- working-directory: ${{ matrix.build_path }}
-
- - name: Compress iOS build
- if: matrix.target == 'iOS'
- run: |
- mv Runner.app ${{ env.APP_NAME }}.app
- ditto -c -k --sequesterRsrc --keepParent ${{ env.APP_NAME }}.app ${{ github.workspace }}/${{ env.APP_NAME }}_${{ matrix.target }}.${{ matrix.asset_extension }}
- working-directory: ${{ matrix.build_path }}
+ encrypted-signets-api-cert-password: ${{ secrets.ENCRYPTED_SIGNETS_API_CERT_PASSWORD }}
+ encrypted-google-service-password: ${{ secrets.ENCRYPTED_GOOGLE_SERVICE_PASSWORD }}
+ encrypted-etsmobile-keystore-password: ${{ secrets.ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD }}
+ encrypted-keystore-properties-password: ${{ secrets.ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD }}
+ target: ${{ matrix.target }}
- - name: Upload build artifact
- uses: actions/upload-artifact@v4
+ - uses: ./.github/composite/ci-build
with:
- name: ${{ matrix.target }}
- path: ${{ github.workspace }}/${{ env.APP_NAME }}_${{ matrix.target }}.${{ matrix.asset_extension }}
+ target: ${{ matrix.target }}
+ build-target: ${{ matrix.build_target }}
+ build-args: ${{ matrix.build_args }}
+ build-path: ${{ matrix.build_path }}
+ asset-extension: ${{ matrix.asset_extension }}
+ asset-content-type: ${{ matrix.asset_content_type }}
+ github-api-token: ${{ secrets.GH_API_TOKEN }}
+ app-name: ${{ env.APP_NAME }}
##############################################################
# Post-build
diff --git a/.github/workflows/release-workflow.yaml b/.github/workflows/release-workflow.yaml
index 4388b6e0b..0608a7e23 100644
--- a/.github/workflows/release-workflow.yaml
+++ b/.github/workflows/release-workflow.yaml
@@ -28,50 +28,16 @@ jobs:
fail-fast: false
steps:
- uses: actions/checkout@v4
- - uses: subosito/flutter-action@v2
- with:
- flutter-version: '3.19.x'
- channel: 'stable'
- cache: true
- - name: Setup Fastlane
- uses: ruby/setup-ruby@v1
- with:
- ruby-version: '2.7'
- bundler-cache: true
- working-directory: ${{ matrix.working_directory }}
- - name: Install Android dependencies
- if: matrix.target == 'Android'
- uses: actions/setup-java@v4
- with:
- java-version: '17'
- distribution: 'adopt'
- - name: Install iOS dependencies
- if: matrix.target == 'iOS'
- run: |
- flutter pub get
- dart run build_runner build --delete-conflicting-outputs
- cd ios
- pod install
- flutter clean
- - run: flutter doctor -v
-
- # Get dependencies and decrypt needed files.
- - run: |
- flutter pub get
- dart run build_runner build --delete-conflicting-outputs
-
- - name: Decrypt certificates files
- run: |
- chmod +x ./scripts/decrypt.sh
- ./scripts/decrypt.sh
+ - uses: ./.github/composite/flutter-setup
env:
- ENCRYPTED_SIGNETS_API_CERT_PASSWORD: ${{ secrets.ENCRYPTED_SIGNETS_API_CERT_PASSWORD }}
- ENCRYPTED_GOOGLE_SERVICE_PASSWORD: ${{ secrets.ENCRYPTED_GOOGLE_SERVICE_PASSWORD }}
- ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD: ${{ secrets.ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD }}
- ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD: ${{ secrets.ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD }}
- ENCRYPTED_ANDROID_SERVICE_ACCOUNT_CREDENTIALS_PASSWORD: ${{ secrets.ENCRYPTED_ANDROID_SERVICE_ACCOUNT_CREDENTIALS_PASSWORD }}
- ENCRYPTED_IOS_SERVICE_ACCOUNT_CREDENTIALS_PASSWORD: ${{ secrets.ENCRYPTED_IOS_SERVICE_ACCOUNT_CREDENTIALS_PASSWORD }}
- ENCRYPTED_IOS_MATCHFILE_PASSWORD: ${{ secrets.ENCRYPTED_IOS_MATCHFILE_PASSWORD }}
+ encrypted-signets-api-cert-password: ${{ secrets.ENCRYPTED_SIGNETS_API_CERT_PASSWORD }}
+ encrypted-google-service-password: ${{ secrets.ENCRYPTED_GOOGLE_SERVICE_PASSWORD }}
+ encrypted-etsmobile-keystore-password: ${{ secrets.ENCRYPTED_ETSMOBILE_KEYSTORE_PASSWORD }}
+ encrypted-keystore-properties-password: ${{ secrets.ENCRYPTED_KEYSTORE_PROPERTIES_PASSWORD }}
+ encrypted-android-service-account-credentials-password: ${{ secrets.ENCRYPTED_ANDROID_SERVICE_ACCOUNT_CREDENTIALS_PASSWORD }}
+ encrypted-ios-service-account-credentials-password: ${{ secrets.ENCRYPTED_IOS_SERVICE_ACCOUNT_CREDENTIALS_PASSWORD }}
+ encrypted-ios-matchfile-password: ${{ secrets.ENCRYPTED_IOS_MATCHFILE_PASSWORD }}
+ target: ${{ matrix.target }}
- name: Build the application
run: flutter build -v ${{ matrix.build_target }} ${{ matrix.build_args }} --build-number=$(date '+%s') --release --dart-define=GH_API_TOKEN=${{ secrets.GH_API_TOKEN }}
@@ -81,22 +47,20 @@ jobs:
- name: Set changelog for each platform
run: |
echo "${{ github.event.release.body }}" > releaseBody.txt
- enChangelog=$(cat releaseBody.txt | sed -n '/## English version$/,/## End english version/p' | sed '1d;$d');
- frChangelog=$(cat releaseBody.txt | sed -n '/## French version$/,/## End french version/p' | sed '1d;$d');
+ enChangelog=$(sed -n '/## English version$/,/## End english version/p' releaseBody.txt | sed '1d;$d')
+ frChangelog=$(sed -n '/## French version$/,/## End french version/p' releaseBody.txt | sed '1d;$d')
- if [[ ! -z "$enChangelog" ]]; then
+ if [[ -n "$enChangelog" ]]; then
echo "Changing english changelog"
- echo $enChangelog > ${{ matrix.metadata_path }}/en-CA/${{ matrix.changelog_path }}
+ echo "$enChangelog" > ${{ matrix.metadata_path }}/en-CA/${{ matrix.changelog_path }}
echo "en-CA Changelog file cat:"
cat ${{ matrix.metadata_path }}/en-CA/${{ matrix.changelog_path }}
- echo ${{ matrix.metadata_path }}/en-CA/${{ matrix.changelog_path }}
fi
- if [[ ! -z "$frChangelog" ]]; then
+ if [[ -n "$frChangelog" ]]; then
echo "Changing english changelog"
- echo $frChangelog > ${{ matrix.metadata_path }}/fr-CA/${{ matrix.changelog_path }}
+ echo "$frChangelog" > ${{ matrix.metadata_path }}/fr-CA/${{ matrix.changelog_path }}
echo "fr-CA Changelog file cat:"
cat ${{ matrix.metadata_path }}/fr-CA/${{ matrix.changelog_path }}
- echo ${{ matrix.metadata_path }}/en-CA/${{ matrix.changelog_path }}
fi
working-directory: ${{ matrix.working_directory }}
@@ -121,6 +85,13 @@ jobs:
env:
PRIVATE_KEY: ${{ secrets.MATCH_GIT_SSH_KEY }}
+ - name: Setup Fastlane
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: '2.7'
+ bundler-cache: true
+ working-directory: ${{ matrix.working_directory }}
+
- name: Deploy to store
run: bundle exec fastlane deploy
working-directory: ${{ matrix.working_directory }}
diff --git a/.gitignore b/.gitignore
index a12547a23..98ca2c50a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,7 +18,7 @@ app_untranslated_messages.yaml
# Flutter test
test/**/failures/
-test/mock/**/*.mocks.dart
+*.mocks.dart
# Certificates and secrets
assets/certificates/
diff --git a/README.fr.md b/README.fr.md
index 54a3d414a..64871d137 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -19,8 +19,8 @@
Ce projet concrétise la quatrième version de l'application mobile ÉTSMobile pour Android et iOS. Il s'agit de portail principal entre l'utilisateur et l'École de technologie supérieure (ÉTS) sur appareils mobiles. ÉTSMobile est un projet open-source développé par les membres du club étudiant ApplETS. L'application offre notamment :
* L'accès aux notes d'évaluations
-* L'accès aux horaires de cours
-* Et bien plus...
+* L'accès aux horaires de cours
+* Et bien plus...
_Note: Ce guide est aussi disponible en: [English](https://github.com/ApplETS/Notre-Dame/blob/master/README.md)_
@@ -52,7 +52,7 @@ chmod +x ./env_variables.sh
flutter pub get
```
-- Pour généré les mocks:
+- Pour générer les mocks:
```bash
dart run build_runner build
```
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 54fa1f2db..a5c4862f8 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -9,4 +9,4 @@ linter:
analyzer:
exclude:
- "lib/generated"
- - "test/mock/services/*.mocks.dart"
+ - "*.mocks.dart"
diff --git a/assets/html/armed_person_detail_en.html b/assets/html/armed_person_detail_en.html
deleted file mode 100644
index 5a6330e7d..000000000
--- a/assets/html/armed_person_detail_en.html
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
If you can leave the premises without putting yourself in danger, evacuate the building
-
-
- - Remain calm.
- - Never try to stop an armed person.
- - Do not activate the fire alarm.
- - Take the nearest emergency exit.
- - Use the stairs to exit the building. Don’t take the elevator.
- - Show your hands so that police officers don’t see you as a threat.
- - Inform anyone you meet that they should leave the premises immediately.
- - Once you leave the building, don’t stay in close range. Go to the meeting point that
- is a little further away, at the corner of Peel and St. Jacques Streets (the space in front
- of the old Planetarium).
-
- - Once you’ve reached safety, call 911.
-
-
-If you cannot safely leave the premises without putting yourself in danger, hide
-
-
- - Stay calm and silent.
- - Hide and tell other people to do the same.
- - Lock the door of the room where you’re hiding.
- - Barricade the door with furniture.
- - Close the blinds on the windows.
- - Stay away from doors and windows (hallways and outdoor walls).
- - If there is a window that looks out on an external wall of the building, let police know you
- are there by putting a note in the window.
-
- - Hide under a desk.
- - Stay quiet.
- - Put your cell phone in silent mode.
- - If someone knocks at the door, don’t open it. The person who is knocking may pose a
- threat to you.
-
- - In the event that police officers need to check the premises, they will receive access cards
- and sets of keys.
-
- - Never jump out of your hiding place, and keep your hands in plain sight.
- - Wait for directions from police officers or the Security and Prevention Office before
- leaving the premises.
-
-
-
-In the event of an evacuation
-
-
- - Go to the meeting point that is a little further away, at the corner of Peel and St. Jacques
- Streets (the space in front of the old Planetarium).
-
- - Never stay close to the building.
- - Keep quiet so you can hear directions given by police or security officers.
-
-
-Remember…
-
-
- - Never jump out of your hiding place.
- - Keep your hands in plain sight.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/armed_person_detail_fr.html b/assets/html/armed_person_detail_fr.html
deleted file mode 100644
index 03b86d68a..000000000
--- a/assets/html/armed_person_detail_fr.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-Si vous pouvez quitter les lieux sans ĂŞtre menacĂ©, Ă©vacuez l’Ă©difice
-
-
- - Restez calme;
- - Ne tentez jamais d’arrĂŞter une personne armĂ©e;
- - N’activez pas l’alarme-incendie;
- - Empruntez la sortie de secours la plus près;
- - Utilisez les escaliers pour sortir du bâtiment (n’utilisez jamais les ascenseurs);
-
- - Montrez vos mains afin de ne pas être perçu comme une menace par les policiers;
- - Informez les gens que vous croisez de quitter les lieux immédiatement;
- - Une fois que vous avez quittĂ© l’Ă©difice, ne restez pas Ă proximitĂ© de l’immeuble;
- rendez-vous au point de rassemblement éloigné, qui se trouve au coin des rue Peel et
- St-Jacques (l’espace devant l’ancien planĂ©tarium);
-
- - Une fois en sécurité, composez le 911.
-
-
-Si vous ne pouvez pas quitter les lieux sans être menacé, confinez-vous
-
-
- - Restez calme et silencieux;
- - Cachez-vous et dites aux gens de faire comme vous;
- - Verrouillez la porte du local où vous êtes caché;
- - Barricadez la porte avec des meubles;
- - Fermez les stores des fenĂŞtres;
- - Éloignez-vous de la porte et des fenêtres (corridors et murs extérieurs);
- - Si une fenêtre donne sur un mur extérieur du bâtiment, signalez votre présence aux policiers
- en mettant un papier avec une note;
-
- - Cachez-vous sous un bureau;
- - Gardez le silence;
- - Mettez votre cellulaire en mode silencieux;
- - Si une personne frappe Ă la porte, ne l’ouvrez pas. La personne qui frappe Ă la porte
- représente peut-être une menace;
-
- - Dans l’Ă©ventualitĂ© oĂą les policiers auront Ă vĂ©rifier tous les locaux, ces derniers
- recevront des cartes d’accès et des trousseaux de clefs;
-
- - Ne bondissez jamais de votre cachette et gardez les mains bien en vue;
- - Attendez les directives des policiers ou du Bureau de la prévention et de la sécurité avant
- de quitter les lieux.
-
-
-
-Dans l’Ă©ventualitĂ© d’une Ă©vacuation
-
-
- - Rendez-vous au lieu de rassemblement Ă©loignĂ© (l’espace devant l’ancien
- PlanĂ©tarium) situĂ© Ă l’angle des rues Peel et St-Jacques;
-
- - Ne demeurez jamais Ă proximitĂ© de l’immeuble;
- - Gardez le silence pour entendre les directives données par les policiers ou par la
- sécurité.
-
-
-
-Rappelez-vous
-
-
- - Ne bondissez jamais de votre cachette;
- - Gardez vos mains bien en vue.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/bomb_threat_detail_en.html b/assets/html/bomb_threat_detail_en.html
deleted file mode 100644
index 385f59e73..000000000
--- a/assets/html/bomb_threat_detail_en.html
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-If the bomb threat is made by phone:
-
-
- - Don’t hang up.
- - Let the caller hang up first.
- - Try to get as much information as possible.
- - Get the person to repeat him- or herself, or pretend you can’t hear to buy
- time.
-
- - Pay special attention to the following elements:
-
- - Gender
- - Age
- - Accent, language spoken
- - Tone of voice (high or low)
- - Speech rhythm and emotions (angry, calm, agitated)
- - Background noises
-
-
- - Depending on the situation and what is possible, try to obtain the following information:
-
- - The time at which the bomb will go off
- - The type of bomb
- - The people being targeted and the reason
- - The location of the bomb
- - The name and number on the phone’s Caller ID
-
-
- - Contact Security at extension 55 (internal phone system) to alert them to the situation and
- share relevant information.
-
- - Security may then ask you to come to the Security Operations Centre, located at the entrance
- of Pavilion A.
-
-
-
-Evacuation
-
-
- - Wait until Security orders evacuation. Security officers must inspect evacuation routes to
- ensure that there is no danger (suspicious packages).
-
- - Stay calm.
- - Dress according to the outdoor temperature, but don’t make a detour to get clothing
- (for example, don’t go to your locker).
-
- - Evacuate the area via the closest emergency staircase. Don’t take the
- elevator.
-
- - Keep a safe distance from the building.
- - Go to the designated meeting point.
- - Do not go back inside for any reason.
-
-
-Returning to the building
-
-
- - You can return to the building as soon as Security announces that it is safe to do so.
- - This authorization will be announced over a megaphone at the meeting point.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/bomb_threat_detail_fr.html b/assets/html/bomb_threat_detail_fr.html
deleted file mode 100644
index 5c13cfd1d..000000000
--- a/assets/html/bomb_threat_detail_fr.html
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-Si la menace est transmise par téléphone
-
-
- - Ne mettez pas fin Ă la communication;
- - Laissez l’interlocuteur raccrocher en premier;
- - Tentez d’obtenir le maximum de renseignements;
- - Faites rĂ©pĂ©ter la personne ou prĂ©textez avoir de la difficultĂ© Ă l’entendre afin de
- gagner du temps;
-
- - Portez une attention particulière aux éléments suivants :
-
- - Sexe
- - Ă‚ge
- - Accent, langue parlée
- - Tonalité de la voix (aiguë ou grave)
- - Débit et émotions (fâché, calme, agité)
- - Bruits dans l’environnement
-
-
-
-
- - Dans la mesure du possible et en fonction de la situation, tentez d’obtenir les
- renseignements suivants :
-
- - L’heure Ă laquelle la bombe explosera
- - Le type de bombe
- - Les personnes visées et le motif
- - L’emplacement de la bombe
- - Le nom et le numĂ©ro qui apparaissent sur l’afficheur du tĂ©lĂ©phone
-
-
-
-
- - Communiquez avec la Sécurité au poste 55 (système téléphonique interne) pour signaler
- la situation et transmettre les renseignements pertinents;
-
- - La Sécurité pourrait ensuite vous demander de vous rendre au centre des opérations de la
- sĂ©curitĂ©, situĂ©e Ă l’entrĂ©e du Pavillon A.
-
-
-
-Évacuation
-
-
- - Attendez que la SĂ©curitĂ© ordonne l’Ă©vacuation. Celle-ci doit inspecter les voies d’Ă©vacuation
- pour s’assurer qu’il n’y a pas de danger (colis suspect);
-
- - Restez calme;
- - Habillez-vous en fonction de la température extérieure, mais ne faites pas de détour
- pour rĂ©cupĂ©rer vos vĂŞtements (par exemple : n’allez pas Ă votre casier);
-
- - Évacuez l’endroit par les escaliers de secours les plus près. N’utilisez pas les ascenseurs;
- - Éloignez-vous de l’immeuble;
- - Dirigez-vous vers le lieu de rassemblement;
- - Ne retournez sous aucun prĂ©texte Ă l’intĂ©rieur.
-
-
-Retour dans l’immeuble
-
-
- - Le retour dans l’immeuble se fera dès que la SĂ©curitĂ© l’autorisera;
- - Cette autorisation sera communiquĂ©e au moyen d’un porte-voix au lieu de
- rassemblement.
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/broken_elevator_detail_en.html b/assets/html/broken_elevator_detail_en.html
deleted file mode 100644
index 5dc2deef9..000000000
--- a/assets/html/broken_elevator_detail_en.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-If people are stuck inside
-
-
- - Don’t try to save them by opening the door.
- - Reassure them. Let them know that help is on the way.
- - Ask them if anyone is injured or if anyone needs special assistance (for example, people
- with claustrophobia) and find out how many people are stuck in the elevator.
-
- - Contact Security at extension 55 (internal phone system).
- - Stay on site until help arrives. Continue to reassure people.
-
-
-If a person’s condition worsens, inform Security.
- If you can’t reach Security, dial 911.
-
-
-
\ No newline at end of file
diff --git a/assets/html/broken_elevator_detail_fr.html b/assets/html/broken_elevator_detail_fr.html
deleted file mode 100644
index c2d897346..000000000
--- a/assets/html/broken_elevator_detail_fr.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-Si des personnes sont coincĂ©es Ă l’intĂ©rieur
-
-
- - Ne tentez pas de les secourir en ouvrant la porte;
- - Rassurez-les. Dites-leur que les secours s’en viennent;
- - Demandez-leur s’il y a des blessĂ©s ou des personnes nĂ©cessitant une assistance
- particulière (par exemple : claustrophobes) et le nombre de personnes prises dans l’ascenseur;
-
- - Communiquez avec la Sécurité, au poste 55 (à partir du système téléphonique interne);
- - Restez sur les lieux jusqu’Ă ce les secours arrivent. Continuez de rassurer les
- gens.
-
-
-
-Si l’Ă©tat d’une personne s’aggrave, informez-en la SĂ©curitĂ©.
- Si vous n’arrivez pas Ă joindre la SĂ©curitĂ©, composez le 911.
-
-
-
\ No newline at end of file
diff --git a/assets/html/earthquake_detail_en.html b/assets/html/earthquake_detail_en.html
deleted file mode 100644
index 3be005638..000000000
--- a/assets/html/earthquake_detail_en.html
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
- - Get down: As soon as you feel the first tremors, your first reflex should be to crouch down
- on the floor to avoid falling.
-
- - Seek shelter: As soon as you have crouched down, locate and move to a place where you can
- shelter yourself, such as underneath your desk or work table.
-
- - Hang on: As soon as you are under your shelter, hang on tightly to the desk or table and
- remain there until the earthquake is over.
-
- - Once the tremors have ended, remain under your shelter.
- - Security will make an announcement by voice message that is appropriate for your
- area.
-
-
-
-When should you evacuate?
-
-
- - When a fire has been declared near you.
- - When Security has ordered you to evacuate.
-
-
-How should you evacuate the building?
-
-
- - Do not use elevators.
- - Follow the directions given by Security through the voice messaging system.
- - Security may indicate emergency exits for you to use.
- - Once you have exited the building, look around carefully to avoid objects that could fall on
- you.
-
- - Go to the meeting point in the parking lot of the old Planetarium, at the corner of Peel and
- Notre Dame Streets.
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/earthquake_detail_fr.html b/assets/html/earthquake_detail_fr.html
deleted file mode 100644
index c79261a6e..000000000
--- a/assets/html/earthquake_detail_fr.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
- - Baissez-vous : Dès les premières secousses, votre premier réflexe doit être de vous
- accroupir au sol pour Ă©viter une chute.
-
- - Abritez-vous : AussitĂ´t que vous ĂŞtes accroupi, localisez et dirigez-vous vers un endroit oĂą
- vous pouvez vous abriter. Les dessous de votre bureau ou de votre table de travail, par
- exemple.
-
- - Agrippez-vous : Dès que vous ĂŞtes Ă l’abri, agrippez-vous solidement au meuble et
- demeurez ainsi jusqu’Ă la fin du tremblement de terre.
-
- - Une fois les secousses terminĂ©es, restez Ă l’abri
- - La Sécurité diffusera un message phonique approprié à votre secteur.
-
-
-Quand Ă©vacuer?
-
-
- - Lorsqu’un incendie s’est dĂ©clarĂ© près de vous
- - Lorsque la SĂ©curitĂ© vous donne l’ordre d’Ă©vacuer.
-
-
-Comment évacuer le bâtiment ?
-
-
- - N’utilisez pas les ascenseurs
- - Suivez les indications transmises par la Sécurité au moyen du système de messagerie
- phonique.
-
- - La Sécurité pourra alors vous indiquer les issues de secours à utiliser
- - Une fois Ă l’extĂ©rieur du bâtiment, surveillez votre environnement pour Ă©viter les
- objets qui pourraient vous heurter
-
- - Dirigez-vous au lieu de rassemblement situĂ© dans le stationnement de l’ancien
- planĂ©tarium, Ă l’angle des rues Peel et Notre-Dame.
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/electrical_outage_detail_en.html b/assets/html/electrical_outage_detail_en.html
deleted file mode 100644
index ef026c58d..000000000
--- a/assets/html/electrical_outage_detail_en.html
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-When an electrical outage occurs.
-
-
- - Remain calm.
- - Stay at your work station.
- - If you are in a dark area, slowly make your way to a place that is well-lit until the
- situation returns to normal.
-
- - Find people who may be in spaces without windows: washrooms, storages areas, etc.
- - Make sure that the outage does not affect your area.
- - Ask the person in charge of your group to contact Security at extension 55 (internal phone
- system).
-
- - Stop any dangerous activity (for example, handling chemical products).
- - Put away dangerous products.
- - Turn off all sources of heat and burners.
- - Listen to instructions announced over the loudspeakers.
-
-
-There may be a delay between the beginning of the outage and emergency systems being
- activated.
-
-General outage
-
-
- - Wait for instructions from Security.
- - Following an evacuation order, take the stairs. Elevators should only be used for
- emergencies and for people with reduced mobility.
-
- - When an evacuation occurs following an electricity outage, people leave school for the rest
- of the day. They should not go to the meeting point.
-
- - If the outage is of a longer duration, you can obtain information on the ÉTS Web site or by
- listening to its greeting message at 514-396-8800.
-
-
-
-End of the outage
-
-
- - Wait for instructions before entering the building.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/electrical_outage_detail_fr.html b/assets/html/electrical_outage_detail_fr.html
deleted file mode 100644
index 4eb83fc08..000000000
--- a/assets/html/electrical_outage_detail_fr.html
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-Dès que survient la panne électrique
-
-
- - Restez calme;
- - Demeurez Ă votre poste de travail;
- - Si vous êtes dans un local sans lumière, dirigez-vous lentement vers un endroit
- éclairé en attendant que la situation se rétablisse;
-
- - Aller chercher les personnes qui pourraient se trouver dans des locaux sans fenĂŞtres :
- toilettes, rangements, etc.;
-
- - VĂ©rifiez que la panne ne touche que votre secteur;
- - Demandez à la personne responsable de votre groupe de communiquer avec la sécurité au poste
- 55 (à partir du système téléphonique interne);
-
- - Cessez toute activité dangereuse (par exemple : manipulation de produits chimiques);
- - Entreposez les produits dangereux);
- - Éteignez les sources de chaleurs ou les brûleurs;
- - Soyez Ă l’Ă©coute des instructions diffusĂ©es dans les haut-parleurs.
-
-
-Il peut y avoir un dĂ©lai entre le dĂ©but de la panne et l’activation des systèmes d’urgence.
-
-
-Panne généralisée
-
-
- - Attendez les instructions de la Sécurité;
- - Ă€ la suite d’un ordre d’Ă©vacuation, prenez les escaliers. Les ascenseurs ne
- doivent servir que pour les cas d’urgence et pour les personnes Ă mobilitĂ© rĂ©duite;
-
- - Lorsqu’une Ă©vacuation survient Ă la suite d’une panne d’Ă©lectricitĂ©, les
- personnes quittent l’Ă©cole pour le reste de la journĂ©e. Elles ne doivent pas se rendre
- au point de rassemblement;
-
- - Si la panne est de longue durĂ©e, vous pouvez vous informer sur le site Web de l’ÉTS ou
- en Ă©coutant son message d’accueil, au 514 396-8800.
-
-
-
-Fin de la panne
-
-
- - Attendez les instructions avant d’entrer dans l’Ă©tablissement.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/evacuation_detail_en.html b/assets/html/evacuation_detail_en.html
deleted file mode 100644
index 5fdfc0019..000000000
--- a/assets/html/evacuation_detail_en.html
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
- - Wait until Security orders evacuation. Security officers must inspect evacuation routes to
- ensure that there is no danger (suspicious packages).
-
- - Stay calm.
- - Dress according to the outdoor temperature, but don’t make a detour to get clothing
- (for example, don’t go to your locker).
-
- - Evacuate the area via the closest emergency stairwell. Don’t take the
- elevator.
-
- - Keep a safe distance from the building.
- - Go to the meeting point.
- - Do not go back inside for any reason.
-
-
-Returning to the building
-
-
- - You can return to the building as soon as Security announces that it is safe to do so.
- - This authorization will be announced over a megaphone at the meeting point.
-
-
-Meeting points
-
-
- - The Dow Planetarium parking lot, at the corner of Peel and Notre Dame streets, at the
- northeastern corner of ÉTS.
-
- - In the wintertime, people who are evacuated will be escorted, as soon as possible, to the
- hall in Pavilion B and the common areas of the dormitories located at 301 Peel Street and
- 1045 Ottawa Street.
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/evacuation_detail_fr.html b/assets/html/evacuation_detail_fr.html
deleted file mode 100644
index 6421b1091..000000000
--- a/assets/html/evacuation_detail_fr.html
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-Attendez que la SĂ©curitĂ© ordonne l’Ă©vacuation. Celui-ci doit inspecter les voies d’Ă©vacuation
- pour s’assurer qu’il n’y a pas de danger (colis suspect)
-
-
- - Restez calme
- - Habillez-vous en fonction de la température extérieure, mais ne faites pas de détour
- pour rĂ©cupĂ©rer vos vĂŞtements (par exemple : n’allez pas Ă votre casier)
-
- - Évacuez l’endroit par les escaliers de secours les plus près. N’utilisez pas les
- ascenseurs.
-
- - Éloignez-vous de l’immeuble
- - Dirigez-vous vers le lieu de rassemblement
- - Ne retournez sous aucun prĂ©texte Ă l’intĂ©rieur
-
-
-Retour dans l’immeuble
-
-
- - Le retour dans l’immeuble se fera dès que le responsable de la SĂ©curitĂ© l’autorisera
- - Cette autorisation sera communiquĂ©e au moyen d’un porte-voix au point de
- rassemblement
-
-
-
-Lieux de rassemblement
-
-
- - Le stationnement du PlanĂ©tarium Dow, situĂ© Ă l’angle des rues Peel et Notre-Dame cĂ´tĂ©
- nord-est de l’ÉTS.
-
- - En période hivernale, tous les évacués seront escortés le plus tôt possible dans le hall du
- pavillon B et dans les salles communes des résidences universitaires situées au 301, rue
- Peel et au 1045, rue Ottawa.
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/fire_detail_en.html b/assets/html/fire_detail_en.html
deleted file mode 100644
index 5e00681cd..000000000
--- a/assets/html/fire_detail_en.html
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
- - If you see fire or smoke
- - Help anyone who is in immediate danger, as long as there is no risk to your own
- life.
-
- - Leave the premises.
- - Set off the fire alarm (stations are very close to emergency exits).
- - Use the stairs to leave the building (never use the elevators).
- - Close all doors behind you to make sure that the fire doesn’t spread.
- - Dial 911 as soon as you are in a safe area.
- - Do not go back inside for any reason.
-
-
- If you hear a fire alarm go off
-
-
- - Help anyone who is in immediate danger, as long as there is no risk to your own
- life.
-
- - Leave the premises.
- - Use the stairs to leave the building (never use the elevators).
- - Close all doors behind you to make sure that the fire doesn’t spread.
- - Keep your distance from the premises (minimum of 100 metres) so that those who are following
- behind you can exit easily, and to make firefighters’ jobs easier.
-
- - Do not go back inside for any reason.
-
-
-Meeting points
-
-
- - The Dow Planetarium parking lot, at the corner of Peel and Notre Dame Streets, at the
- northeastern corner of ÉTS.
-
- - In the wintertime, people who are evacuated will be escorted, as soon as possible, to the
- hall in Pavilion B and the common areas of the dormitories located at 301 Peel Street and
- 1045 Ottawa Street.
-
-
-
-Returning to the building
-
-
- - You can return to the building as soon as Security announces that it is safe to do so.
- - This authorization will be announced over a megaphone at the meeting point.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/fire_detail_fr.html b/assets/html/fire_detail_fr.html
deleted file mode 100644
index 7e5de97cf..000000000
--- a/assets/html/fire_detail_fr.html
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-Si vous voyez du feu ou de la fumée
-
-
- - Aidez quiconque se trouve en danger immédiat, si cela ne comporte pas de risque pour votre
- vie;
-
- - Quittez les lieux;
- - DĂ©clenchez l’alarme-incendie (les postes se trouvent près des issues de secours);
- - Utilisez les escaliers pour sortir du bâtiment (n’utilisez jamais les ascenseurs);
-
- - Fermez toutes les portes derrières vous pour Ă©viter que l’incendie ne se propage;
- - Composez le 911 dès que vous vous trouvez dans un endroit sécuritaire;
- - Ne retournez sous aucun prĂ©texte Ă l’intĂ©rieur.
- - Si vous entendez le signal d’alarme-incendie
- - Aidez quiconque se trouve en danger immédiat, si cela ne comporte pas de risque pour votre
- vie;
-
- - Quittez les lieux;
- - Utilisez les escaliers pour sortir du bâtiment (n’utilisez jamais les ascenseurs);
-
- - Fermez toutes les portes derrière vous pour Ă©viter que l’incendie ne se propage;
- - Éloignez-vous des lieux (distance minimale de 100 mètres) afin de permettre à ceux qui
- suivent de sortir et de faciliter le travail des pompiers;
-
- - Ne retournez sous aucun prĂ©texte Ă l’intĂ©rieur.
-
-
-Lieux de rassemblement
-
-
- - Le stationnement du PlanĂ©tarium Dow, situĂ© Ă l’angle des rues Peel et Notre-Dame, du
- cĂ´tĂ© nord-est de l’ÉTS;
-
- - En période hivernale, tous les évacués seront escortés le plus tôt possible dans le hall du
- pavillon B et dans les salles communes des résidences universitaires situées au 301, rue
- Peel et au 1045, rue Ottawa.
-
-
-
-Retour dans l’immeuble
-
-
- - Le retour dans l’immeuble se fera dès que la SĂ©curitĂ© l’autorisera;
- - Cette autorisation sera communiquĂ©e au moyen d’un porte-voix au lieu de
- rassemblement.
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/gas_leak_detail_en.html b/assets/html/gas_leak_detail_en.html
deleted file mode 100644
index 4fe3d151a..000000000
--- a/assets/html/gas_leak_detail_en.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-Gas odour or leak
-
-
- - Leave the area where you are (i.e. lab, cafeteria kitchen, etc.).
- - Contact Security at extension 55 (internal phone system) in an emergency, using a phone in
- your area.
-
- - Don’t use a cell phone near the leak (be sure that there is no perceptible odour
- before using a cell phone, to prevent any danger of explosion).
-
- - Never activate a fire alarm (red station).
-
-
-Evacuation order
-
-Under order of evacuation by Security or a member of the evacuation team:
-
-
- - Stay calm.
- - Stop whatever you are doing safely.
-
-
-Don’t touch anything
-
-
- - Anything that is on must stay on.
- - Anything that is off must stay off.
-
-
\ No newline at end of file
diff --git a/assets/html/gas_leak_detail_fr.html b/assets/html/gas_leak_detail_fr.html
deleted file mode 100644
index 49d786fc9..000000000
--- a/assets/html/gas_leak_detail_fr.html
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-Odeur ou fuite de gaz
-
-
- - Quittez le secteur où vous vous trouvez (par ex. : laboratoire, cuisine de la cafétéria,
- etc.)
-
- - Communiquez avec la Sécurité au poste 55 (système téléphonique interne) pour les urgences en
- utilisant un téléphone situé dans un autre secteur.
-
- - N’utilisez pas un cellulaire Ă proximitĂ© de la fuite (s’assurer que l’odeur
- n’est plus perceptible avant d’utiliser un cellulaire, pour prĂ©venir tout danger
- d’explosion).
-
- - N’activez jamais une alarme-incendie (station rouge)
-
-
-Ordre d’Ă©vacuation
-
-Sur ordre d’Ă©vacuation de la SĂ©curitĂ© ou d’un membre de l’Ă©quipe d’Ă©vacuation
- :
-
-
- - Restez calme
- - Cessez toute activité de façon sécuritaire
-
-
-Ne touchez Ă rien
-
-
- - Ce qui est allumé doit rester allumé.
- - Ce qui est Ă©teint doit rester Ă©teint.
-
-
-
\ No newline at end of file
diff --git a/assets/html/medical_emergency_detail_en.html b/assets/html/medical_emergency_detail_en.html
deleted file mode 100644
index 98b0607a3..000000000
--- a/assets/html/medical_emergency_detail_en.html
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-If someone’s life is in danger, call 911
-
-If the person is conscious, ask him or her:
-
-
- - His or her name
- - Details about the incident
- - Details about his or her wounds
- - Questions about his or her allergies and health problems
-
-
-
- - Contact Security at extension 55 (internal telephone system).
- - Do not hang up until the dispatcher tells you to do so.
- - If you have first aid training, give first aid.
- - Ask those who are present to find a first aid worker on the floor.
- - Stay on site to assist first aid workers and give them information about the victim.
-
- - Ask people on site to help you as you wait for help.
- - Keep people away from the victim to keep the area clear and make first aid workers’
- job easier.
-
- - Don’t move the victim unless the situation presents a danger to him or her.
- - Don’t give the victim anything to eat or drink, even if he or she asks for it.
-
- - If possible, stay in contact with Security.
- - If the victim’s state deteriorates, inform Security.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/medical_emergency_detail_fr.html b/assets/html/medical_emergency_detail_fr.html
deleted file mode 100644
index fccdc7c8c..000000000
--- a/assets/html/medical_emergency_detail_fr.html
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-Si la vie d’une personne est en danger, composez le 911
-
-Si la personne est consciente, demandez-lui :
-
-
- - Son nom;
- - Les dĂ©tails sur l’incident;
- - Des détails sur ses blessures;
- - Des questions sur ses allergies et ses problèmes de santé.
-
-
-
- - Communiquez avec la sécurité, au poste 55 (système téléphonique interne);
- - Ne raccrochez pas tant que le répartiteur ne vous dit pas de le faire;
- - Prodiguez les premiers soins si vous avez été formé pour le faire;
- - Demandez aux personnes prĂ©sentes de trouver un secouriste sur l’Ă©tage;
- - Restez sur place pour aider les secouristes et leur fournir de l’information sur
- la victime;
-
- - Demandez aux personnes sur place de vous aider en attendant les secours;
- - Éloignez les personnes de la victime afin de lui faire de la place et de faciliter la tâche
- des secouristes;
-
- - Ne déplacez pas la victime sauf si la situation représente un danger pour elle;
- - Ne lui donner ni Ă boire ni Ă manger mĂŞme si la victime l’exige;
- - Restez en communication avec la sécurité, si cela est possible;
- - Si l’Ă©tat de la victime se dĂ©tĂ©riore, en informer la sĂ©curitĂ©.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/suspicious_packages_detail_en.html b/assets/html/suspicious_packages_detail_en.html
deleted file mode 100644
index 045db795b..000000000
--- a/assets/html/suspicious_packages_detail_en.html
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-A package is considered suspicious if it presents the following characteristics:
-
-
- - Excessive stamps
- - Suspicious odour
- - Suspicious noise
- - No return address
- - Several misspelled words
- - Addressed to a person’s title or no name
- - Excessive amount of tape
- - Unexpected delivery
- - Labelled “private” or “only to be opened by”
-
-
-Note
-
-A package may contain nuclear, radiological, biological or chemical material if it presents one
- of the following characteristics:
-
-
- - It appears damaged
- - It’s leaking
- - It contains liquid, dust or granules
- - It smells unusual
- - It is emitting gas or vapour
- - It is seeping or boiling
- - It contains aerosols
- - It shows signs of corrosion
-
-
-What to do
-
-
- - Keep a safe distance from the package.
- - Don’t use your cell phone near the package. Turn it off to prevent any interference
- with the package.
-
- - Contact Security at extension 55 (internal telephone system).
- - Don’t hang up until the dispatcher tells you to do so.
-
-
-Evacuation
-
-
- - Wait until Security orders evacuation. Security officers must inspect evacuation routes to
- ensure that there is no danger (suspicious packages).
-
- - Stay calm.
- - Dress according to the outdoor temperature, but don’t make a detour to get clothing
- (for example, don’t go to your locker).
-
- - Evacuate the area via the closest emergency stairwell. Don’t take the
- elevator.
-
- - Keep a safe distance from the building.
- - Go to the meeting point.
- - Do not go back inside for any reason.
-
-
-Returning to the building
-
-
- - You can return to the building as soon as Security announces that it is safe to do so.
- - This authorization will be announced over a megaphone at the meeting point.
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/html/suspicious_packages_detail_fr.html b/assets/html/suspicious_packages_detail_fr.html
deleted file mode 100644
index b65c38048..000000000
--- a/assets/html/suspicious_packages_detail_fr.html
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-Un colis est considĂ©rĂ© comme suspect s’il prĂ©sente les caractĂ©ristiques suivantes :
-
-
- - Timbrage exagéré;
- - Odeur suspecte;
- - Bruit suspect;
- - Aucune adresse de retour;
- - Plusieurs mots mal orthographiés;
- - Titre de la personne ou absence du nom du destinataire;
- - Présence excessive de ruban;
- - Livraison non prévue;
- - Mention « privĂ© », « Ă ouvrir seulement par ».
-
-
-Note
-
-Un colis peut être considéré comme contenant des matières nucléaires, radiologiques, biologiques
- ou chimiques s’il prĂ©sente l’une des caractĂ©ristiques suivantes :
-
-
- - Il est détérioré;
- - Il fuit;
- - Il contient du liquide, de la poussière ou des granules;
- - Il dégage une odeur anormale;
- - Il Ă©met des gaz ou de la vapeur;
- - Il suinte ou bouillonne;
- - Il contient des aérosols;
- - Il démontre des signes de corrosion.
-
-
-Marche Ă suivre
-
-
- - Éloignez-vous du colis;
- - N’utilisez pas votre tĂ©lĂ©phone cellulaire Ă proximitĂ© du colis. Éteignez-le pour
- prévenir toute interférence avec le colis;
-
- - Communiquez avec la Sécurité, au poste 55 (système téléphonique interne);
- - Ne raccrochez pas tant que le répartiteur vous dit de le faire.
-
-
-Évacuation
-
-
- - Attendez que la SĂ©curitĂ© ordonne l’Ă©vacuation. La SĂ©curitĂ© doit inspecter les voies d’Ă©vacuation
- pour s’assurer qu’il n’y a pas de danger (colis suspect);
-
- - Restez calme;
- - Habillez-vous en fonction de la température extérieure, mais ne faites pas de détour
- pour rĂ©cupĂ©rer vos vĂŞtements (par exemple : n’allez pas Ă votre casier);
-
- - Évacuez l’endroit par les escaliers de secours les plus près. N’utilisez pas les
- ascenseurs;
-
- - Éloignez-vous de l’immeuble;
- - Dirigez-vous vers le lieu de rassemblement;
- - Ne retournez sous aucun prĂ©texte Ă l’intĂ©rieur.
-
-
-Retour dans l’immeuble
-
-
- - Le retour dans l’immeuble se fera dès que la SĂ©curitĂ© l’autorisera;
- - Cette autorisation sera communiquĂ©e au moyen d’un porte-voix au lieu de
- rassemblement.
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/images/capra.png b/assets/images/capra.png
new file mode 100644
index 000000000..a0a53661b
Binary files /dev/null and b/assets/images/capra.png differ
diff --git a/assets/images/capra_long.png b/assets/images/capra_long.png
deleted file mode 100644
index 10ddc543a..000000000
Binary files a/assets/images/capra_long.png and /dev/null differ
diff --git a/assets/markdown/armed_person_en.md b/assets/markdown/armed_person_en.md
new file mode 100644
index 000000000..de9611e4b
--- /dev/null
+++ b/assets/markdown/armed_person_en.md
@@ -0,0 +1,39 @@
+## If you can leave the premises without putting yourself in danger, evacuate the building
+
+- Remain calm.
+- Never try to stop an armed person.
+- Do not activate the fire alarm.
+- Take the nearest emergency exit.
+- Use the stairs to exit the building. Don’t take the elevator.
+- Show your hands so that police officers don’t see you as a threat.
+- Inform anyone you meet that they should leave the premises immediately.
+- Once you leave the building, don’t stay in close range. Go to the meeting point that is a little further away, at the corner of Peel and St. Jacques Streets (the space in front of the old Planetarium).
+- Once you’ve reached safety, call 911.
+
+## If you cannot safely leave the premises without putting yourself in danger, hide
+
+- Stay calm and silent.
+- Hide and tell other people to do the same.
+- Lock the door of the room where you’re hiding.
+- Barricade the door with furniture.
+- Close the blinds on the windows.
+- Stay away from doors and windows (hallways and outdoor walls).
+- If there is a window that looks out on an external wall of the building, let police know you are there by putting a note in the window.
+- Hide under a desk.
+- Stay quiet.
+- Put your cell phone in silent mode.
+- If someone knocks at the door, don’t open it. The person who is knocking may pose a threat to you.
+- In the event that police officers need to check the premises, they will receive access cards and sets of keys.
+- Never jump out of your hiding place, and keep your hands in plain sight.
+- Wait for directions from police officers or the Security and Prevention Office before leaving the premises.
+
+### In the event of an evacuation
+
+- Go to the meeting point that is a little further away, at the corner of Peel and St. Jacques Streets (the space in front of the old Planetarium).
+- Never stay close to the building.
+- Keep quiet so you can hear directions given by police or security officers.
+
+### Remember…
+
+- Never jump out of your hiding place.
+- Keep your hands in plain sight.
\ No newline at end of file
diff --git a/assets/markdown/armed_person_fr.md b/assets/markdown/armed_person_fr.md
new file mode 100644
index 000000000..67ba153f9
--- /dev/null
+++ b/assets/markdown/armed_person_fr.md
@@ -0,0 +1,39 @@
+## Si vous pouvez quitter les lieux sans être menacé, évacuez l’édifice
+
+- Restez calme;
+- Ne tentez jamais d’arrêter une personne armée;
+- N’activez pas l’alarme-incendie;
+- Empruntez la sortie de secours la plus près;
+- Utilisez les escaliers pour sortir du bâtiment (n’utilisez jamais les ascenseurs);
+- Montrez vos mains afin de ne pas être perçu comme une menace par les policiers;
+- Informez les gens que vous croisez de quitter les lieux immédiatement;
+- Une fois que vous avez quitté l’édifice, ne restez pas à proximité de l’immeuble; rendez-vous au point de rassemblement éloigné, qui se trouve au coin des rue Peel et St-Jacques (l’espace devant l’ancien planétarium);
+- Une fois en sécurité, composez le 911.
+
+## Si vous ne pouvez pas quitter les lieux sans être menacé, confinez-vous
+
+- Restez calme et silencieux;
+- Cachez-vous et dites aux gens de faire comme vous;
+- Verrouillez la porte du local où vous êtes caché;
+- Barricadez la porte avec des meubles;
+- Fermez les stores des fenĂŞtres;
+- Éloignez-vous de la porte et des fenêtres (corridors et murs extérieurs);
+- Si une fenêtre donne sur un mur extérieur du bâtiment, signalez votre présence aux policiers en mettant un papier avec une note;
+- Cachez-vous sous un bureau;
+- Gardez le silence;
+- Mettez votre cellulaire en mode silencieux;
+- Si une personne frappe à la porte, ne l’ouvrez pas. La personne qui frappe à la porte représente peut-être une menace;
+- Dans l’éventualité où les policiers auront à vérifier tous les locaux, ces derniers recevront des cartes d’accès et des trousseaux de clefs;
+- Ne bondissez jamais de votre cachette et gardez les mains bien en vue;
+- Attendez les directives des policiers ou du Bureau de la prévention et de la sécurité avant de quitter les lieux.
+
+### Dans l’éventualité d’une évacuation
+
+- Rendez-vous au lieu de rassemblement éloigné (l’espace devant l’ancien Planétarium) situé à l’angle des rues Peel et St-Jacques;
+- Ne demeurez jamais à proximité de l’immeuble;
+- Gardez le silence pour entendre les directives données par les policiers ou par la sécurité.
+
+### Rappelez-vous
+
+- Ne bondissez jamais de votre cachette;
+- Gardez vos mains bien en vue.
\ No newline at end of file
diff --git a/assets/markdown/bomb_threat_en.md b/assets/markdown/bomb_threat_en.md
new file mode 100644
index 000000000..9b19fc7bc
--- /dev/null
+++ b/assets/markdown/bomb_threat_en.md
@@ -0,0 +1,38 @@
+### If the bomb threat is made by phone:
+
+- Don’t hang up.
+- Let the caller hang up first.
+- Try to get as much information as possible.
+- Get the person to repeat him- or herself, or pretend you can’t hear to buy time.
+- Pay special attention to the following elements:
+ - Gender
+ - Age
+ - Accent, language spoken
+ - Tone of voice (high or low)
+ - Speech rhythm and emotions (angry, calm, agitated)
+ - Background noises
+
+- Depending on the situation and what is possible, try to obtain the following information:
+ - The time at which the bomb will go off
+ - The type of bomb
+ - The people being targeted and the reason
+ - The location of the bomb
+ - The name and number on the phone’s Caller ID
+
+- Contact Security at extension 55 (internal phone system) to alert them to the situation and share relevant information.
+- Security may then ask you to come to the Security Operations Centre, located at the entrance of Pavilion A.
+
+### Evacuation
+
+- Wait until Security orders evacuation. Security officers must inspect evacuation routes to ensure that there is no danger (suspicious packages).
+- Stay calm.
+- Dress according to the outdoor temperature, but don’t make a detour to get clothing (for example, don’t go to your locker).
+- Evacuate the area via the closest emergency staircase. Don’t take the elevator.
+- Keep a safe distance from the building.
+- Go to the designated meeting point.
+- Do not go back inside for any reason.
+
+### Returning to the building
+
+- You can return to the building as soon as Security announces that it is safe to do so.
+- This authorization will be announced over a megaphone at the meeting point
\ No newline at end of file
diff --git a/assets/markdown/bomb_threat_fr.md b/assets/markdown/bomb_threat_fr.md
new file mode 100644
index 000000000..4ab580620
--- /dev/null
+++ b/assets/markdown/bomb_threat_fr.md
@@ -0,0 +1,38 @@
+### Si la menace est transmise par téléphone
+
+- Ne mettez pas fin Ă la communication;
+- Laissez l’interlocuteur raccrocher en premier;
+- Tentez d’obtenir le maximum de renseignements;
+- Faites répéter la personne ou prétextez avoir de la difficulté à l’entendre afin de gagner du temps;
+- Portez une attention particulière aux éléments suivants :
+ - Sexe
+ - Ă‚ge
+ - Accent, langue parlée
+ - Tonalité de la voix (aiguë ou grave)
+ - Débit et émotions (fâché, calme, agité)
+ - Bruits dans l’environnement
+
+- Dans la mesure du possible et en fonction de la situation, tentez d’obtenir les renseignements suivants :
+ - L’heure à laquelle la bombe explosera
+ - Le type de bombe
+ - Les personnes visées et le motif
+ - L’emplacement de la bombe
+ - Le nom et le numéro qui apparaissent sur l’afficheur du téléphone
+
+- Communiquez avec la Sécurité au poste 55 (système téléphonique interne) pour signaler la situation et transmettre les renseignements pertinents;
+- La Sécurité pourrait ensuite vous demander de vous rendre au centre des opérations de la sécurité, située à l’entrée du Pavillon A.
+
+### Évacuation
+
+- Attendez que la Sécurité ordonne l’évacuation. Celle-ci doit inspecter les voies d’évacuation pour s’assurer qu’il n’y a pas de danger (colis suspect);
+- Restez calme;
+- Habillez-vous en fonction de la température extérieure, mais ne faites pas de détour pour récupérer vos vêtements (par exemple : n’allez pas à votre casier);
+- Évacuez l’endroit par les escaliers de secours les plus près. N’utilisez pas les ascenseurs;
+- Éloignez-vous de l’immeuble;
+- Dirigez-vous vers le lieu de rassemblement;
+- Ne retournez sous aucun prétexte à l’intérieur.
+
+### Retour dans l’immeuble
+
+- Le retour dans l’immeuble se fera dès que la Sécurité l’autorisera;
+- Cette autorisation sera communiquée au moyen d’un porte-voix au lieu de rassemblement.
\ No newline at end of file
diff --git a/assets/markdown/broken_elevator_en.md b/assets/markdown/broken_elevator_en.md
new file mode 100644
index 000000000..0a32ed984
--- /dev/null
+++ b/assets/markdown/broken_elevator_en.md
@@ -0,0 +1,10 @@
+### If people are stuck inside
+
+- Don’t try to save them by opening the door.
+- Reassure them. Let them know that help is on the way.
+- Ask them if anyone is injured or if anyone needs special assistance (for example, people with claustrophobia) and find out how many people are stuck in the elevator.
+- Contact Security at extension 55 (internal phone system).
+- Stay on site until help arrives. Continue to reassure people.
+
+**If a person’s condition worsens, inform Security.
+If you can’t reach Security, dial 911.**
\ No newline at end of file
diff --git a/assets/markdown/broken_elevator_fr.md b/assets/markdown/broken_elevator_fr.md
new file mode 100644
index 000000000..25cbbdd81
--- /dev/null
+++ b/assets/markdown/broken_elevator_fr.md
@@ -0,0 +1,10 @@
+### Si des personnes sont coincées à l’intérieur
+
+- Ne tentez pas de les secourir en ouvrant la porte;
+- Rassurez-les. Dites-leur que les secours s’en viennent;
+- Demandez-leur s’il y a des blessés ou des personnes nécessitant une assistance particulière (par exemple : claustrophobes) et le nombre de personnes prises dans l’ascenseur;
+- Communiquez avec la Sécurité, au poste 55 (à partir du système téléphonique interne);
+- Restez sur les lieux jusqu’à ce que les secours arrivent. Continuez de rassurer les gens.
+
+**Si l’état d’une personne s’aggrave, informez-en la Sécurité.
+Si vous n’arrivez pas à joindre la Sécurité, composez le 911.**
\ No newline at end of file
diff --git a/assets/markdown/earthquake_en.md b/assets/markdown/earthquake_en.md
new file mode 100644
index 000000000..ec47089f6
--- /dev/null
+++ b/assets/markdown/earthquake_en.md
@@ -0,0 +1,18 @@
+- **Get down**: As soon as you feel the first tremors, your first reflex should be to crouch down on the floor to avoid falling.
+- **Seek shelter**: As soon as you have crouched down, locate and move to a place where you can shelter yourself, such as underneath your desk or work table.
+- **Hang on**: As soon as you are under your shelter, hang on tightly to the desk or table and remain there until the earthquake is over.
+- Once the tremors have ended, remain under your shelter.
+- Security will make an announcement by voice message that is appropriate for your area.
+
+### When should you evacuate?
+
+- When a fire has been declared near you.
+- When Security has ordered you to evacuate.
+
+### How should you evacuate the building?
+
+- Do not use elevators.
+- Follow the directions given by Security through the voice messaging system.
+- Security may indicate emergency exits for you to use.
+- Once you have exited the building, look around carefully to avoid objects that could fall on you.
+- Go to the meeting point in the parking lot of the old Planetarium, at the corner of Peel and Notre Dame Streets.
\ No newline at end of file
diff --git a/assets/markdown/earthquake_fr.md b/assets/markdown/earthquake_fr.md
new file mode 100644
index 000000000..6fc48ad9e
--- /dev/null
+++ b/assets/markdown/earthquake_fr.md
@@ -0,0 +1,18 @@
+- **Baissez-vous** : Dès les premières secousses, votre premier réflexe doit être de vous accroupir au sol pour éviter une chute.
+- **Abritez-vous** : AussitĂ´t que vous ĂŞtes accroupi, localisez et dirigez-vous vers un endroit oĂą vous pouvez vous abriter. Les dessous de votre bureau ou de votre table de travail, par exemple.
+- **Agrippez-vous** : Dès que vous êtes à l’abri, agrippez-vous solidement au meuble et demeurez ainsi jusqu’à la fin du tremblement de terre.
+- Une fois les secousses terminées, restez à l’abri.
+- La Sécurité diffusera un message phonique approprié à votre secteur.
+
+### Quand Ă©vacuer?
+
+- Lorsqu’un incendie s’est déclaré près de vous.
+- Lorsque la Sécurité vous donne l’ordre d’évacuer.
+
+### Comment évacuer le bâtiment ?
+
+- N’utilisez pas les ascenseurs.
+- Suivez les indications transmises par la Sécurité au moyen du système de messagerie phonique.
+- La Sécurité pourra alors vous indiquer les issues de secours à utiliser.
+- Une fois à l’extérieur du bâtiment, surveillez votre environnement pour éviter les objets qui pourraient vous heurter.
+- Dirigez-vous au lieu de rassemblement situé dans le stationnement de l’ancien planétarium, à l’angle des rues Peel et Notre-Dame.
\ No newline at end of file
diff --git a/assets/markdown/electrical_outage_en.md b/assets/markdown/electrical_outage_en.md
new file mode 100644
index 000000000..089bdb128
--- /dev/null
+++ b/assets/markdown/electrical_outage_en.md
@@ -0,0 +1,25 @@
+### When an electrical outage occurs
+
+- Remain calm.
+- Stay at your work station.
+- If you are in a dark area, slowly make your way to a place that is well-lit until the situation returns to normal.
+- Find people who may be in spaces without windows: washrooms, storage areas, etc.
+- Make sure that the outage does not affect your area.
+- Ask the person in charge of your group to contact Security at extension 55 (internal phone system).
+- Stop any dangerous activity (for example, handling chemical products).
+- Put away dangerous products.
+- Turn off all sources of heat and burners.
+- Listen to instructions announced over the loudspeakers.
+
+#### There may be a delay between the beginning of the outage and emergency systems being activated.
+
+### General outage
+
+- Wait for instructions from Security.
+- Following an evacuation order, take the stairs. Elevators should only be used for emergencies and for people with reduced mobility.
+- When an evacuation occurs following an electricity outage, people leave school for the rest of the day. They should not go to the meeting point.
+- If the outage is of a longer duration, you can obtain information on the ÉTS website or by listening to its greeting message at 514-396-8800.
+
+### End of the outage
+
+- Wait for instructions before entering the building.
diff --git a/assets/markdown/electrical_outage_fr.md b/assets/markdown/electrical_outage_fr.md
new file mode 100644
index 000000000..2fd311d8e
--- /dev/null
+++ b/assets/markdown/electrical_outage_fr.md
@@ -0,0 +1,25 @@
+### Dès que survient la panne électrique
+
+- Restez calme.
+- Demeurez Ă votre poste de travail.
+- Si vous êtes dans un local sans lumière, dirigez-vous lentement vers un endroit éclairé en attendant que la situation se rétablisse.
+- Allez chercher les personnes qui pourraient se trouver dans des locaux sans fenĂŞtres : toilettes, rangements, etc.
+- VĂ©rifiez que la panne ne touche que votre secteur.
+- Demandez à la personne responsable de votre groupe de communiquer avec la sécurité au poste 55 (à partir du système téléphonique interne).
+- Cessez toute activité dangereuse (par exemple : manipulation de produits chimiques).
+- Entreposez les produits dangereux.
+- Éteignez les sources de chaleur ou les brûleurs.
+- Soyez à l’écoute des instructions diffusées dans les haut-parleurs.
+
+#### Il peut y avoir un délai entre le début de la panne et l’activation des systèmes d’urgence.
+
+### Panne généralisée
+
+- Attendez les instructions de la Sécurité.
+- À la suite d’un ordre d’évacuation, prenez les escaliers. Les ascenseurs ne doivent servir que pour les cas d’urgence et pour les personnes à mobilité réduite.
+- Lorsqu’une évacuation survient à la suite d’une panne d’électricité, les personnes quittent l’école pour le reste de la journée. Elles ne doivent pas se rendre au point de rassemblement.
+- Si la panne est de longue durée, vous pouvez vous informer sur le site Web de l’ÉTS ou en écoutant son message d’accueil, au 514-396-8800.
+
+### Fin de la panne
+
+- Attendez les instructions avant d’entrer dans l’établissement.
\ No newline at end of file
diff --git a/assets/markdown/evacuation_en.md b/assets/markdown/evacuation_en.md
new file mode 100644
index 000000000..b0f8ac3f9
--- /dev/null
+++ b/assets/markdown/evacuation_en.md
@@ -0,0 +1,18 @@
+Wait until Security orders evacuation. Security officers must inspect evacuation routes to ensure that there is no danger (suspicious packages).
+
+- Stay calm.
+- Dress according to the outdoor temperature, but don’t make a detour to get clothing (for example, don’t go to your locker).
+- Evacuate the area via the closest emergency stairwell. Don’t take the elevator.
+- Keep a safe distance from the building.
+- Go to the meeting point.
+- Do not go back inside for any reason.
+
+### Returning to the building
+
+- You can return to the building as soon as Security announces that it is safe to do so.
+- This authorization will be announced over a megaphone at the meeting point.
+
+### Meeting points
+
+- The Dow Planetarium parking lot, at the corner of Peel and Notre Dame streets, at the northeastern corner of ÉTS.
+- In the wintertime, people who are evacuated will be escorted, as soon as possible, to the hall in Pavilion B and the common areas of the dormitories located at 301 Peel Street and 1045 Ottawa Street.
\ No newline at end of file
diff --git a/assets/markdown/evacuation_fr.md b/assets/markdown/evacuation_fr.md
new file mode 100644
index 000000000..f39fc9669
--- /dev/null
+++ b/assets/markdown/evacuation_fr.md
@@ -0,0 +1,18 @@
+Attendez que la Sécurité ordonne l’évacuation. Celui-ci doit inspecter les voies d’évacuation pour s’assurer qu’il n’y a pas de danger (colis suspect).
+
+- Restez calme
+- Habillez-vous en fonction de la température extérieure, mais ne faites pas de détour pour récupérer vos vêtements (par exemple : n’allez pas à votre casier)
+- Évacuez l’endroit par les escaliers de secours les plus proches. N’utilisez pas les ascenseurs.
+- Éloignez-vous de l’immeuble
+- Dirigez-vous vers le lieu de rassemblement
+- Ne retournez sous aucun prétexte à l’intérieur
+
+### Retour dans l’immeuble
+
+- Le retour dans l’immeuble se fera dès que le responsable de la Sécurité l’autorisera
+- Cette autorisation sera communiquée au moyen d’un porte-voix au point de rassemblement
+
+### Lieux de rassemblement
+
+- Le stationnement du Planétarium Dow, situé à l’angle des rues Peel et Notre-Dame côté nord-est de l’ÉTS.
+- En période hivernale, tous les évacués seront escortés le plus tôt possible dans le hall du pavillon B et dans les salles communes des résidences universitaires situées au 301, rue Peel et au 1045, rue Ottawa.
\ No newline at end of file
diff --git a/assets/markdown/fire_en.md b/assets/markdown/fire_en.md
new file mode 100644
index 000000000..b3544b2b3
--- /dev/null
+++ b/assets/markdown/fire_en.md
@@ -0,0 +1,28 @@
+## If you see fire or smoke
+
+- Help anyone who is in immediate danger, as long as there is no risk to your own life.
+- Leave the premises.
+- Set off the fire alarm (stations are very close to emergency exits).
+- Use the stairs to leave the building (never use the elevators).
+- Close all doors behind you to make sure that the fire doesn’t spread.
+- Dial 911 as soon as you are in a safe area.
+- Do not go back inside for any reason.
+
+### If you hear a fire alarm go off
+
+- Help anyone who is in immediate danger, as long as there is no risk to your own life.
+- Leave the premises.
+- Use the stairs to leave the building (never use the elevators).
+- Close all doors behind you to make sure that the fire doesn’t spread.
+- Keep your distance from the premises (minimum of 100 metres) so that those who are following behind you can exit easily, and to make firefighters’ jobs easier.
+- Do not go back inside for any reason.
+
+### Meeting points
+
+- The Dow Planetarium parking lot, at the corner of Peel and Notre Dame Streets, at the northeastern corner of ÉTS.
+- In the wintertime, people who are evacuated will be escorted, as soon as possible, to the hall in Pavilion B and the common areas of the dormitories located at 301 Peel Street and 1045 Ottawa Street.
+
+### Returning to the building
+
+- You can return to the building as soon as Security announces that it is safe to do so.
+- This authorization will be announced over a megaphone at the meeting point.
\ No newline at end of file
diff --git a/assets/markdown/fire_fr.md b/assets/markdown/fire_fr.md
new file mode 100644
index 000000000..08c0960f5
--- /dev/null
+++ b/assets/markdown/fire_fr.md
@@ -0,0 +1,28 @@
+## Si vous voyez du feu ou de la fumée
+
+- Aidez quiconque se trouve en danger immédiat, si cela ne comporte pas de risque pour votre vie.
+- Quittez les lieux.
+- Déclenchez l’alarme-incendie (les postes se trouvent près des issues de secours).
+- Utilisez les escaliers pour sortir du bâtiment (n’utilisez jamais les ascenseurs).
+- Fermez toutes les portes derrière vous pour éviter que l’incendie ne se propage.
+- Composez le 911 dès que vous vous trouvez dans un endroit sécuritaire.
+- Ne retournez sous aucun prétexte à l’intérieur.
+
+### Si vous entendez le signal d’alarme-incendie
+
+- Aidez quiconque se trouve en danger immédiat, si cela ne comporte pas de risque pour votre vie.
+- Quittez les lieux.
+- Utilisez les escaliers pour sortir du bâtiment (n’utilisez jamais les ascenseurs).
+- Fermez toutes les portes derrière vous pour éviter que l’incendie ne se propage.
+- Éloignez-vous des lieux (distance minimale de 100 mètres) afin de permettre à ceux qui suivent de sortir et de faciliter le travail des pompiers.
+- Ne retournez sous aucun prétexte à l’intérieur.
+
+### Lieux de rassemblement
+
+- Le stationnement du Planétarium Dow, situé à l’angle des rues Peel et Notre-Dame, du côté nord-est de l’ÉTS.
+- En période hivernale, tous les évacués seront escortés le plus tôt possible dans le hall du pavillon B et dans les salles communes des résidences universitaires situées au 301, rue Peel et au 1045, rue Ottawa.
+
+### Retour dans l’immeuble
+
+- Le retour dans l’immeuble se fera dès que la Sécurité l’autorisera.
+- Cette autorisation sera communiquée au moyen d’un porte-voix au lieu de rassemblement.
\ No newline at end of file
diff --git a/assets/markdown/gas_leak_en.md b/assets/markdown/gas_leak_en.md
new file mode 100644
index 000000000..861d51bc0
--- /dev/null
+++ b/assets/markdown/gas_leak_en.md
@@ -0,0 +1,18 @@
+### Gas odour or leak
+
+- Leave the area where you are (i.e., lab, cafeteria kitchen, etc.).
+- Contact Security at extension 55 (internal phone system) in an emergency, using a phone in your area.
+- Don’t use a cell phone near the leak (be sure that there is no perceptible odour before using a cell phone, to prevent any danger of explosion).
+- Never activate a fire alarm (red station).
+
+### Evacuation order
+
+Under order of evacuation by Security or a member of the evacuation team:
+
+- Stay calm.
+- Stop whatever you are doing safely.
+
+### Don’t touch anything
+
+- Anything that is on must stay on.
+- Anything that is off must stay off.
\ No newline at end of file
diff --git a/assets/markdown/gas_leak_fr.md b/assets/markdown/gas_leak_fr.md
new file mode 100644
index 000000000..ecabffeef
--- /dev/null
+++ b/assets/markdown/gas_leak_fr.md
@@ -0,0 +1,18 @@
+### Odeur ou fuite de gaz
+
+- Quittez le secteur où vous vous trouvez (par ex. : laboratoire, cuisine de la cafétéria, etc.).
+- Communiquez avec la Sécurité au poste 55 (système téléphonique interne) pour les urgences en utilisant un téléphone situé dans un autre secteur.
+- N’utilisez pas un cellulaire à proximité de la fuite (s’assurer que l’odeur n’est plus perceptible avant d’utiliser un cellulaire, pour prévenir tout danger d’explosion).
+- N’activez jamais une alarme-incendie (station rouge).
+
+### Ordre d’évacuation
+
+Sur ordre d’évacuation de la Sécurité ou d’un membre de l’équipe d’évacuation :
+
+- Restez calme.
+- Cessez toute activité de façon sécuritaire.
+
+### Ne touchez Ă rien
+
+- Ce qui est allumé doit rester allumé.
+- Ce qui est Ă©teint doit rester Ă©teint.
\ No newline at end of file
diff --git a/assets/markdown/medical_emergency_en.md b/assets/markdown/medical_emergency_en.md
new file mode 100644
index 000000000..b2cfc8307
--- /dev/null
+++ b/assets/markdown/medical_emergency_en.md
@@ -0,0 +1,20 @@
+#### If someone’s life is in danger, call 911
+
+### If the person is conscious, ask him or her:
+
+1. His or her name
+2. Details about the incident
+3. Details about his or her wounds
+4. Questions about his or her allergies and health problems
+
+- Contact Security at extension 55 (internal telephone system).
+- Do not hang up until the dispatcher tells you to do so.
+- If you have first aid training, give first aid.
+- Ask those who are present to find a first aid worker on the floor.
+- Stay on site to assist first aid workers and give them information about the victim.
+- Ask people on site to help you as you wait for help.
+- Keep people away from the victim to keep the area clear and make first aid workers’ job easier.
+- Don’t move the victim unless the situation presents a danger to him or her.
+- Don’t give the victim anything to eat or drink, even if he or she asks for it.
+- If possible, stay in contact with Security.
+- If the victim’s state deteriorates, inform Security.
\ No newline at end of file
diff --git a/assets/markdown/medical_emergency_fr.md b/assets/markdown/medical_emergency_fr.md
new file mode 100644
index 000000000..688e3c52a
--- /dev/null
+++ b/assets/markdown/medical_emergency_fr.md
@@ -0,0 +1,20 @@
+#### Si la vie de quelqu'un est en danger, composez le 911
+
+### Si la personne est consciente, demandez-lui :
+
+1. Son nom
+2. Les détails de l’incident
+3. Les détails sur ses blessures
+4. Ses allergies et problèmes de santé
+
+- Contactez la Sécurité au poste 55 (système téléphonique interne).
+- Ne raccrochez pas avant que le répartiteur vous le demande.
+- Si vous avez une formation en premiers secours, administrez les premiers secours.
+- Demandez aux personnes présentes de trouver un secouriste sur le site.
+- Restez sur place pour assister les secouristes et leur fournir des informations sur la victime.
+- Demandez aux personnes présentes de vous aider en attendant l’arrivée de l’aide.
+- Gardez les personnes éloignées de la victime pour maintenir la zone dégagée et faciliter le travail des secouristes.
+- Ne déplacez pas la victime à moins que la situation ne présente un danger pour elle.
+- Ne donnez rien Ă manger ou Ă boire Ă la victime, mĂŞme si elle en fait la demande.
+- Si possible, restez en contact avec la Sécurité.
+- Si l’état de la victime se détériore, informez la Sécurité.
\ No newline at end of file
diff --git a/assets/markdown/suspicious_packages_en.md b/assets/markdown/suspicious_packages_en.md
new file mode 100644
index 000000000..959f707f5
--- /dev/null
+++ b/assets/markdown/suspicious_packages_en.md
@@ -0,0 +1,46 @@
+A package is considered suspicious if it presents the following characteristics:
+
+- Excessive stamps
+- Suspicious odour
+- Suspicious noise
+- No return address
+- Several misspelled words
+- Addressed to a person’s title or no name
+- Excessive amount of tape
+- Unexpected delivery
+- Labelled “private” or “only to be opened by”
+
+**Note**
+
+A package may contain nuclear, radiological, biological, or chemical material if it presents one of the following characteristics:
+
+- It appears damaged
+- It’s leaking
+- It contains liquid, dust, or granules
+- It smells unusual
+- It is emitting gas or vapour
+- It is seeping or boiling
+- It contains aerosols
+- It shows signs of corrosion
+
+## What to do
+
+- Keep a safe distance from the package.
+- Don’t use your cell phone near the package. Turn it off to prevent any interference with the package.
+- Contact Security at extension 55 (internal telephone system).
+- Don’t hang up until the dispatcher tells you to do so.
+
+## Evacuation
+
+- Wait until Security orders evacuation. Security officers must inspect evacuation routes to ensure that there is no danger (suspicious packages).
+- Stay calm.
+- Dress according to the outdoor temperature, but don’t make a detour to get clothing (for example, don’t go to your locker).
+- Evacuate the area via the closest emergency stairwell. Don’t take the elevator.
+- Keep a safe distance from the building.
+- Go to the meeting point.
+- Do not go back inside for any reason.
+
+## Returning to the building
+
+- You can return to the building as soon as Security announces that it is safe to do so.
+- This authorization will be announced over a megaphone at the meeting point.
\ No newline at end of file
diff --git a/assets/markdown/suspicious_packages_fr.md b/assets/markdown/suspicious_packages_fr.md
new file mode 100644
index 000000000..77e71f8ea
--- /dev/null
+++ b/assets/markdown/suspicious_packages_fr.md
@@ -0,0 +1,46 @@
+Un colis est considéré comme suspect s’il présente les caractéristiques suivantes :
+
+- Timbrage exagéré;
+- Odeur suspecte;
+- Bruit suspect;
+- Aucune adresse de retour;
+- Plusieurs mots mal orthographiés;
+- Titre de la personne ou absence du nom du destinataire;
+- Présence excessive de ruban;
+- Livraison non prévue;
+- Mention « privé », « à ouvrir seulement par ».
+
+**Note**
+
+Un colis peut être considéré comme contenant des matières nucléaires, radiologiques, biologiques ou chimiques s’il présente l’une des caractéristiques suivantes :
+
+- Il est détérioré;
+- Il fuit;
+- Il contient du liquide, de la poussière ou des granules;
+- Il dégage une odeur anormale;
+- Il Ă©met des gaz ou de la vapeur;
+- Il suinte ou bouillonne;
+- Il contient des aérosols;
+- Il démontre des signes de corrosion.
+
+## Marche Ă suivre
+
+- Éloignez-vous du colis;
+- N’utilisez pas votre téléphone cellulaire à proximité du colis. Éteignez-le pour prévenir toute interférence avec le colis;
+- Communiquez avec la Sécurité, au poste 55 (système téléphonique interne);
+- Ne raccrochez pas tant que le répartiteur vous dit de le faire.
+
+## Évacuation
+
+- Attendez que la Sécurité ordonne l’évacuation. La Sécurité doit inspecter les voies d’évacuation pour s’assurer qu’il n’y a pas de danger (colis suspect);
+- Restez calme;
+- Habillez-vous en fonction de la température extérieure, mais ne faites pas de détour pour récupérer vos vêtements (par exemple : n’allez pas à votre casier);
+- Évacuez l’endroit par les escaliers de secours les plus près. N’utilisez pas les ascenseurs;
+- Éloignez-vous de l’immeuble;
+- Dirigez-vous vers le lieu de rassemblement;
+- Ne retournez sous aucun prétexte à l’intérieur.
+
+## Retour dans l’immeuble
+
+- Le retour dans l’immeuble se fera dès que la Sécurité l’autorisera;
+- Cette autorisation sera communiquée au moyen d’un porte-voix au lieu de rassemblement.
\ No newline at end of file
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index cfcaa4e1d..b6120c4d1 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -329,14 +329,14 @@ SPEC CHECKSUMS:
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
- rive_common: c537b4eed761e903a9403d93c347b69bd7a4762f
- share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68
+ rive_common: cbbac3192af00d7341f19dae2f26298e9e37d99e
+ share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
SwiftyXMLParser: 027d9e6fb54a38d95dccec025bcea9693f699c47
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
- webview_flutter_wkwebview: be0f0d33777f1bfd0c9fdcb594786704dbf65f36
+ webview_flutter_wkwebview: 2a23822e9039b7b1bc52e5add778e5d89ad488d1
PODFILE CHECKSUM: 18f1615a0bcd417392c9107b3e8dc59c76a68dac
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 053cbba47..7caba3e14 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -376,6 +376,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
+ BuildIndependentTargetsInParallel = YES;
LastSwiftUpdateCheck = 1400;
LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
@@ -783,6 +784,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -793,6 +795,7 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -864,6 +867,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -874,6 +878,7 @@
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@@ -919,6 +924,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -929,6 +935,7 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
diff --git a/l10n/intl_en.arb b/l10n/intl_en.arb
index 538834452..6cc0bdbbe 100644
--- a/l10n/intl_en.arb
+++ b/l10n/intl_en.arb
@@ -258,25 +258,25 @@
"more_report_bug_step5": "mode on the right side. \n\nWhen in navigation mode, you can freely navigate in the app.\n\nTo switch to the drawing mode just press the 'Draw' button. Now you can draw on the screen.\n\nTo finish your feedback just write a description below and send it by pressing the 'Submit' button.",
"security_bomb_threat_title": "Bomb threat",
- "security_bomb_threat_detail": "bomb_threat_detail_en.html",
+ "security_bomb_threat_detail": "bomb_threat_en.md",
"security_suspicious_packages_title": "Suspicious packages",
- "security_suspicious_packages_detail": "suspicious_packages_detail_en.html",
+ "security_suspicious_packages_detail": "suspicious_packages_en.md",
"security_evacuation_title": "Evacuation",
- "security_evacuation_detail": "evacuation_detail_en.html",
+ "security_evacuation_detail": "evacuation_en.md",
"security_gas_leak_title": "Gas leak",
- "security_gas_leak_detail": "gas_leak_detail_en.html",
+ "security_gas_leak_detail": "gas_leak_en.md",
"security_fire_title": "Fire",
- "security_fire_detail": "fire_detail_en.html",
+ "security_fire_detail": "fire_en.md",
"security_broken_elevator_title": "Broken elevator",
- "security_broken_elevator_detail": "broken_elevator_detail_en.html",
+ "security_broken_elevator_detail": "broken_elevator_en.md",
"security_electrical_outage_title": "Electrical outage",
- "security_electrical_outage_detail": "electrical_outage_detail_en.html",
+ "security_electrical_outage_detail": "electrical_outage_en.md",
"security_armed_person_title": "Armed person",
- "security_armed_person_detail": "armed_person_detail_en.html",
+ "security_armed_person_detail": "armed_person_en.md",
"security_earthquake_title": "Earthquake",
- "security_earthquake_detail": "earthquake_detail_en.html",
+ "security_earthquake_detail": "earthquake_en.md",
"security_medical_emergency_title": "Medical emergency",
- "security_medical_emergency_detail": "medical_emergency_detail_en.html",
+ "security_medical_emergency_detail": "medical_emergency_en.md",
"security_emergency_call": "Emergency call",
"security_reach_security": "Reach security",
diff --git a/l10n/intl_fr.arb b/l10n/intl_fr.arb
index ce5d2fe1c..afcd66269 100644
--- a/l10n/intl_fr.arb
+++ b/l10n/intl_fr.arb
@@ -258,25 +258,25 @@
"more_report_bug_step5": "sur le côté droit. \n\nEn mode navigation, vous pouvez naviguer librement dans l'application.\n\nPour passer en mode dessin, appuyez simplement sur le bouton 'Dessiner'. Vous pouvez maintenant dessiner sur l'écran.\n\nPour terminer votre commentaire, écrivez simplement une description ci-dessous et envoyez-la en appuyant sur le bouton 'Soumettre'.",
"security_bomb_threat_title": "Alerte Ă la bombe",
- "security_bomb_threat_detail": "bomb_threat_detail_fr.html",
+ "security_bomb_threat_detail": "bomb_threat_fr.md",
"security_suspicious_packages_title": "Colis suspect",
- "security_suspicious_packages_detail": "suspicious_packages_detail_fr.html",
+ "security_suspicious_packages_detail": "suspicious_packages_fr.md",
"security_evacuation_title": "Évacuation",
- "security_evacuation_detail": "evacuation_detail_fr.html",
+ "security_evacuation_detail": "evacuation_fr.md",
"security_gas_leak_title": "Fuite de gaz",
- "security_gas_leak_detail": "gas_leak_detail_fr.html",
+ "security_gas_leak_detail": "gas_leak_fr.md",
"security_fire_title": "Incendie",
- "security_fire_detail": "fire_detail_fr.html",
+ "security_fire_detail": "fire_fr.md",
"security_broken_elevator_title": "Panne d'ascenseur",
- "security_broken_elevator_detail": "broken_elevator_detail_fr.html",
+ "security_broken_elevator_detail": "broken_elevator_fr.md",
"security_electrical_outage_title": "Panne Ă©lectrique",
- "security_electrical_outage_detail": "electrical_outage_detail_fr.html",
+ "security_electrical_outage_detail": "electrical_outage_fr.md",
"security_armed_person_title": "Personne armée",
- "security_armed_person_detail": "armed_person_detail_fr.html",
+ "security_armed_person_detail": "armed_person_fr.md",
"security_earthquake_title": "Tremblement de terre",
- "security_earthquake_detail": "earthquake_detail_fr.html",
+ "security_earthquake_detail": "earthquake_fr.md",
"security_medical_emergency_title": "Urgence médicale",
- "security_medical_emergency_detail": "medical_emergency_detail_fr.html",
+ "security_medical_emergency_detail": "medical_emergency_fr.md",
"security_emergency_call": "Appel d'urgence",
"security_reach_security": "Joindre la sécurité",
diff --git a/lib/constants/preferences_flags.dart b/lib/constants/preferences_flags.dart
index 67ef95b64..5d5cb0110 100644
--- a/lib/constants/preferences_flags.dart
+++ b/lib/constants/preferences_flags.dart
@@ -35,13 +35,11 @@ enum PreferencesFlag {
discoveryMore,
// Dashboard flags
- broadcastCard,
aboutUsCard,
scheduleCard,
progressBarCard,
gradesCard,
progressBarText,
- broadcastChange,
// Rating flag
ratingTimer,
diff --git a/lib/features/app/error/outage/outage_view.dart b/lib/features/app/error/outage/outage_view.dart
index af5230b1f..4f9e84195 100644
--- a/lib/features/app/error/outage/outage_view.dart
+++ b/lib/features/app/error/outage/outage_view.dart
@@ -3,131 +3,70 @@ import 'package:flutter/material.dart';
// Package imports:
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
-import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:notredame/features/app/error/outage/widgets/outage_build_image.dart';
+import 'package:notredame/features/app/error/outage/widgets/outage_build_social_media.dart';
import 'package:stacked/stacked.dart';
// Project imports:
-import 'package:notredame/constants/urls.dart';
+import 'package:notredame/utils/utils.dart';
import 'package:notredame/features/app/error/outage/outage_viewmodel.dart';
import 'package:notredame/utils/app_theme.dart';
-import 'package:notredame/utils/utils.dart';
class OutageView extends StatelessWidget {
@override
- Widget build(BuildContext context) => ViewModelBuilder<
- OutageViewModel>.nonReactive(
- viewModelBuilder: () => OutageViewModel(),
- builder: (context, model, child) => Scaffold(
- backgroundColor: Utils.getColorByBrightness(
- context, AppTheme.etsLightRed, AppTheme.primaryDark),
- body: Stack(
- children: [
- SafeArea(
- minimum: const EdgeInsets.all(20),
- child: Column(
- children: [
- SizedBox(
- height: model.getImagePlacement(context),
- ),
- Hero(
- tag: 'ets_logo',
- child: Image.asset(
- "assets/animations/outage.gif",
- excludeFromSemantics: true,
- width: 500,
- color:
- Theme.of(context).brightness == Brightness.light
- ? Colors.white
- : AppTheme.etsLightRed,
- )),
- const SizedBox(
- height: 15,
- ),
- SizedBox(height: model.getTextPlacement(context)),
- Text(
- AppIntl.of(context)!.service_outage,
- textAlign: TextAlign.center,
- style:
- const TextStyle(fontSize: 18, color: Colors.white),
- ),
- SizedBox(height: model.getButtonPlacement(context)),
- ElevatedButton(
- onPressed: () {
- model.tapRefreshButton(context);
- },
- child: Text(
- AppIntl.of(context)!.service_outage_refresh,
- style: const TextStyle(fontSize: 17),
- ),
- ),
- Expanded(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.end,
- children: [
- SizedBox(
- height: model.getContactTextPlacement(context),
- child: Text(
- AppIntl.of(context)!.service_outage_contact,
- textAlign: TextAlign.center,
- style: const TextStyle(color: Colors.white),
- ),
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceEvenly,
- crossAxisAlignment: CrossAxisAlignment.end,
- children: [
- IconButton(
- icon: const FaIcon(
- FontAwesomeIcons.earthAmericas,
- color: Colors.white,
- ),
- onPressed: () => Utils.launchURL(
- Urls.clubWebsite,
- AppIntl.of(context)!)),
- IconButton(
- icon: const FaIcon(
- FontAwesomeIcons.github,
- color: Colors.white,
- ),
- onPressed: () => Utils.launchURL(
- Urls.clubGithub, AppIntl.of(context)!)),
- IconButton(
- icon: const FaIcon(
- Icons.mail_outline,
- color: Colors.white,
- ),
- onPressed: () => Utils.launchURL(
- Urls.clubEmail, AppIntl.of(context)!)),
- IconButton(
- icon: const FaIcon(
- FontAwesomeIcons.discord,
- color: Colors.white,
- ),
- onPressed: () => Utils.launchURL(
- Urls.clubDiscord,
- AppIntl.of(context)!)),
- ],
+ Widget build(BuildContext context) =>
+ ViewModelBuilder.nonReactive(
+ viewModelBuilder: () => OutageViewModel(),
+ builder: (context, model, child) => Scaffold(
+ backgroundColor: Utils.getColorByBrightness(
+ context, AppTheme.etsLightRed, AppTheme.primaryDark),
+ body: Stack(
+ children: [
+ SafeArea(
+ minimum: const EdgeInsets.all(20),
+ child: Column(
+ children: [
+ SizedBox(
+ height: model.getImagePlacement(context),
+ ),
+ outageImageSection(context),
+ SizedBox(height: model.getTextPlacement(context)),
+ Text(
+ AppIntl.of(context)!.service_outage,
+ textAlign: TextAlign.center,
+ style: const TextStyle(
+ fontSize: 18, color: Colors.white),
+ ),
+ SizedBox(height: model.getButtonPlacement(context)),
+ ElevatedButton(
+ onPressed: () {
+ model.tapRefreshButton(context);
+ },
+ child: Text(
+ AppIntl.of(context)!.service_outage_refresh,
+ style: const TextStyle(fontSize: 17),
),
- ],
+ ),
+ Expanded(
+ child: outageSocialSection(model, context),
+ ),
+ ],
+ ),
+ ),
+ SafeArea(
+ child: Align(
+ alignment: Alignment.topRight,
+ child: GestureDetector(
+ onTap: () => model.triggerTap(context),
+ child: Container(
+ width: 60,
+ height: 60,
+ color: Colors.transparent,
+ ),
),
),
- ],
- ),
+ )
+ ],
),
- SafeArea(
- child: Align(
- alignment: Alignment.topRight,
- child: GestureDetector(
- onTap: () => model.triggerTap(context),
- child: Container(
- width: 60,
- height: 60,
- color: Colors.transparent,
- ),
- ),
- ),
- )
- ],
- ),
- ));
+ ));
}
diff --git a/lib/features/app/error/outage/outage_viewmodel.dart b/lib/features/app/error/outage/outage_viewmodel.dart
index d5e108892..3edac6aff 100644
--- a/lib/features/app/error/outage/outage_viewmodel.dart
+++ b/lib/features/app/error/outage/outage_viewmodel.dart
@@ -20,7 +20,7 @@ class OutageViewModel extends BaseViewModel {
}
double getTextPlacement(BuildContext context) {
- return MediaQuery.of(context).size.height * 0.20;
+ return MediaQuery.of(context).size.height * 0.15;
}
double getButtonPlacement(BuildContext context) {
@@ -28,7 +28,7 @@ class OutageViewModel extends BaseViewModel {
}
double getContactTextPlacement(BuildContext context) {
- return MediaQuery.of(context).size.height * 0.04;
+ return MediaQuery.of(context).size.height * 0.10;
}
void tapRefreshButton(BuildContext context) {
diff --git a/lib/features/app/error/outage/widgets/outage_build_image.dart b/lib/features/app/error/outage/widgets/outage_build_image.dart
new file mode 100644
index 000000000..df19fc4b3
--- /dev/null
+++ b/lib/features/app/error/outage/widgets/outage_build_image.dart
@@ -0,0 +1,18 @@
+// Flutter imports:
+import 'package:flutter/material.dart';
+
+// Project imports:
+import 'package:notredame/utils/app_theme.dart';
+
+Widget outageImageSection(BuildContext context) {
+ return Hero(
+ tag: 'ets_logo',
+ child: Image.asset(
+ "assets/animations/outage.gif",
+ excludeFromSemantics: true,
+ width: 500,
+ color: Theme.of(context).brightness == Brightness.light
+ ? Colors.white
+ : AppTheme.etsLightRed,
+ ));
+}
diff --git a/lib/features/app/error/outage/widgets/outage_build_social_media.dart b/lib/features/app/error/outage/widgets/outage_build_social_media.dart
new file mode 100644
index 000000000..2e3b22f4b
--- /dev/null
+++ b/lib/features/app/error/outage/widgets/outage_build_social_media.dart
@@ -0,0 +1,61 @@
+// Flutter imports:
+import 'package:flutter/material.dart';
+
+// Package imports:
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+
+// Project imports:
+import 'package:notredame/constants/urls.dart';
+import 'package:notredame/features/app/error/outage/outage_viewmodel.dart';
+import 'package:notredame/utils/utils.dart';
+
+Widget outageSocialSection(OutageViewModel model, BuildContext context) {
+ return Column(
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ SizedBox(
+ height: model.getContactTextPlacement(context),
+ child: Text(
+ AppIntl.of(context)!.service_outage_contact,
+ textAlign: TextAlign.center,
+ style: const TextStyle(color: Colors.white),
+ ),
+ ),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ IconButton(
+ icon: const FaIcon(
+ FontAwesomeIcons.earthAmericas,
+ color: Colors.white,
+ ),
+ onPressed: () =>
+ Utils.launchURL(Urls.clubWebsite, AppIntl.of(context)!)),
+ IconButton(
+ icon: const FaIcon(
+ FontAwesomeIcons.github,
+ color: Colors.white,
+ ),
+ onPressed: () =>
+ Utils.launchURL(Urls.clubGithub, AppIntl.of(context)!)),
+ IconButton(
+ icon: const FaIcon(
+ Icons.mail_outline,
+ color: Colors.white,
+ ),
+ onPressed: () =>
+ Utils.launchURL(Urls.clubEmail, AppIntl.of(context)!)),
+ IconButton(
+ icon: const FaIcon(
+ FontAwesomeIcons.discord,
+ color: Colors.white,
+ ),
+ onPressed: () =>
+ Utils.launchURL(Urls.clubDiscord, AppIntl.of(context)!)),
+ ],
+ ),
+ ],
+ );
+}
diff --git a/lib/features/app/navigation/router.dart b/lib/features/app/navigation/router.dart
index 2bebe4fc2..fa4473472 100644
--- a/lib/features/app/navigation/router.dart
+++ b/lib/features/app/navigation/router.dart
@@ -55,20 +55,26 @@ Route generateRoute(RouteSettings routeSettings) {
return PageRouteBuilder(
settings: RouteSettings(
name: routeSettings.name, arguments: routeSettings.arguments),
+ transitionsBuilder: (_, animation, ___, child) =>
+ rootPagesAnimation(animation, child),
pageBuilder: (_, __, ___) => DashboardView(updateCode: code));
case RouterPaths.schedule:
return PageRouteBuilder(
settings: RouteSettings(name: routeSettings.name),
+ transitionsBuilder: (_, animation, ___, child) =>
+ rootPagesAnimation(animation, child),
pageBuilder: (_, __, ___) => const ScheduleView());
case RouterPaths.defaultSchedule:
- return PageRouteBuilder(
+ return MaterialPageRoute(
settings: RouteSettings(
name: routeSettings.name, arguments: routeSettings.arguments),
- pageBuilder: (_, __, ___) => ScheduleDefaultView(
+ builder: (_) => ScheduleDefaultView(
sessionCode: routeSettings.arguments as String?));
case RouterPaths.student:
return PageRouteBuilder(
settings: RouteSettings(name: routeSettings.name),
+ transitionsBuilder: (_, animation, ___, child) =>
+ rootPagesAnimation(animation, child),
pageBuilder: (_, __, ___) => StudentView());
case RouterPaths.gradeDetails:
return MaterialPageRoute(
@@ -78,6 +84,8 @@ Route generateRoute(RouteSettings routeSettings) {
case RouterPaths.ets:
return PageRouteBuilder(
settings: RouteSettings(name: routeSettings.name),
+ transitionsBuilder: (_, animation, ___, child) =>
+ rootPagesAnimation(animation, child),
pageBuilder: (_, __, ___) => ETSView());
case RouterPaths.usefulLinks:
return PageRouteBuilder(
@@ -111,6 +119,8 @@ Route generateRoute(RouteSettings routeSettings) {
case RouterPaths.more:
return PageRouteBuilder(
settings: RouteSettings(name: routeSettings.name),
+ transitionsBuilder: (_, animation, ___, child) =>
+ rootPagesAnimation(animation, child),
pageBuilder: (_, __, ___) => MoreView());
case RouterPaths.settings:
return MaterialPageRoute(
@@ -139,3 +149,17 @@ Route generateRoute(RouteSettings routeSettings) {
NotFoundView(pageName: routeSettings.name));
}
}
+
+Widget rootPagesAnimation(Animation animation, Widget child) {
+ return Align(
+ child: FadeTransition(
+ opacity: animation,
+ child: SizeTransition(
+ sizeFactor: CurvedAnimation(
+ curve: Curves.easeIn,
+ parent: animation,
+ ),
+ child: child,
+ ),
+ ));
+}
diff --git a/lib/features/app/presentation/webview_controller_extension.dart b/lib/features/app/presentation/webview_controller_extension.dart
deleted file mode 100644
index 6b98725f8..000000000
--- a/lib/features/app/presentation/webview_controller_extension.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-// Flutter imports:
-import 'package:flutter/services.dart';
-
-// Package imports:
-import 'package:webview_flutter/webview_flutter.dart';
-
-extension type WebViewControllerExtension(WebViewController controller)
- implements WebViewController {
- /// used to load the emergency procedures html files inside the webView
- Future loadHtmlFromAssets(String filename, Brightness brightness) async {
- final String fileText = await rootBundle.loadString(filename);
- final String data = darkMode(scaleText(fileText), brightness);
-
- await loadHtmlString(data);
- }
-
- /// used to add dark theme to emergency procedures html files
- String darkMode(String fileText, Brightness brightness) {
- String colorFileText = fileText;
- if (brightness == Brightness.dark) {
- colorFileText = colorFileText.replaceAll('',
- '');
- }
-
- return colorFileText;
- }
-
- String scaleText(String fileText) {
- return fileText.replaceAll(
- '',
- // ignore: missing_whitespace_between_adjacent_strings
- "");
- }
-}
diff --git a/lib/features/app/repository/author_repository.dart b/lib/features/app/repository/author_repository.dart
index 6c0f06782..b2b8dae8b 100644
--- a/lib/features/app/repository/author_repository.dart
+++ b/lib/features/app/repository/author_repository.dart
@@ -3,6 +3,8 @@ import 'package:notredame/features/ets/events/api-client/hello_api_client.dart';
import 'package:notredame/features/ets/events/api-client/models/organizer.dart';
import 'package:notredame/utils/locator.dart';
+// Project imports:
+
/// Repository to access authors
class AuthorRepository {
static const String tag = "AuthorRepository";
diff --git a/lib/features/app/widgets/base_scaffold.dart b/lib/features/app/widgets/base_scaffold.dart
index 7a31e400b..cfbccee3c 100644
--- a/lib/features/app/widgets/base_scaffold.dart
+++ b/lib/features/app/widgets/base_scaffold.dart
@@ -10,8 +10,8 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
// Project imports:
import 'package:notredame/features/app/integration/networking_service.dart';
-import 'package:notredame/features/app/widgets/navigation_rail.dart';
import 'package:notredame/features/app/widgets/bottom_bar.dart';
+import 'package:notredame/features/app/widgets/navigation_rail.dart';
import 'package:notredame/utils/app_theme.dart';
import 'package:notredame/utils/loading.dart';
import 'package:notredame/utils/locator.dart';
diff --git a/lib/features/dashboard/dashboard_view.dart b/lib/features/dashboard/dashboard_view.dart
index 71617d41c..136d8cf5f 100644
--- a/lib/features/dashboard/dashboard_view.dart
+++ b/lib/features/dashboard/dashboard_view.dart
@@ -7,7 +7,6 @@ import 'package:auto_size_text/auto_size_text.dart';
import 'package:feature_discovery/feature_discovery.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
-import 'package:notredame/features/app/signets-api/models/course.dart';
import 'package:skeletonizer/skeletonizer.dart';
import 'package:stacked/stacked.dart';
@@ -18,6 +17,7 @@ import 'package:notredame/constants/urls.dart';
import 'package:notredame/features/app/analytics/analytics_service.dart';
import 'package:notredame/features/app/navigation/navigation_service.dart';
import 'package:notredame/features/app/navigation/router_paths.dart';
+import 'package:notredame/features/app/signets-api/models/course.dart';
import 'package:notredame/features/app/signets-api/models/course_activity.dart';
import 'package:notredame/features/app/widgets/base_scaffold.dart';
import 'package:notredame/features/app/widgets/dismissible_card.dart';
@@ -80,6 +80,10 @@ class _DashboardViewState extends State
data: Theme.of(context)
.copyWith(canvasColor: Colors.transparent),
child: ReorderableListView(
+ header:
+ model.remoteConfigService.dashboardMessageActive
+ ? _buildMessageBroadcastCard(model)
+ : null,
onReorder: (oldIndex, newIndex) =>
onReorder(model, oldIndex, newIndex),
padding: const EdgeInsets.fromLTRB(0, 4, 0, 24),
@@ -96,16 +100,11 @@ class _DashboardViewState extends State
List _buildCards(DashboardViewModel model) {
final List cards = List.empty(growable: true);
-
// always try to build broadcast cart so the user doesn't miss out on
// important info if they dismissed it previously
for (final PreferencesFlag element in model.cardsToDisplay ?? []) {
switch (element) {
- case PreferencesFlag.broadcastCard:
- if (model.remoteConfigService.dashboardMessageActive) {
- cards.add(_buildMessageBroadcastCard(model, element));
- }
case PreferencesFlag.aboutUsCard:
cards.add(_buildAboutUsCard(model, element));
case PreferencesFlag.scheduleCard:
@@ -114,7 +113,6 @@ class _DashboardViewState extends State
cards.add(_buildProgressBarCard(model, element));
case PreferencesFlag.gradesCard:
cards.add(_buildGradesCards(model, element));
-
default:
}
@@ -459,43 +457,48 @@ class _DashboardViewState extends State
);
}
- Widget _buildMessageBroadcastCard(
- DashboardViewModel model, PreferencesFlag flag) {
+ Widget _buildMessageBroadcastCard(DashboardViewModel model) {
+ if (model.broadcastMessage == "" ||
+ model.broadcastColor == "" ||
+ model.broadcastTitle == "") {
+ return const SizedBox.shrink();
+ }
final broadcastMsgColor = Color(int.parse(model.broadcastColor));
final broadcastMsgType = model.broadcastType;
final broadcastMsgUrl = model.broadcastUrl;
- return DismissibleCard(
+ return Card(
key: UniqueKey(),
- onDismissed: (DismissDirection direction) {
- dismissCard(model, flag);
- },
- isBusy: model.busy(model.broadcastMessage),
- cardColor: broadcastMsgColor,
+ color: broadcastMsgColor,
child: Padding(
padding: const EdgeInsets.fromLTRB(17, 10, 15, 20),
- child: Column(mainAxisSize: MainAxisSize.min, children: [
- // title row
- Row(
- children: [
- Expanded(
- child: Align(
- alignment: Alignment.centerLeft,
- child: Text(model.broadcastTitle,
- style: Theme.of(context).primaryTextTheme.titleLarge),
- ),
- ),
- Align(
- alignment: Alignment.centerRight,
- child: InkWell(
- child: getBroadcastIcon(broadcastMsgType, broadcastMsgUrl),
+ child: model.busy(model.broadcastMessage)
+ ? const Center(child: CircularProgressIndicator())
+ : Column(mainAxisSize: MainAxisSize.min, children: [
+ // title row
+ Row(
+ children: [
+ Expanded(
+ child: Align(
+ alignment: Alignment.centerLeft,
+ child: Text(model.broadcastTitle,
+ style: Theme.of(context)
+ .primaryTextTheme
+ .titleLarge),
+ ),
+ ),
+ Align(
+ alignment: Alignment.centerRight,
+ child: InkWell(
+ child: getBroadcastIcon(
+ broadcastMsgType, broadcastMsgUrl),
+ ),
+ ),
+ ],
),
- ),
- ],
- ),
- // main text
- AutoSizeText(model.broadcastMessage,
- style: Theme.of(context).primaryTextTheme.bodyMedium)
- ]),
+ // main text
+ AutoSizeText(model.broadcastMessage,
+ style: Theme.of(context).primaryTextTheme.bodyMedium)
+ ]),
));
}
diff --git a/lib/features/dashboard/dashboard_viewmodel.dart b/lib/features/dashboard/dashboard_viewmodel.dart
index 92c00020b..804c31fac 100644
--- a/lib/features/dashboard/dashboard_viewmodel.dart
+++ b/lib/features/dashboard/dashboard_viewmodel.dart
@@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
import 'package:feature_discovery/feature_discovery.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:fluttertoast/fluttertoast.dart';
+import 'package:shared_preferences/shared_preferences.dart';
import 'package:stacked/stacked.dart';
// Project imports:
@@ -36,7 +37,6 @@ class DashboardViewModel extends FutureViewModel