CHANGELOG.txt

  1. 6.x CHANGELOG.txt
  2. 6.x modules/tinymce/lib/tinymce/changelog.txt
  3. 4.x CHANGELOG.txt
  4. 5.x CHANGELOG.txt
FlightPath 6.x Changelog
========================

2023-01-18
  Made a change to engagements module, when checking for all SMS messages.  Instead of checking for NOW - 1 DAY, it only checks
  for NOW - 3 HOURS.  For most of the time, this means it will only check for *today's* messages, except around midnight, where it will
  get the previous day's as well.  The aim is to retrieve less data, to lighten the amount of processing being done.
  
  Also made it so that we will not run the check for SMS messages (which simply refreshes delivery status, price, etc) more than
  once every 30 minutes.  This is also meant to lighten the amount of processing as well as how often we are contacting the signalwire API.
  

2023-01-11
  Added hook_...validate() functions to admin copy degree and admin duplicate year forms, so it won't mess up
  other modules.
  

2023-01-10
  Small tweak to system.js, so that the "large" dialog resizes better on a medium-sized tablets.


2022-12-19
  Fixed bug where dialogs were not closing after save (javascript had been disabled).


2022-12-10
  Fixed bug which was introduced in last version to the piechart engine, which made it stop working.
  
  Fixed bug in user module, which prevented manually creating staff users.
  

2022-11-12
  Edited pChart library to use new __construct() instead of class name for constructor functions.  This made it compatible with PHP 8.0.
  Also changed "var" keyword to "public" for variables, and set them to NULL instead of array(), especially since some of them
  are actually supposed to be objects.
    
  Made various other clean-up changes to make compatible with PHP 8.0.
  

2022-11-06
  Continued work to make compatible with PHP 8.0.
    

2022-11-05
  Cleaned up Administrator's Toolbox (courses) to make it cleaner.  Also fixed bug where it was not showing where
  a course was assigned.
  
  Continuing work to increase compatibility with PHP 8.0.
  

2022-11-04
  Added code to increase compatibility with PHP 8.0.


2022-11-03
  Changed "Login" button to "Log in" to be consistent with English rules.
  
  Added more options for TinyMCE, including links and the ability to resize the editor.
  

2022-10-31
  Clarified instructions for default advising term.
  

2022-10-27
  Improved documentation for definitions.
  

2022-10-25
  For the _fp_error_handler() function, made it so the $msg saved to watchdog (and possibly emailed)
  is no more than 10,000 characters.
  
  Fixed bug in lassie_cron() where we were not getting the most recent "last check" correctly.  It was causing
  us to check for long-running jobs on every cron run, rather than no more than once every 45 minutes (as intended).
  

2022-10-19
  Added function get_faculty_email() to db.inc file.
  

2022-10-18
  Modified email that engagements sends out, so that the link is wrapped in <a> tag.
  
  Moved $system_name variable in engagements so it is available when receiving unknown text messages.
  
  Fixed bugs when creating an altert from engagements (when receiving unknown text message).
  

2022-10-09
  Added ability to set breadcrumbs on content view.  
  
  Working on what happens when an unknown number sends a text message.  It should send a notification
  to appropriate recipient, and save message as an Alert.


2022-10-03
  Re-arranging in popup course description how we show that the db_grade is different than the assigned grade.  Only
  applies when we've made a modification due to the grade being numeric.  We will now show the original numeric grade first.
  
  Fixed bug where + was being converted to a space when passed through the URL for Course::to_data_string(). Using a replacement text now.
  

2022-09-26
  Added additional code to help prevent issues when invalid courses are defined in group definitions.
  

2022-09-22
  Fixed bug in install.php where we were not correctly setting up our GLOBALS['pdo'] object, causing fresh installs to fail.
  
  Fixed bug in system.module, where when we try to first store our serialized course cache, it incorrectly shows a permission error (because
  the file has 0 bytes).
  
  Fixed bug in alerts.install, one of the queries to create a table was invalid.
  

2022-09-19
  Fixed bug in Masquerade module where it wasn't allowing users to search by CWID.
  
  Added caching when fetching school name or code by id.
  
  Removed "department" from faculty table.
  
  Added indexes to student_degrees table.
  
  Fixed the "Advisor Use" report to pull department correctly.
  
  Adjusted the "Major Counts" report to not show school code if schools module not enabled.
  
  Altered the "Major Counts" report to show all degree levels (1, 2 and 3) not just 1 and 2.
  

2022-08-29
  Added lang='en' to <html> tag in core fp6_clean theme. This is for greater accessibility.
  

2022-08-18
  Removed unnecessary __autoload() function in index.php; was causing incompatibility with PHP 8.x.


2022-08-17
  Added tweaks to the static screen "dialog-empty", so that it displays a throbber graphic while loading.
  
  Changed name of dialog-empty to dialog-loading.php, for clarity.
  
  In clone_advising, made it so you can enter comments after # symbol.

  Moved the autocomplete function to find students from calendar module to the student_search module,
  and gave it more than the default option for output.  See student_search.module's student_search_ajax_autocomplete_student()
  for more details.


2022-08-12
  Fixed typos in watchdog() command in the engagements module.
  
  Fixed issue in engagements where all incoming SMS got an error relating to reading media which wasn't there.

  If a number sends a text message, and their CWID cannot be found, the notification message changes to reflect that.
  
  When saving a new notification, the insert id (hid in table notification_history) is returned.  


2022-08-11
  Cleaned up logic which loads permissions for users, using less memory.
  
  Added ability for students to schedule appointments with faculty & staff in other departments (not just their
  advisors).


2022-08-10
  Added breadcrumbs to certain admin functions.
  

2022-08-04
  Added new function to db.inc, making it easier to get school_id from a user_id.
  
  Added new setting to School Settings, for specifying departments.
  
  Made changes in School settings to accomodate new 'Appointment settings' form.  
  
  Altered User module to make use of the new "departments" setting as a select list rather than a free-type field.
  
  Built new 'Appointment settings' form, so admins may edit global settings having to do with who may accept appointments.
  

2022-08-02
  Moved around code so that the user module is responsible for displaying text message recipient options (instead of the code being
  in hook_form_alter from engagements).
  
  Fixed bug where deleteing last txt message option wasn't allowed when editing user.
  

2022-07-31
  Added new school setting that allows What If to show all degrees (not just undergrad or grad based on student's rank).
  
  Made it so on the permissions form, underscores are not shown when stating the module name.  Makes it look nicer.
  

2022-07-29
  Made an adjustment to system.module's function system_reload_and_cache_course_inventory(), such that we only get the 10 most recent catalog years
  when building the course inventory file.  We also limit it to 50,000 records, though this might be changed in the future.  By making this
  change, it keeps the files/cache_data/courses_serialized.info file relatively small and keeps it from growing out of control as more courses
  are added and duplicated each year.  This in turn uses up less RAM on the server.  
  
  Added extra css class to edit link for user attributes, making it easier to style later on.
  

2022-07-28
  On the Status page, the last cron run wasn't being displayed in the user's timezone.
  

2022-07-27
  Added small change to batch.js, to make it run slightly faster.
  
  Fixed on-screen text for SMTP module settings page.
  

2022-07-25
  Added new property "extra_attribs" to Course object, so other modules can add extra data (as a string) to courses.  Cannot contain a ~ as that is a reserved
  character.


2022-07-24
  When building semesters on the Degree or What If screen, made sure that their "req_by_degree_id" was set correctly.
  
  Modifications to advise_init_screen() function, and others, for extended support for other modules.


2022-07-23
  In the popup group description function (in AdvisingScreen), we now include the group as a non-rendered object in the $render array, so that other
  modules can act on it in hook_content_alter().
  
  Added weights to render array for displaying view (Degree and What If), so other modules can more easily manipulate.

  Created new hook: hook_init_flightpath_degree().  This allowes modules to act after FlightPath::init() has been called.  
  
  Added new method to ObjList, to refresh_indexes().  Should be called after we remove a course from a list manually.
  
  Added new hidden variable to advising screen: reinit_fp_after_draft_save.  If set to 'yes', then after a draft save the $fp variable with
  perform a fresh init() after a draft save.  This is primarily used by other modules which might be making changes to the degree plan in real time,
  and do not want to reload the entire student.  By default it is set to 'no', replicating existing functionlity that skips that step.
  
  Converted the AdvisingScreen::build_footnotes function to use render array, so other modules can add footnotes if necessary.
  

2022-07-22
  Added extra class to pie chart rows-- the total number of intended rows.  This lets us target with CSS with more precision.


2022-07-19
  Small change to popup course description, so repeat hours do not show excess zeroes.
  
  Made changes so that you can have specified repeats in groups with branches.
  

2022-07-12
  Made modifications to student_priority module, so that tests can be pulled directly from user attributes, rather than having
  the need to run an entire function.  Both methods are documented in the .api.php file.
  

2022-07-11
  Made a small change in user.module, so that attributes with quotes in the title show dialog correctly.
  
  Fixed documentation error.
  
  Removed hard-coded student priority tests/calculations.  Instead, added to the api.php file.
    

2022-07-04
  Updated some display code in student_search.
  
  Altered checkbox for inactive students code in student_search submit function.
  

2022-06-30
  Small adjustment in engagments-- made email tracking token sha512, and based on microtime + extra randomness to try to ensure uniqueness.
   

2022-06-27
  Made it so the system only tries to trim the watchdog once every 7 days, rather than on every cron run.
  
  Added extra wording to some watchdog entries for clarity.
  

2022-06-23
  Fixed small bug where CSS class was not being specified on left sidebar items.
  
  During the "duplicate entire catalog year" function, there was a die() statement if a group couldn't be found.  Changed
  that to simply display a message.
  

2022-06-17
  Added new function to DatabaseHandler, where we can request a new advising_session_token, and be guaranteed that it does not already exist.  Updated FlightPath class
  to make use of it. 
  

2022-06-15
  Modified user module to make it easier to filter for users.  Made it function more like FP 5, where setting a filter actually shows you
  all values under that filter, and you don't have to search by letter as well.  For students, this is true, except we do not reset values
  for "is_active" when searching by letter or other filter values.
  

2022-06-07
  Fixed bug when editing user attributes from the users screen, where if no "fields" index is set, we weren't correctly creating a default
  field called "value" that's a textfield.
  

2022-06-01
  Small modifications to help eliminate bugs in menu items showing in a menu block.
  

2022-05-29
  Adjusted hook.api documentation.
  
  Altered alerts to allow for targetting specific faculty/staff by CWID, and NOT sending the alert to the student's advisor.  Also, if the student_id
  field is left blank, it will show as "N/A" on the Alerts page.  This is useful if you have alerts, sent to specific users, which do not
  directly have anything to do with a student (ie, system alerts).
  
  Adjusted displays to cope with new alerts setup.
  
  Fixed bug with alert counts.
  
    
2022-05-23
  Fixed bug where hook_update() wouldn't be called if the module was under custom/modules/_dirname (beginning with underscore).
  

2022-05-19
  Modified when we render a menu item in HTML, to include more details about its title and path as CSS classes, making it easier
  to theme or hide as needed.
  

2022-05-17
  Fixed bug in permissions where admin_restricted perms were not being saved correctly.
  
  Added a new form element type: "value".  This is a hidden value which must not change.  If it does change from what is defined in the form,
  the form will not validate and an error message will be shown.  This is a security feature so that malicious users cannot change hidden
  field values which are meant to be immutable.
  

2022-05-13
  Made small alteration in DegreePlan, so that if a degree title is blank, we don't see a message like "This groups belongs to" (with no degree
  title) in the Courses Added by Advisor group.
  
  Made content module handle checkboxes a little better.  Instead of saving as serialized array, it saves as a string which can be queried
  using LIKE.  A little cumbersome, but better than if it is serialized.
  

2022-05-11
  Added concept of "admin_restricted" to permissions.  If set, then it will only appear for the admin user (user_id = 1).  This way
  you can give the "edit permissions" permission to users and still not let them access the potentially dangerous areas.
  
  Masquerade will not allow a user to become admin (user id 1).


2022-05-08
  Fixed logic in advise module where number of advised students for a particular course were not being calculated correctly.
  

2022-05-06
  Tweaks in user.module to make custom attributes more configurable.
  

2022-05-04
  Changed wording of setting in system.module.
  

2022-05-03
  Modified user.module so that defining user attributes is easier; it will assume it's a textfield and name "value" if no field or
  display information is given.


2022-04-29
  Modified function csv_multiline_to_array to make it smarter and not throw warnings so easily.
  

2022-04-27
  Modified the email sent out by a db_error to include the query/args, to make it easier to debug.
  
  Removed jquery ui's package.json file to prevent github from flagging unsafe dependencies (which are not being used)
  

2022-04-18
  If a semester block is empty, we do not show it on the degree / what if tabs.
  

2022-04-17
  Made it so that the theme always defaults to fp6_clean (included with core), and it is not set in the settings file.  Got rid of the
  "display_mysql_errors" line in settings.php, since it is not used any longer anyway.
  

2022-04-16
  Added code to lengthen timeout during cron runs.
  
  Added code to content module to delete content (and files) marked with delete_flag = 1.  Same for advise module, admin, and comments modules.
  
  Fixed bug to where if you try to view content which doesn't exist, we go to a 404 error.

  Removed getting variables in settings.php file.  Instead, they will be "lazy-loaded" as-needed.  Altered stats module to make sure to use variable_get() syntax
  instead of trying to load directly from globals array.
  

2022-04-15
  Added extra permission to prereqs module, so that you can only override locks on courses if you have permission.
  
  Adjusted the "locked but checked" icon for courses in prereqs, to make the check a little more obvious.

  Removing alerts (from the confirm remove dialog screen) shows spinner icon when clicking button.
  
  Upgraded included PHPMailer library from 6.0 to 6.6 to take advantage of newer code with security enhancements.
  
  Fixed bug where files being emailed were not being decrypted BEFORE being sent as email, making them unreadible to the recipient.
  

2022-04-12
  Added extra classes to engagements for text messages, to say which phone number the message was being sent from and to.  This should help with styling if you want
  to have different colors or other styles based on what phone line it was sent to or from.


2022-04-11
  Removed concept of trying to "preload" a set number of courses on login.  This is now handled in a more elegant way.
  
  Added link to schools help page to schools module settings page.
  
  Added "Loading" dialog when you search and receive a single student. 
  
  Changed "Advisee Alerts" tab to say just "Alerts".
  
  Placed all db connection code in settings.php, and put the pdo into GLOBALS, so we only make 1 database connection per page load.
  
  
2022-04-10
  Added more messages on login page for if login failed (admin user is only one allowed, students not allowed, etc).
  

2022-04-04
  Using font awesome question-circle icon for popup_description link instead of regular question mark.  Also used margin to add a little more spacing.
  

2022-04-02
  Adjusted weights to better alphabetize the admin console menu items.

  Added new silk icons to system module directory.

  Added ability to have "pseudo" opt-groups for checkboxes fields, where checkboxes can be grouped
  the same way select lists can, in a multi-dimensional array.
  

2022-03-31
  Added small bit of code to advise.module to stop notice/warning from happening.
  

2022-03-30
  Added extra classes to tabs and sub-tabs to make them targetable by CSS.
  
  Added extra classes to History tab sections to make them more targetable by CSS.
  
  Added extra class to section titles to include machine-readable versions of the title, for CSS.
  
  Similarly added to student files module to make CSS styling easier.
  

2022-03-29
  Fixed a subtle bug where if a course was being advised to take in a group that was split between two different semesters,
  it was possible that it would attempt to be saved into the first semester num of the group's first appearance.


2022-03-28
  Minor change in System.  When trimming watchdog table of DEBUG statements, made sure that "max age" was an int using intval().
  
  Fixed bug in core's course search edit submit, where it would never work.  Probably a result of my recent work.
  

2022-03-25
  Adjusted look of textareas in form elements to have similar rounded corners and such as text fields.


2022-03-22
  Added hook to course_search, so that other modules can modify the "course not scheduled" result.  See new file course_search.api.php.
  
  For the pager_query() functionality, look for value in $_REQUEST instead of just $_GET.
  

2022-03-21
  Added hook to course_search, so that other modules can modify the "course rotation schedule".  See new file course_search.api.php.


2022-03-20
  Changed how we cache the course inventory.  Now using a file to cache to hard disk, making it much faster to read into memory than using multiple database queries.
  
  When applying draft changes, the courses cache file is automatically deleted and re-written.
  
  Added indexs for courses and draft_courses for the exclude and delete_flag columns.
  
  Added new cache variable which lets us know when course cache was last generated.  Users will check that variable in key places to see if they need to reload
  their course inventory from file.
  
  Moved the logic for generating and saving the course inventory to the system module, to make it easier to work with.
    

2022-03-19
  Altered prereqs module to better explain how it's hook system works.  Added prereqs.api.php to describe hooks.
  
  Added new column to advising sessions:  most_recent_session.  This will be set to 1 (one) if this is the most recent advising session (across multiple terms)
  for the student.  Otherwise, will be zero.  This helps in certain queries and reports. 
  
  Removed code which was adding the "course inventory" to the SESSION.  This was only being used in 2 places, and never when actually loading a course.  Therefor,
  it seems it is not needed.

  Added new column to student_courses: course_id.  This makes it much easier to search for specific courses in this table.  Defaults to zero (0).
  

2022-03-17
  For menu items, if there is an icon, give it an ALT tag of whatever the title of the menu is.
  
  Made sure the logo image for FlightPath had an alt tag.
  
  Made the 'Welcome to FlightPath' message on login page use the system_name variable.

  Added new modal dialog for "loading" and "updating", which dims screen and is more visible than old method that showed
  when logging in or waiting on dialogs to save (like subs or moving courses).
  
  Cleaned up way that scrollTop was calculated for pages.  Will eventually use window.scrollY if no other method can be found.  Also, placed into system.js so it is always
  available in one spot, as function fpGetScrollTop().
  
  Made it so that if "scroll_top" is in the $_REQUEST when we submit a form, it includes that value when the form does an fp_goto and reloads.
  

2022-03-12
  Added new feature to function get_term_structures, where "term_suffix" is now one of the values returned, instead of just being
  in the key of the array.
  
  Altered functions in stats so that we can override the default breadcrumbs on the form where we select the school. 

  Made sure course_search also excluded courses with delete_flag set.


2022-03-11
  Modified course_search_dislay_search to use render array system, so other modules can make modifications.
  
  Added weights to course_search edit form, making it easier for other modules to make modifications.
  
  

2022-03-09
  Added abiility to filter by degree level (UG or GR) on the admin console -> degree list screen.
  
  Changed comments and removed old code from hook.api.php.
  

2022-03-08
  Fixed a bug when sending the "Contact the FlightPath Production Team" email, where the last selected student CWID was not appearing.
  
  Removed the outdated "addslashes" to the msg of the email from the Contact link.  Also added a "close window" button on the "Thank You" page.
  
  Advising history changed slightly to have a "minimal" text option, specifically for the "email events" module.
  

2022-03-07
  Made it to where emails for mysql and PHP errors first convert times into system (or user) timezone, as well as display which user
  triggered the error.
  
  Added watchdog debug statement any time we send an email via fp_mail() function.  Added logic to prevent infinite loops if mysql server is down.
  

2022-03-04
  Fixed typo in code which was causing advisor name not to show on the advising history tab.
  

2022-02-25
  Added code so that the system can have a default tab to load for students, if not overridden by the individual user's settings.
  

2022-02-21
  Modified .htaccess for compatibility with Order directive throwing a 500 error in some implementations of Apache 2.4.  Thanks, Apache!  
  
  Added extra class to html when drawing pie charts, to show the degree level num (1-3) as well as the "classification" (MAJOR, CONC, etc).
  
  Made the popup course description show midterm grades in a superscript correctly.
  
  Fixed a bug when rendering radios, where if we were passed an array for the value, it wouldnt' work, only strings.  However, this
  caused a problem on the What If selection screen.
   

2022-02-15  
  Added new column to content__engagement:  to_sms_phone.  This is so we can keep up with what number this txt message was sent TO.  Useful for
  schools with more than one number.  Only applies to engagement type txt_msg.
  
  Added a message on engagements screen when a sent txt message is not delivered.
  
  Altered "engagements received" tab (under alerts) to show txt messages sent to us even though they may not be our advisee.  This is based on
  phone numbers which we are marked as should receive notifications for.
  

2022-02-14
  Added new tab to the Alerts (bell icon) page.  Engagements (txt or email) sent by student.
  
  Made it so the bell icon badge is recalculated every 1 second to 20 minutes (based on a system setting).
  
  Fixed a bug to where when you logged a received email, it actually SENT the email to the student's address.  Same for SMS.
  
  Fixed bug in media.css where it was causing some things to be scrunched up.
  
  Made it so the notification (when you receive a txt from a student) says what number/line name they sent it to.
  
  Made is to that the student_activity record that is created when we receive a txt message states what number/line it was sent to.

  Sometimes we get "7BIT" code issues in email bodies, where things like a non-breaking space appears as =C2=A0.  Added functionality
  to convert to standard HTML instead.
  
  Fixed bug where if you do not have any advisees, you should see nothing on the "Advisee Activities" tab.  Same for Advisee Engagements tab.


2022-02-13
  Added ability to have replacement patterns in menu item titles.  Good for changing values in tabs.
  
  Minor tweaking to working and examples in hook.api.php.
  
  Modified alerts module to report how many unread alerts there on on tab.
  
  More work on the alerts bell "badge" logic.
  

2022-02-12
  Minor tweaks to CSS
  
  Preparing to enable "basge" functionality for the alerts bell.

  Created a new hook "hook_get_alert_count_by_type()" which will let a module declare the total, read, and unread
  counts of *something* (probably content), we we can decideif we need to place a badge on the bell icon at the top of
  the screen.
  
  Created new functions in misc.inc to interact with the hook, as well as a change to content when we set the "last access"
  value, as well as when we create, edit, or delete any content.
  
  

2022-02-09
  Fixed bug where we were checking the wrong permission for adding and editing content from the content page.
  

2022-02-08
  Fixed bug in content module such that you could only have a "file" field if it was named "attachment".  Also added
  the ability to have more than one file field per content form.
  
  Added a little extra styling for form fields in content forms.


2022-02-04
  Made it so if a numeric grade is supplied with MID at the end, it is converted to a letter grade with MID at the end.
  
  Added new function, fp_confirm(), which is meant to work with fp_get_js_confirm_link() to create a modal confirm popup,
  instead of native javascript popup.  From same creator as the fp_alert() dropin replacement.
  

2022-02-02
  Fixed bug where student name was being used instead of faculty name when sending a txt message via Engagements.
  
  Also fixed bug where if student has no number, it was showing that they had opted-out, which was not necessarily true.

  Added extra spans and css styling when showing pie charts.

  Changed delete links on History tab to use simple "X" from font-awesome, both
  for advising and student files.
  
  Changed queries for advising history to look up "groups" of advising sessions by advising_session_token.
  
  Added ability in creating a confirm link (in misc.php) to have a link title
  so something appears when you hover over link.

2022-01-30
  When drawing pie charts, use base_url() instead of function base_path() to use the pchart library. Added more CSS class to make it easier to theme later.  


2022-01-27
  Fixed bug where draft mode was no longer accessible.

  Fixed several bugs where school_id was not being taken into account with regard to track selection.
  
  Fixed FlightPath::get_all_courses_in_catalog_year()-- noticed that it was hard-coded to only return undergrad courses.  Added
  a boolean to change that.
  

2022-01-26
  Tweaked logic to function that "balances" the student profile attributes.
  
  
2022-01-19
  Added new function: db_get_user_id_from_user_name()


2022-01-17
  Added ability to change site logo (in system settings).
  
  Added "powered by FlightPath Academics" to bottom of page template.
  
  Correcting if statements checking for if hours < 1 to if hours == 0, since some courses at some
  schools may be less than 1 hour.
  

2022-01-16
  Changed the 404 error to log as "page_not_found" type, instead of "system", as it shows up quite a bit in the logs and can be
  difficult to sift through for valid system messages.
  
  Updated Lassie message to show time in site's default timezone.
  

2022-01-15
  Fixed bug where degrees, groups, and courses not in school 0 were showing up (and causing problems) when the schools
  module was turned off.  Changed the logic so that when schools module is not enabled, we will only be shown school=0.

  Added "date" as element type for form api.
  
  Added new hook to user module, allowing us to change the display value of a user attribute.
  
  Tweaked function to "balance" the profile items on a page.


2022-01-13
  Minor edit: cleared up wording for mass sms permission.
  
  Fixed bug where mass txt was not possible except for admin user because
  we were checking the wrong permission.
  
  Small change to fp_space_csv function, to reduce double-spaces.
  
  Fixed bug in course search edit, where it was not showing terms correctly based on school_id.
  
  Added extra message to schools module.
  
  Added ability to have user editable attributes for other users.  Must set permission. See user.api.php for help
  on how to "register" these custom attributes.
  

2022-01-12
  Added ability to register and edit user attributes from the student profile page.  Saves automatically to the user_attributes table.  Created user.api.php
  to help illustrate how the hook works.
  
  The user module also automatically adds permissions for new attributes.
  
  Added a convenience function to help "balance" the profile_items array between leftside and rightside, so we can easily "push" items onto it and
  they automatically fall into place.
  

2022-01-10
  Modified content.module to make sure a specific bug didn't happen where redirections might not be seen, as well
  as added strip_tags() to values read directly from $_REQUEST.
  
  Fixed bug in group definitions, where if there was a blank line, or somehow a course with no subject_id, it could cause a problem.
  

2022-01-09
  Removed extraneous testing functions.
    
  Added to logged 404 and 403 errors, added the location to the msg so it shows in the watchdog view.
  
  Added function to course_search to get capacity for particular course.

  Updated system to add more indexes to advising tables.
  

2022-01-08
  Fixed bug where "public files" tab was showing on all "add" content screens.
  
  Changed verbage so that SMS text messages change from "TXT" to "Text messages" throughout FlightPath modules.
  
  Implemented new setting in GUI to opt-out of receiving text messages.
  
  Implemented opting-out of text messages if user replies STOP.  Opting back in if they send UNSTOP or SUBSCRIBE.
    
  Removed accidental hard-coded signalwire setting.
  
  Implemented change to sms_history table so we can also track error messages and delivery status.
  
  Only update SMS record (in sms_history table) if price or err_code value changed.
  
  Added extra watchdog (debug) statements for when cron starts and stops.
  

2022-01-07
  Added numerous new watchdog() statements to better track admin actions, like creating and deleting degrees, groups, etc.

  Made the default time to delete watchdog debug statements 1 year instead of 90 days.
  
  Made the default time to delete normal watchdog statements 3 years instead of 1.5 years.

  Always add a "text STOP to opt-out" type message to the end of every sms message.
  
  Altered encounters SMS settings to let user specify which phone numbers are specifically for mass text messages.  The
  mass text messaging form will only select those.


2022-01-04
  Added ability to send arguments to fp_goto() as an array.
  
  Added ability to install Zoom (if zoomapi module is enabled) from login form.
  
  Changed position of email address question in install.php
  
  Fixed bug in content module where attributes field in db data content_files wasn't being created on install.
  

2022-01-03
  Added new permission just for clearing system cache  (was using administer_modules, which isn't really the same thing)
  
  Added ability in public files to replace existing filename if it already exists.
  
  Changed course popup description to note when a student was enrolled in a course, vs. just showing the enrolled
  grade (ex: "E").
  
  
2022-01-02
  Added extra verbage to cli.php to make it clear it should be run as the webserver user.
  
  
2022-01-01
  Added new base_url() function.
  
  Created new concept of "public files" which users may upload to a special directory under /custom/files/content_uploads/public_uploads.  This screen is on a subtab
  from the normal Content screen, and allows users to upload and delete files (with allowed extensions) for use outside of FlightPath, or when linking
  to CSS or other files from within settings.
  

2021-12-30
  Added new indexes to watchdog table for faster reporting.
  
  Fixed typo in descriptions in encryption module.

  Updated cli.php to also allow db updates from the command line, as well as display help if no arguments
  are sent, or if ?, -h, --help, or help or sent.
  

2021-12-29
  Added more permissions and security checks when accessing files and content, especially of the user is a student and just trying out
  URLs.  We make sure they do not have access to any content, comments, or files they aren't supposed to see.  
  
  Added icon for encryption module, removed old, unused settings from hook_menu items throughout FlightPath.
  

2021-12-28
  Adding new module to core: encryption, and setting up key variable in settings.php on installation (giving it a random string value at the time of
  installation).
  
  Adding ability to save all content files as encrypted, and properly decrypt them for end user, based on if the user has permission to view
  the original content it was attached to.
  

2021-12-27
  Adding ability to have encrypted files for content_files.  Also, that table tells which piece of content the file belongs to, if any.
  
  Made it so if $content->title is unset, false, or null, then on save we give a simple default value.  This is to stop of mysql integrity
  constraint where the title cannot be null.

  Altered engagements so that received files (via email or SMS) go to temp directory on server first, before we then attach them to a piece
  of content via its cid in the content_files table.
  
  Fixed minor sorting issue on Engagements main tab screen.
  
  Altered content module's install so that is_encrypted and cid are both in the table, so we can figure out which piece of content (and therefor, permissions)
  the file is related to.
  


2021-12-22
  Added a strip_tags() call in course_search module, just to make sure we do not display dangerous user-supplied input.


2021-12-21
  Stored results of content_get_types() to a simple GLOBALS cache to reduce amount of times we look for it.
  
  Altered Calendar module to include instructions for de-authorizing Zoom.

  Fixed bug in Calendar where Zoom was hardcoded to look for user 1 (admin) tokens.
  

2021-12-19
  Moved all Zoom functionality into its own (private) module called zoomapi.  Updated other core modules to adjust and check for zoomapi before trying to call
  functions. 


2021-12-18
  Fixed bug in system_enable_module() where status was being sent the schema value instead of "1"


2021-12-17
  Cleaned up old comments.
  
  Fixed bug where we were determing a course's transfer eqv.  It was failing even though the souce hours were within the range
  of min and max hours.  (We were only looking at == max hours, rather than a range from min to max).

  Fixed bug so that the "mini search" at top of the screen will cause the Students tab to "remember" last search.
  
  Added concept of "return to student" to the top nav of all pages, so you can quickly return to the last student you had pulled up.
  This only works for faculty users with something in $_SESSION['last_student_selected'].
  
  Added "E" to default enrolled grades, and "F,W,I" to default retake grades.

  We now log (as WATCHDOG_DEBUG) when user tries to access a page and gets either a 404 Not Found or 403 Access Denied.

  Suppress rare warning when calling session_destroy().
  

2021-12-15
  Adding some extra instructions for the edit groups page.

  Fixed bug where courses worth less than 1 credit hour were not showing as repeatable in groups, even when the "set catalog repeats" box was checked.
    
  Adding concept of "delete_flag" to advising_sessions table, similar to the advising_comments table.  Also added permission to let users delete advising sessions
  for up to 3 months after posting, again, similar to the comments module.
    
  Updated comments module to make sure only the original author of a comment can delete it.
  
  
      

2021-12-14
  Added extra protection in our _fp_error_handler to not accidentally log passwords in plaintext.
  
  Fixed small bug in viewing watchdog entries where page was set to 1, always sending us to the second page
  of results if we clicked the Watchdog breadcrumb. 
  

2021-12-13
  Added code to create /custom/files/content_uploads/ folder.  Updated content module and engagements module
  to place uploaded files there.
  
  Fixed spelling of "README" file.
  

2021-12-12
  In calendar, when parsing ical feeds, we now correctly ignore time marked as "free" (transp == TRANSPARENT in the event).  Also fixed bug where you couldn't schedule appointments
  on the exact start and stop hour of a date's availability window (based on the "default" setting for that unavail time).
  
  Altered the way Zoom API works to better support api specs for Zoom marketplace apps.
  
  If SMS is not enabled, then txt messages cannot be selected as a default notification method.
  

2021-12-09
  Added more watchdog (debug) statements having to do with checking IMAP server for messages.
  

2021-12-08
  Fixed error in engagements where test name was being shown as author of engagement.
   

2021-12-07
  Small modifications to media.css.
  

2021-12-02
  Added a README.txt file under custom/themes so that the themes folder will be created upon install.
  

2021-11-26
  Implemented multi-factor authentication (via email) for local users.  The user can also choose to have their device "remembered" for 30 days, so they are not asked to
  re-authenticate every time.  This will only work for local users with email addresses saved.  Users with no email address, or users using LDAP, SSO, etc, will not
  be prompted to enter MFA code.
  
  Added convenience string functions like str_starts_with() to misc.inc, if not included.  These are implemented in PHP 8; they are here for users not running PHP 8.
  
  Added admin email address as a required field in the initial install script for FlightPath.


2021-11-23
  Fixed bug where advising snapshot (on dashboard) wasn't taking all advisees into account, only the first 20.  Simultaneously added
  code to allow for more than 20 student results at a time.  Previously 20 was hard-coded, not a variable.

  Converted the "Contact the FlightPath Production Team" popup window into a dialog.


2021-11-19
  For the content type "schedule_unavailable_time", changed the ics url field to a textarea and text (in mysql) to be able to handle URLs longer than 255 chars.

  Fixed bug in install process where current schema of modules were not being set, causing the user to be told they need to run db updates even
  on first install.
  
  Enable almost all core modules on initial install.
  
  Modified smtp module so that if we send a blank message it will just not send (but log it) rather than show an error message.
  

2021-11-18
  Added "spinner" to submit button for duplicating an entire year of degree data.

  Watchdog page converted to use sortable table and pager query.  Also added severity as column.
  
  Fixed bug in major students progress report (wasn't paying attention to school properly)
  
  Fixed bug where if student's school wasn't set correctly, it would look it up upon object creation.
  

2021-11-16
  Gave "clear all cache" its own permission.
  
  Cleaning up CSS.


2021-11-02
  Added concept of "capacity" to course_search module (stored per-term in the course_rotation_schedule table).  Also added extra CSS when editing course schedule 
  information.


2021-10-28
  Fixed bug in course_search module where the filter for "view courses offered" (and you select the term) was not working as expected
  in all situations, because it was not taking the school_id into account.

  Made the users module filter selection more intuitive.  For example, the school selection, and the behavior when you search
  for a particular name, while a school is selected.  Plus, made sure not to reset ALL filters if you select a letter.  For example,
  you can now select a school, and then select by letters to see the students/users in that school.  The Major pulldown also gets altered
  based on selected school.  Also changed the order of the sub tabs so that Student Users comes second.



2021-10-27
  Added a new "how to customize" folder and custom theme which inherits from fp6_clean theme.  It also includes instructions
  in a README file for copying the theme to your /custom/theme folder and overriding CSS styles.

  Added new function to make CSV strings prettier by adding a space after the comma.  Makes them break correctly in HTML.  Also
  changed term settings fields for advising settings from textfield to textarea, so you can enter more than 255 chars.
  

2021-10-24
  Added ability to designate notification recipients for when a student sends an SMS to a specific line (advisors will *always* receive
  such notifications from their advisees).  This is a setting on the admin/user page for faculty-staff members only.


2021-10-21
  Added new concept to textareas with a maxlength set.  It will now by default show the character count up to the max.

  Completed sending mass txt messages with Engagements, and getting back results in a CSV.


2021-10-20
  Made alteration to student_search so that if you have schools enabled, and search for a major within a school, you only see results for that
  school.  Also, fixed bug where if more than one school had the same major code, it was skipping over them.
  
  Fixed some malformed HTML in the user module causing placeholder text to look weird.
  
  Fixed a bug by adding permission to schools, to permit a user to edit users/students from a particular school.
  

2021-10-17
  Minor change in admin.module to fix typo.
  
  Implemented sending mass text messages function as part of the Engagements
  module.


2021-10-14
  Fixed bug in notify module, where the notification history table wasn't created.

  Added permissions on a per-phone number level for sending SMS messages.

  Engagements show which department/description the SMS was sent to or from on the main screen.


2021-10-13
  Made changes to engagements schema, so that we can track the SMS number a txt message was sent from, as well as the sms message id, in the table.

  Made change to content_versions table schema, so we have the option of saving a "log" message with the content.  This is accomplished by entering:
    $content->log = "some text here"; 
  before calling content_save($content);


2021-10-12
  Working on Engagements' ability to have multiple numbers on account they can receive SMS from.
  

2021-10-11
  Fixed bug in Engagements, where it was not showing attached files correctly from SMS.

  Changed how we handle incoming SMS messages to better catch "real time" messages.


2021-10-10
  Cleaned up code in various places.

  Fixed bug in Engagements where date_sent was not in correct format.  Also fixed old code which was causing a PHP syntax error for txt messages.

  Added function db_get_cwid_from_user_id() to db.inc file.

  Added missing function engagements_handle_incoming_sms() to engagements to stop 404 error, though at the moment this function is just
  a placeholder, and might be removed in the future.


2021-10-08
  Upon system install, correctly get the modules' schema from their .info file, so we aren't told we need to run updates right off the bat.
  

2021-10-07
  Made changes to content module, so that we keep track of each version's author (user_id), but the original
  user_id in the content table doesn't get overwritten.  This lets admin edit an existing piece of content, for example,
  without us losing track of who the original author was, or who the author is of each version.

  Added some extra CSS to Advising Screen, for the table rows containing the pie charts.  Should make it easier
  to selectively hide or show them for future CSS devs.

  
2021-10-05
  Added a "view combined" link on History for advisings of multiple terms, so you can see all the selections on
  one screen.
  
  Added new column to "advising_sessions", called "advising_session_token".  It is the same value when we advise for
  1 or more terms. It makes it easier to get a list of all the terms that were advised at the same time, and possibly can
  be useful in the future for other modules.
  

2021-10-03  
  Made it so the db updates system uses the Batch API so it won't timeout over long update jobs.
  
  Made it so that the watchdog "message" column is "longtext" instead of just "text".  Same for announcements, alerts, and other core modules' tables.
  This was to prevent users from entering more than 65kb of text in a single field, something that was indeed a possibility, especially in the watchdog
  table when debugging complex datatypes.  The decision was made to either use blob or "longtext" from now on, instead of "text", as it can store up to 
  4gb of data, with only a 2 byte increase in overhead over "text".
  
  Modified content module so we only look for content whose modules are enabled.  This was done
  to prevent a PHP warning message, and to prevent strange behavior if we tried to edit previously
  submitted content.
  
  Made minor edit to batch test routine to better illustrate how limits work.
  
  Minor tweak when loading degree to prevent PHP warning.
  
  Since "groups" is a reserved keyword in MySQL 8+, edited various files to enclose in backticks when performing sql on that table.
  

2021-09-27
  Altered weights in dashboard render array for consistency.
  

2021-09-26
  Increased weight of submit and delete buttons in content module.
  
  
2021-09-22
  Made it so custom content types' add form is automatically allowed up to 4 additional wildcards in the menu, for future module
  developers to make use of, if desired.
  
  Fixed bug in the way form submissions were handled, which caused problems if you were depending on wildcards in URL during form submission.
  
  Fixed bug in Content module where editing content for non-admin wasn't working.
  
  Fixed bug in Content module to skip over markup fields.
   

2021-09-18
  Wrapped some strings in announcements with t().
  
  Converted system dashboard to use render array system so other modules can modify it.
  
  Made it so that we can pass strings in a render array for simplicity (they appear as plain html markup)
  
  Weights in elements can be floats now, instead of only ints.
  

2021-08-19
  Made it so that What If selection screen will show grad degree options if the student belongs to a grad rank other than 'GR' by checking
  setting first.  Also re-worded the description of that school setting for clarity.
  

2021-08-18
  Fixed bug in edit groups, where it was looking for school_id in prod table, and not draft table.  Same for degrees and courses.
  

2021-08-16
  Since FireFox (as of this date) does not support the datetime-local type, I added a "shim" library where we will override the browser's behavior
  with jquery.datetimepicker, if the browser does not support it. 
  
  Removed logging of _REQUEST from when forms are submitted, as it could represent an insecure watchdog message.
  

2021-08-13
  Made alterations to the default settings.php file, to better explain certain concepts.
  
  Fixed system status page to not show %FLIGHTPATH_VERSION% as system version, if it came from git repository.  Instead
  it just shows "GitRepo".
  

2021-08-12
  Cleaned up some CSS for the permissions form (in the user module).
  
  Added "sticky" headers to permissions form to make it easier to use.
  

2021-08-11
  Added a "custom settings" area to the default settings.php which is created during the installation process.  Also changed some of the wording in the
  settings.php file, for clarity.
    

2021-08-10
  Made the access stats report look nicer.
  
  Added more logging (including WATCHDOG_DEBUG) throughout FlightPath to make it easier to track activity.
  
  Added more time to setting to keep DEBUG entries, as well as wrapped more strings in t().
  
  Made changes to stats to make it easier to add a "school select" form for reports that need it.
  
  Adjusted major students progress report to use school_id correctly.
  

2021-08-09
  Fixed bug with What If limit on selections; wasn't counting tracks correctly.
  

2021-08-08
  Added the school_id and school_code to body class when viewing students.  The idea is to help CSS developers down the road.
  
  Cleaned up some on-screen messaging when changing terms.
  
  Added "spinner" property to apply draft changes button, changed description text as well.
  
  Fixed bug in editing group definitions where it was not respecting the new setting which allows "default" courses as well.
  Also it was not properly disabling the Required Courses textarea, as it was using a String and not an Array for attributes.
  
  Made it so that when setting attributes on a form element, it must always be in the form of an array.  Updated various files
  throughout FlightPath to make sure that was the case.
  
  Added new file, cli.php.  It's a command-line-only file.  At the moment, all it can do is clear the system's cache, but more commands
  will be added eventually.
  

2021-08-06
  Added new module_enabled() function to misc, which, due to caching, will make it faster to see if a module
  is enabled or not, rather than using function_exists().  Updated various files to use this new function instead
  of function_exists()

  Added new setting to schools where courses from the "default" school can be used in non-default degrees and groups.

  Added create table instructions to enagagements.install for required tables.
   
  Modified the fp_join_assoc() and explode functions to use a separator of _S- instead of just - (since we might be sending negative numbers).
  
  Removed bug where "Substitute" tab was showing in popup even on "courses added".
  
  Removed "Required by" text/line if we are in the Courses Added block, or if we are looking at a degree with only one "degree" (not combined).
  
  Fixed bug with student_files which was preventing file uploads.
  

2021-08-05
  Added styling for "date" and "time" form element types.
  
  Added "major student progress" report to core system reports.
  
  Updated various reports (from stats module) to handle school_id in some way.
  
  Updated code to make sure school_id was supplied to key functions for determing course_id from name, as well
  as changes to prereq module to ensure school_id was supplied to key functions.
  
  Marked a couple unused methods/functions for removal by adding z__ before the name.
  
  Fixed bug in users' Faculty Advisees list, where in the comment for an advisee you couldn't see their major code correctly.
  

2021-08-04
  Removed out-of-date setting for student_search, where we can only search for majors in the current catalog year.
  
  Got rid of the course_search "report" where you can download offerings as CSV.  Should be under stats anyway.  For now,
  simply removed.
  
  Updated parts of course_search (dealing with getting syllabus) to only use course_id in queries.
  
  Updated add new degree and copy degree to pay attention to school_id.
  
  Added new icons to system, and made sure all core modules had an icon associated with them in the Admin Console.
  
  Changed the way we denote that we are NOT overriding a core variable.  Instead of deleting from table, we mark it as 'no'
  
  Added multi-school functionality to audit settings.
  
  Added multi-school functionality to course search settings.
  
  Fixed bug with upcoming appointments.
  
  If using schools, made it so the advising snapshot lets you switch between schools.
  

2021-08-03
  Added new variable_delete() function to db.inc.
  
  Added new variable_exists() function to db.inc.  Returns TRUE or FALSE if the variable is even in the variables table.
  
  Changed schools module to let us override default school settings on a *per field* level.
  
  Modified how variable_get_for_school() checks to see if we are overriding the default school's val.
  
  Modified admin's edit-advising-settings to handle multiple schools.
  
  Fixed bug where db's update_course_requirement_by_name was trying to use school_id in tables which didn't have it.


2021-08-02
  Added new menu type:  MENU_TYPE_DEFAULT_TAB. This is a tab which otherwise behaves like a MENU_TYPE_NORMAL_ITEM.
  
  Added new page_setting to menu router api:  $item['page_settings']['tab_title'] = "blah". This is an optional special string
  used just for the tab of a page, separate from it's regular title.
  
  Replaced calls to GLOBALS['fp_system_settings'] array with variable_get() where appropriate.  Cleaned up unused functions.
  
  Added school column to output for student search of advisees.
  
  Added ability to specify optgroups for options in select lists in the Form API.
  
  Added ability to search for majors within a school (if user is allowed) on the student search screen.
  
  Modified course_search to let you search by school, if schools module is enabled.
  
  Fixed bug in course_search where it was not uploading syllabi correctly.  Also shortened filename of uploaded
  syllabi to a more reasonable length.
  
  Added "school" column to the list of courses you can edit from course_search module. 
  
  
2021-08-01
  Deprecating fp_get_system_settings() function.  It is now better served by simple use of variable_get().
  
  Changed school setting "what_if_catalog_year" to "what_if_catalog_year_mode" to disambiguate from advising variables.
  

2021-07-31
  Removed extra files from modules that used to be contrib, but are now in core (ex: CHANGELOG files)
  
  Added school_id to primary key for table degree_college
  
  In AdvisingScreen's output_to_browser(), $page_title has tags stripped before being used as HTML tag <title>
  
  Tweaked tabs' css slightly to give a little more whitespace below tabs.

  Fixed bug where unchecked checkbox was never being saved as boolean false, and was instead being saved as NULL.  Also, wasn't working
  if inside a fieldset.
  

2021-07-30
  Fixed bug in Calendar with Upcoming Appointments still not showing "today" and "tomorrow" appointments correctly.  Went with different approach.
  
  Added ability to edit semester block numbers when editing a degree.

  Added ability to limit the number of selections on What If.  It defaults to 5.  This is to help keep students from blowing up the server by selecting
  every degree possible.
  
  Updated blank degrees (and schools) to be able to search by school.
  
  

2021-07-29
  Fixed deprecated notice.
  
  Calendar bug left in from dev-- it was not preventing students from clicking "back" and saving a second time.
  
  Added "spinner" attribute to button for confirm appointment and save.
  
  Added ICS attachment to notifications for student-initiated appointments.
  
  Removed dev code for external calendars.
  
  Added new code for caching external calendars for at least 5 minutes, to save frequent lookups.
  
  Added new code for Course objects, to keep track of all the semesters it appears in.  Good for combo-degrees.
  

2021-07-28
  Fixed bug in calendar's upcoming appointments tab, wasn't showing date ranges correctly for timezones.
  
  Added ability to handle attachments to fp_mail(), as well as string attachments to smtp module.
  
  Added ability to send attachments (string method) with notifications by email.
  
  Added new property that can be added to form elements (like submit buttons), "spinner" => TRUE.  This
  will cause a spinning graphic to appear when the button is pressed, and the button to disable itself so it
  cannot be pressed more than once.
  
  Made it so all "content" forms use the spinner property for their submit buttons.
  

2021-07-27
  Implemented check when searching for students, to make sure user has correct permissions to search for student in particular school.
  
  Added ability to trim only DEBUG messages from the watchdog.

  Added ability to have external CSS files.  This is now a setting in System Settings, under the theme section.

  Added default favicon to fp6_clean theme.
  

2021-07-26
  Fixed bug when editing groups, where school_id was not correctly being loaded.

  Fixed bug in group definitions and group course repeats, where FP was not respecting the school_id.
  
  Set a default icon (major.gif) for new groups.
  
  Added "upcoming appointments" tab to the Calendar page, which displays events which are approaching.
  

2021-07-25
  Configured blank degrees to make use of the render system (so other modules can make changes more easily)
  

2021-07-23
  Added a few more details to render array in AdvisingScreen, when drawing course rows.  Also added argument to include the group a course is assigned to, if applicable, to
  draw_course_row().  This also helps the render engine and any modules which need it.
  

2021-07-14
  Fixed bug where form_error's was messing up markup_no_wrappers elements.

  Added extra validation on degree edit form, so that it stops you from adding a duplicate group with mismatched type or min hours.  Also made it
  so you can delete such a group.
  

2021-07-12
  Made it more clear that the currently used SMS service in Engagements is "SignalWire".  Also made sure that emails processed by Engagements were deleted after
  they were parsed, so they do not fill up the email server's Trash folder.
  

2021-07-11
  Fixed bug in engagements module where it was looking for a table which does not exist.
  
  Made it so when an appointment (with Zoom) is cancelled, it also deletes the Zoom meeting from zoom's servers.


2021-07-10
  Removed page titles from the Student search pages/forms.
  
  Added new CSS for printing.
  
  Added ability to add classes to collapsible fieldsets.
  

2021-07-09
  Implemented handling of numeric grades in FlightPath.  Basically, they must be converted to letter grades at the time
  they are assigned.  There is also now a new field in Course:  db_grade.  This is the actual grade as it is stored in the
  the database.
  
  
 
2021-07-08
  Cleaning up code, adding more content to render array system.  Cleaning up malformed HTML.
  
  Continuing work on themeing and rendering system.
   
 
2021-07-07
  Converted advise_display_view to use render array system. 
  
  Changed when drawing course rows, no longer hard-coding widths, styles, align, etc.
  elements.  Instead, we are relying entirely only CSS classes for styling.
 
 
2021-07-06 
  Converted AdvisingScreen::displaySemester to using render array system.

  For markup elements in the form_api, if type is not explicitly set to "markup", and is left blank,
  then the default will be "markup_no_wrappers", which means no wrapping divs will be used. 
  
  Converted AdvisingScreen::draw_course_row to use render array system.
  
  Fixed bug where remainder of course requirement (after partial sub) wasn't sorting correctly when using 
  the "sort by database id" setting.
  
  Fixed bug in Substitution tab, where split sub "pieces" were not showing the correct number of hours.
   


2021-07-02
  Modified Calendar module so that event types can be sheduled for longer durations (up to 2 hrs), have longer buffers (up to 2hrs) and have longer "prevent within" times
  (up to 24 hours).
  
  Added more literal strings to t() so they can be translated.
   

2021-06-28
  Made change in content_content_load(), to make sure that when we load based on cid, we order by vid DESC, to make
  sure we always get the most recent version.
  
  Fixed code in student_search, where the "include inactive students" checkbox was being ignored.  Also changed settings
  for extra conditions to add to query.
  
  Made changes to the way Student Profile hook works, so that other modules can more easily add to the list, and modify existing
  entries if desired.
  
  Fixed bug where recommended and hidden courses were not behaving correctly in groups.  Worked in Blank Degrees but not in What If or 
  on the actual degree plan.
  

2021-06-26
  Added new field to calendar's appointment content type, to keep up with video meeting data.
  
  Fixed typo in the content.module (misspelling of word).
    

2021-06-23
  Instead of passing the session_id during redirect, we now pass a "fp_session_str" which contains
  a method of validating the session_id, to make sure it is not a hacker attempting to imitate a valid
  session.  This was accomplished by new functions in misc.inc and checking in index.php before we
  trust the session_id in the URL.
  
  

2021-06-22
  Fixed bug in user module where adding a new faculty user caused mysql error.
  
  Added a backtrace (like we do for MySQL errors) to the PHP error handler in misc.inc.  Also adding to watchdog
  when we get a warning or error from the handler.
  
  Changed the way cookies are unset on logout, to fix an issue where they were not being unset correctly, but also
  to handle possible array notation in the cookie names.  See system.module
  
  Made changes to watchdog severity level for certain types of data, in anticipation of a module which would delete, for example,
  "WATCHDOG_DEBUG" entries after X amount of time, since they are the least important.  Also made changes to the PHP error handler
  so it correctly identifies in the watchdog whether it was a PHP error or warning, and adjusts the severity constant accordingly.
  
  Fixed typo in user settings pulldown menu.
  
  Made it so if you are not logged in, the left sidebar menu shows a link to the login page.
  

2021-06-17
  Fixed small typo in form_error() message when rejecting a saved degree.
  
  In student_search module, got rid of the "majors"-related permissions.  Also cleaned up code which had been commented out.
  

2021-06-16
  Adding in new setting to disable all student logins (unless whitelisted).  It's in the System Settings form.

  Added is_disabled and last_login to fields in the user object.

  Added new hook to allow easy manipulation of student profile items in the "currently advising" box at top of screen.

  Changing user_settings to be a key/value pair type table, making it easy to add new settings in the future.

  Created new table called "user_attributes", and it's used the same as user_settings.  This lets us store details about
  a student, for example, if they are an athlete or student worker, etc, w/o having to hard-code any values.  We are removing the
  student_attributes and faculty_attributes tables at the same time; user_attributes will replace both tables.
  
  

2021-06-15
  Added more literal strings to t() function so they can be translated.
  

2021-06-13
  Changed system.install so that institution_id is a 100 varchar in the database, instead of 10.  Also made `name` an index for transfer_institutions table.
  
  Removed some default character set and collation vals from .install scripts, as this can cause a problem in MySQL 8+.
  
  Removed apply_draft_changes logic from schools module, since no longer needed and causing error.  Cleaned up old code.  Made sure
  What If mode only showed correct degrees based on the students' school.
  
  Added logic in schools and admin.degrees.inc when copying a degree, make sure to keep up with school id.
  
  Fixed Duplicate entire catalog year function to also respect school_id.
  

2021-06-12
  Working on schools functionlity for groups & definitions.
  
  Fixed a bug where icon filename field was no longer visible when editing degrees.
  
  Tweaks to popup which displays the degrees using group.
  
  Added a confirm dialog when changing schools, since it could cause all sorts of problems.
  
  Watchdog insert was failing because anon user school_id was null; wasn't being intval'd.

  Fixing PHP warning in system_init().

2021-06-11
  Added _validate function when editing a degree, so we can test for school mis-match.  Also fixed a bug where if there was more than one
  form_error() for the same element, it wouldn't display the red border around that element.  Also made it so that markup fields
  can also have form_error called on them.


2021-06-10
  Added ability to have group requirements (in degrees) with fractional hours.  Ex: 0.5 hours or 1.2 hours, etc.  Previously,
  when a group was loaded, the hours_required field was being intval()'d.  Changed to floatval().
  
  Fixed bug where course descriptions were not being cached correctly due to a typo.
  
  Wrapped "hours" and "hrs" with t() function so those words can be translated to "credits" if need be in a hook_translate function.

  Fixed bug where group couldn't be deleted from degree plan due to school_id being set.
  
  Worked on courses issues with schools.
  

2021-06-07
  Added schools select list option for user forms, made other cosmetic changes.
  
  Changed users module so that you can enter DEPT_CODE along with department.  Change table schema so that
  college, dept_code, and deparment are varchar 255.  Will use a machine name version of department if no DEPT_CODE
  is entered.
  
  Found a bug on the dashboard (system.module), where it states what day it is.  I was using strtotime("today"), which apparently
  was causing issues due to timezone conversions.  Switched it to time() and that fixed the issue.
  

2021-06-06
  Finishing up users screen for school id, both faculty and students.  Also added filter options to make it look
  more consistent.  Added pager to student users screen, since we might theoretically load the entire student
  list, both past and present.  It shows 30 at a time now.
  

2021-06-04
  Working on courses with new school_id.  Changed appearance of courses screen to look more like the other degree
  edit pages.  Made better use of tables and highlighting when you mouse over a row.  Added a filter form like others
  as well.
  

2021-06-03
  Added new schools filter option to degrees, and working on groups.  Filters on degrees list now actually
  a form (and added new form to groups) so other modules can modify with hook_form_alter if desired.  Right now,
  it's only really for the schools module.
  

2021-06-01
  Fixed bug in pager_query which was sometimes throwing numbers off.  Expanded functionality of the paget_query function.
  
  More work on school_id system, amending the need in some tables.  Decided to declare that CWIDs *must be unique* in FlightPath.
  Therefore, the users table will be the only place that a user's school_id is stored.
  
  Changed wording on user module, which stated CWID had to be numeric.  It does not.


2021-05-31
  Adding school_id to api and queries throughout FlightPath.
  

2021-05-27
  Changing some style issues when listing multiple degrees for a student.
  
  Change wording for select of tracks if you are required to select a certain number of tracks for a degree.
  
  Fixed bug where you couldn't override a semester block title unless you also had a course.
  

2021-05-25
  Added schools module to core, and made changes to system.install as well as other .install files, so that tables
  now have a school_id field and needed keys.
  

2021-05-16
  Added lots of changes to student search. We now can see Academic Priority.  Uses pager query and table sort as well.  No
  more limit on 300 students, since we can do pager.  Made table headers responsive, as well as priority vals.


2021-05-11
  Added ability to have custom logout messages.
  

2021-05-09
  Added "last_login" column to users table, and to users screen in admin console.  Also make it so the "contact FlightPath production team" link
  does not appear if no email address is entered.
  

2021-05-05
  In the school settings form, you may now choose to sort courses in degrees and groups not by alphabetical, but by the order
  in which they were entered.


2021-05-04
  Added fields to groups and group_requirements tables (incl. draft_) to facilitate public notes in groups,
  as well as "attributes" on a per-requirement level.
  
  Changed popup description to use fp_alert() function, with base64 encoding so we don't have to worry
  about trouble characters, and can enter HTML as well.
  

2021-04-21
  Made it simpler to define "unavailable days" for scheduling appointments.
  
  Fixed unavailable times table to look cleaner and easier to understand.

2021-04-20
  Making sure we log incorrect login attempts.
  

2021-04-06
  Fixing up blank degrees module, make it show if user has permission.
  
  Added masquerade module to core, permits searching by partial email and lastname now.
  

2021-04-05
  Making new degrees "allow dynamic" by default.
  
  Removing outdated settings variables.
  
  Documentation for content module.  Fleshed out the basic page content type as well.
  

2021-03-14
  Removing "blocks" module from Core.
  
  Adding various modules to core.
  

2021-02-20
  Added the base_url to the server name when sending mysql errors via email.

2020-10-07
	Initial commit of 6.x branch.  There are about to be various changes to FlightPath, which warrants 
	a new major version.

File

CHANGELOG.txt
View source
  1. FlightPath 6.x Changelog
  2. ========================
  3. 2023-01-18
  4. Made a change to engagements module, when checking for all SMS messages. Instead of checking for NOW - 1 DAY, it only checks
  5. for NOW - 3 HOURS. For most of the time, this means it will only check for *today's* messages, except around midnight, where it will
  6. get the previous day's as well. The aim is to retrieve less data, to lighten the amount of processing being done.
  7. Also made it so that we will not run the check for SMS messages (which simply refreshes delivery status, price, etc) more than
  8. once every 30 minutes. This is also meant to lighten the amount of processing as well as how often we are contacting the signalwire API.
  9. 2023-01-11
  10. Added hook_...validate() functions to admin copy degree and admin duplicate year forms, so it won't mess up
  11. other modules.
  12. 2023-01-10
  13. Small tweak to system.js, so that the "large" dialog resizes better on a medium-sized tablets.
  14. 2022-12-19
  15. Fixed bug where dialogs were not closing after save (javascript had been disabled).
  16. 2022-12-10
  17. Fixed bug which was introduced in last version to the piechart engine, which made it stop working.
  18. Fixed bug in user module, which prevented manually creating staff users.
  19. 2022-11-12
  20. Edited pChart library to use new __construct() instead of class name for constructor functions. This made it compatible with PHP 8.0.
  21. Also changed "var" keyword to "public" for variables, and set them to NULL instead of array(), especially since some of them
  22. are actually supposed to be objects.
  23. Made various other clean-up changes to make compatible with PHP 8.0.
  24. 2022-11-06
  25. Continued work to make compatible with PHP 8.0.
  26. 2022-11-05
  27. Cleaned up Administrator's Toolbox (courses) to make it cleaner. Also fixed bug where it was not showing where
  28. a course was assigned.
  29. Continuing work to increase compatibility with PHP 8.0.
  30. 2022-11-04
  31. Added code to increase compatibility with PHP 8.0.
  32. 2022-11-03
  33. Changed "Login" button to "Log in" to be consistent with English rules.
  34. Added more options for TinyMCE, including links and the ability to resize the editor.
  35. 2022-10-31
  36. Clarified instructions for default advising term.
  37. 2022-10-27
  38. Improved documentation for definitions.
  39. 2022-10-25
  40. For the _fp_error_handler() function, made it so the $msg saved to watchdog (and possibly emailed)
  41. is no more than 10,000 characters.
  42. Fixed bug in lassie_cron() where we were not getting the most recent "last check" correctly. It was causing
  43. us to check for long-running jobs on every cron run, rather than no more than once every 45 minutes (as intended).
  44. 2022-10-19
  45. Added function get_faculty_email() to db.inc file.
  46. 2022-10-18
  47. Modified email that engagements sends out, so that the link is wrapped in tag.
  48. Moved $system_name variable in engagements so it is available when receiving unknown text messages.
  49. Fixed bugs when creating an altert from engagements (when receiving unknown text message).
  50. 2022-10-09
  51. Added ability to set breadcrumbs on content view.
  52. Working on what happens when an unknown number sends a text message. It should send a notification
  53. to appropriate recipient, and save message as an Alert.
  54. 2022-10-03
  55. Re-arranging in popup course description how we show that the db_grade is different than the assigned grade. Only
  56. applies when we've made a modification due to the grade being numeric. We will now show the original numeric grade first.
  57. Fixed bug where + was being converted to a space when passed through the URL for Course::to_data_string(). Using a replacement text now.
  58. 2022-09-26
  59. Added additional code to help prevent issues when invalid courses are defined in group definitions.
  60. 2022-09-22
  61. Fixed bug in install.php where we were not correctly setting up our GLOBALS['pdo'] object, causing fresh installs to fail.
  62. Fixed bug in system.module, where when we try to first store our serialized course cache, it incorrectly shows a permission error (because
  63. the file has 0 bytes).
  64. Fixed bug in alerts.install, one of the queries to create a table was invalid.
  65. 2022-09-19
  66. Fixed bug in Masquerade module where it wasn't allowing users to search by CWID.
  67. Added caching when fetching school name or code by id.
  68. Removed "department" from faculty table.
  69. Added indexes to student_degrees table.
  70. Fixed the "Advisor Use" report to pull department correctly.
  71. Adjusted the "Major Counts" report to not show school code if schools module not enabled.
  72. Altered the "Major Counts" report to show all degree levels (1, 2 and 3) not just 1 and 2.
  73. 2022-08-29
  74. Added lang='en' to tag in core fp6_clean theme. This is for greater accessibility.
  75. 2022-08-18
  76. Removed unnecessary __autoload() function in index.php; was causing incompatibility with PHP 8.x.
  77. 2022-08-17
  78. Added tweaks to the static screen "dialog-empty", so that it displays a throbber graphic while loading.
  79. Changed name of dialog-empty to dialog-loading.php, for clarity.
  80. In clone_advising, made it so you can enter comments after # symbol.
  81. Moved the autocomplete function to find students from calendar module to the student_search module,
  82. and gave it more than the default option for output. See student_search.module's student_search_ajax_autocomplete_student()
  83. for more details.
  84. 2022-08-12
  85. Fixed typos in watchdog() command in the engagements module.
  86. Fixed issue in engagements where all incoming SMS got an error relating to reading media which wasn't there.
  87. If a number sends a text message, and their CWID cannot be found, the notification message changes to reflect that.
  88. When saving a new notification, the insert id (hid in table notification_history) is returned.
  89. 2022-08-11
  90. Cleaned up logic which loads permissions for users, using less memory.
  91. Added ability for students to schedule appointments with faculty & staff in other departments (not just their
  92. advisors).
  93. 2022-08-10
  94. Added breadcrumbs to certain admin functions.
  95. 2022-08-04
  96. Added new function to db.inc, making it easier to get school_id from a user_id.
  97. Added new setting to School Settings, for specifying departments.
  98. Made changes in School settings to accomodate new 'Appointment settings' form.
  99. Altered User module to make use of the new "departments" setting as a select list rather than a free-type field.
  100. Built new 'Appointment settings' form, so admins may edit global settings having to do with who may accept appointments.
  101. 2022-08-02
  102. Moved around code so that the user module is responsible for displaying text message recipient options (instead of the code being
  103. in hook_form_alter from engagements).
  104. Fixed bug where deleteing last txt message option wasn't allowed when editing user.
  105. 2022-07-31
  106. Added new school setting that allows What If to show all degrees (not just undergrad or grad based on student's rank).
  107. Made it so on the permissions form, underscores are not shown when stating the module name. Makes it look nicer.
  108. 2022-07-29
  109. Made an adjustment to system.module's function system_reload_and_cache_course_inventory(), such that we only get the 10 most recent catalog years
  110. when building the course inventory file. We also limit it to 50,000 records, though this might be changed in the future. By making this
  111. change, it keeps the files/cache_data/courses_serialized.info file relatively small and keeps it from growing out of control as more courses
  112. are added and duplicated each year. This in turn uses up less RAM on the server.
  113. Added extra css class to edit link for user attributes, making it easier to style later on.
  114. 2022-07-28
  115. On the Status page, the last cron run wasn't being displayed in the user's timezone.
  116. 2022-07-27
  117. Added small change to batch.js, to make it run slightly faster.
  118. Fixed on-screen text for SMTP module settings page.
  119. 2022-07-25
  120. Added new property "extra_attribs" to Course object, so other modules can add extra data (as a string) to courses. Cannot contain a ~ as that is a reserved
  121. character.
  122. 2022-07-24
  123. When building semesters on the Degree or What If screen, made sure that their "req_by_degree_id" was set correctly.
  124. Modifications to advise_init_screen() function, and others, for extended support for other modules.
  125. 2022-07-23
  126. In the popup group description function (in AdvisingScreen), we now include the group as a non-rendered object in the $render array, so that other
  127. modules can act on it in hook_content_alter().
  128. Added weights to render array for displaying view (Degree and What If), so other modules can more easily manipulate.
  129. Created new hook: hook_init_flightpath_degree(). This allowes modules to act after FlightPath::init() has been called.
  130. Added new method to ObjList, to refresh_indexes(). Should be called after we remove a course from a list manually.
  131. Added new hidden variable to advising screen: reinit_fp_after_draft_save. If set to 'yes', then after a draft save the $fp variable with
  132. perform a fresh init() after a draft save. This is primarily used by other modules which might be making changes to the degree plan in real time,
  133. and do not want to reload the entire student. By default it is set to 'no', replicating existing functionlity that skips that step.
  134. Converted the AdvisingScreen::build_footnotes function to use render array, so other modules can add footnotes if necessary.
  135. 2022-07-22
  136. Added extra class to pie chart rows-- the total number of intended rows. This lets us target with CSS with more precision.
  137. 2022-07-19
  138. Small change to popup course description, so repeat hours do not show excess zeroes.
  139. Made changes so that you can have specified repeats in groups with branches.
  140. 2022-07-12
  141. Made modifications to student_priority module, so that tests can be pulled directly from user attributes, rather than having
  142. the need to run an entire function. Both methods are documented in the .api.php file.
  143. 2022-07-11
  144. Made a small change in user.module, so that attributes with quotes in the title show dialog correctly.
  145. Fixed documentation error.
  146. Removed hard-coded student priority tests/calculations. Instead, added to the api.php file.
  147. 2022-07-04
  148. Updated some display code in student_search.
  149. Altered checkbox for inactive students code in student_search submit function.
  150. 2022-06-30
  151. Small adjustment in engagments-- made email tracking token sha512, and based on microtime + extra randomness to try to ensure uniqueness.
  152. 2022-06-27
  153. Made it so the system only tries to trim the watchdog once every 7 days, rather than on every cron run.
  154. Added extra wording to some watchdog entries for clarity.
  155. 2022-06-23
  156. Fixed small bug where CSS class was not being specified on left sidebar items.
  157. During the "duplicate entire catalog year" function, there was a die() statement if a group couldn't be found. Changed
  158. that to simply display a message.
  159. 2022-06-17
  160. Added new function to DatabaseHandler, where we can request a new advising_session_token, and be guaranteed that it does not already exist. Updated FlightPath class
  161. to make use of it.
  162. 2022-06-15
  163. Modified user module to make it easier to filter for users. Made it function more like FP 5, where setting a filter actually shows you
  164. all values under that filter, and you don't have to search by letter as well. For students, this is true, except we do not reset values
  165. for "is_active" when searching by letter or other filter values.
  166. 2022-06-07
  167. Fixed bug when editing user attributes from the users screen, where if no "fields" index is set, we weren't correctly creating a default
  168. field called "value" that's a textfield.
  169. 2022-06-01
  170. Small modifications to help eliminate bugs in menu items showing in a menu block.
  171. 2022-05-29
  172. Adjusted hook.api documentation.
  173. Altered alerts to allow for targetting specific faculty/staff by CWID, and NOT sending the alert to the student's advisor. Also, if the student_id
  174. field is left blank, it will show as "N/A" on the Alerts page. This is useful if you have alerts, sent to specific users, which do not
  175. directly have anything to do with a student (ie, system alerts).
  176. Adjusted displays to cope with new alerts setup.
  177. Fixed bug with alert counts.
  178. 2022-05-23
  179. Fixed bug where hook_update() wouldn't be called if the module was under custom/modules/_dirname (beginning with underscore).
  180. 2022-05-19
  181. Modified when we render a menu item in HTML, to include more details about its title and path as CSS classes, making it easier
  182. to theme or hide as needed.
  183. 2022-05-17
  184. Fixed bug in permissions where admin_restricted perms were not being saved correctly.
  185. Added a new form element type: "value". This is a hidden value which must not change. If it does change from what is defined in the form,
  186. the form will not validate and an error message will be shown. This is a security feature so that malicious users cannot change hidden
  187. field values which are meant to be immutable.
  188. 2022-05-13
  189. Made small alteration in DegreePlan, so that if a degree title is blank, we don't see a message like "This groups belongs to" (with no degree
  190. title) in the Courses Added by Advisor group.
  191. Made content module handle checkboxes a little better. Instead of saving as serialized array, it saves as a string which can be queried
  192. using LIKE. A little cumbersome, but better than if it is serialized.
  193. 2022-05-11
  194. Added concept of "admin_restricted" to permissions. If set, then it will only appear for the admin user (user_id = 1). This way
  195. you can give the "edit permissions" permission to users and still not let them access the potentially dangerous areas.
  196. Masquerade will not allow a user to become admin (user id 1).
  197. 2022-05-08
  198. Fixed logic in advise module where number of advised students for a particular course were not being calculated correctly.
  199. 2022-05-06
  200. Tweaks in user.module to make custom attributes more configurable.
  201. 2022-05-04
  202. Changed wording of setting in system.module.
  203. 2022-05-03
  204. Modified user.module so that defining user attributes is easier; it will assume it's a textfield and name "value" if no field or
  205. display information is given.
  206. 2022-04-29
  207. Modified function csv_multiline_to_array to make it smarter and not throw warnings so easily.
  208. 2022-04-27
  209. Modified the email sent out by a db_error to include the query/args, to make it easier to debug.
  210. Removed jquery ui's package.json file to prevent github from flagging unsafe dependencies (which are not being used)
  211. 2022-04-18
  212. If a semester block is empty, we do not show it on the degree / what if tabs.
  213. 2022-04-17
  214. Made it so that the theme always defaults to fp6_clean (included with core), and it is not set in the settings file. Got rid of the
  215. "display_mysql_errors" line in settings.php, since it is not used any longer anyway.
  216. 2022-04-16
  217. Added code to lengthen timeout during cron runs.
  218. Added code to content module to delete content (and files) marked with delete_flag = 1. Same for advise module, admin, and comments modules.
  219. Fixed bug to where if you try to view content which doesn't exist, we go to a 404 error.
  220. Removed getting variables in settings.php file. Instead, they will be "lazy-loaded" as-needed. Altered stats module to make sure to use variable_get() syntax
  221. instead of trying to load directly from globals array.
  222. 2022-04-15
  223. Added extra permission to prereqs module, so that you can only override locks on courses if you have permission.
  224. Adjusted the "locked but checked" icon for courses in prereqs, to make the check a little more obvious.
  225. Removing alerts (from the confirm remove dialog screen) shows spinner icon when clicking button.
  226. Upgraded included PHPMailer library from 6.0 to 6.6 to take advantage of newer code with security enhancements.
  227. Fixed bug where files being emailed were not being decrypted BEFORE being sent as email, making them unreadible to the recipient.
  228. 2022-04-12
  229. Added extra classes to engagements for text messages, to say which phone number the message was being sent from and to. This should help with styling if you want
  230. to have different colors or other styles based on what phone line it was sent to or from.
  231. 2022-04-11
  232. Removed concept of trying to "preload" a set number of courses on login. This is now handled in a more elegant way.
  233. Added link to schools help page to schools module settings page.
  234. Added "Loading" dialog when you search and receive a single student.
  235. Changed "Advisee Alerts" tab to say just "Alerts".
  236. Placed all db connection code in settings.php, and put the pdo into GLOBALS, so we only make 1 database connection per page load.
  237. 2022-04-10
  238. Added more messages on login page for if login failed (admin user is only one allowed, students not allowed, etc).
  239. 2022-04-04
  240. Using font awesome question-circle icon for popup_description link instead of regular question mark. Also used margin to add a little more spacing.
  241. 2022-04-02
  242. Adjusted weights to better alphabetize the admin console menu items.
  243. Added new silk icons to system module directory.
  244. Added ability to have "pseudo" opt-groups for checkboxes fields, where checkboxes can be grouped
  245. the same way select lists can, in a multi-dimensional array.
  246. 2022-03-31
  247. Added small bit of code to advise.module to stop notice/warning from happening.
  248. 2022-03-30
  249. Added extra classes to tabs and sub-tabs to make them targetable by CSS.
  250. Added extra classes to History tab sections to make them more targetable by CSS.
  251. Added extra class to section titles to include machine-readable versions of the title, for CSS.
  252. Similarly added to student files module to make CSS styling easier.
  253. 2022-03-29
  254. Fixed a subtle bug where if a course was being advised to take in a group that was split between two different semesters,
  255. it was possible that it would attempt to be saved into the first semester num of the group's first appearance.
  256. 2022-03-28
  257. Minor change in System. When trimming watchdog table of DEBUG statements, made sure that "max age" was an int using intval().
  258. Fixed bug in core's course search edit submit, where it would never work. Probably a result of my recent work.
  259. 2022-03-25
  260. Adjusted look of textareas in form elements to have similar rounded corners and such as text fields.
  261. 2022-03-22
  262. Added hook to course_search, so that other modules can modify the "course not scheduled" result. See new file course_search.api.php.
  263. For the pager_query() functionality, look for value in $_REQUEST instead of just $_GET.
  264. 2022-03-21
  265. Added hook to course_search, so that other modules can modify the "course rotation schedule". See new file course_search.api.php.
  266. 2022-03-20
  267. Changed how we cache the course inventory. Now using a file to cache to hard disk, making it much faster to read into memory than using multiple database queries.
  268. When applying draft changes, the courses cache file is automatically deleted and re-written.
  269. Added indexs for courses and draft_courses for the exclude and delete_flag columns.
  270. Added new cache variable which lets us know when course cache was last generated. Users will check that variable in key places to see if they need to reload
  271. their course inventory from file.
  272. Moved the logic for generating and saving the course inventory to the system module, to make it easier to work with.
  273. 2022-03-19
  274. Altered prereqs module to better explain how it's hook system works. Added prereqs.api.php to describe hooks.
  275. Added new column to advising sessions: most_recent_session. This will be set to 1 (one) if this is the most recent advising session (across multiple terms)
  276. for the student. Otherwise, will be zero. This helps in certain queries and reports.
  277. Removed code which was adding the "course inventory" to the SESSION. This was only being used in 2 places, and never when actually loading a course. Therefor,
  278. it seems it is not needed.
  279. Added new column to student_courses: course_id. This makes it much easier to search for specific courses in this table. Defaults to zero (0).
  280. 2022-03-17
  281. For menu items, if there is an icon, give it an ALT tag of whatever the title of the menu is.
  282. Made sure the logo image for FlightPath had an alt tag.
  283. Made the 'Welcome to FlightPath' message on login page use the system_name variable.
  284. Added new modal dialog for "loading" and "updating", which dims screen and is more visible than old method that showed
  285. when logging in or waiting on dialogs to save (like subs or moving courses).
  286. Cleaned up way that scrollTop was calculated for pages. Will eventually use window.scrollY if no other method can be found. Also, placed into system.js so it is always
  287. available in one spot, as function fpGetScrollTop().
  288. Made it so that if "scroll_top" is in the $_REQUEST when we submit a form, it includes that value when the form does an fp_goto and reloads.
  289. 2022-03-12
  290. Added new feature to function get_term_structures, where "term_suffix" is now one of the values returned, instead of just being
  291. in the key of the array.
  292. Altered functions in stats so that we can override the default breadcrumbs on the form where we select the school.
  293. Made sure course_search also excluded courses with delete_flag set.
  294. 2022-03-11
  295. Modified course_search_dislay_search to use render array system, so other modules can make modifications.
  296. Added weights to course_search edit form, making it easier for other modules to make modifications.
  297. 2022-03-09
  298. Added abiility to filter by degree level (UG or GR) on the admin console -> degree list screen.
  299. Changed comments and removed old code from hook.api.php.
  300. 2022-03-08
  301. Fixed a bug when sending the "Contact the FlightPath Production Team" email, where the last selected student CWID was not appearing.
  302. Removed the outdated "addslashes" to the msg of the email from the Contact link. Also added a "close window" button on the "Thank You" page.
  303. Advising history changed slightly to have a "minimal" text option, specifically for the "email events" module.
  304. 2022-03-07
  305. Made it to where emails for mysql and PHP errors first convert times into system (or user) timezone, as well as display which user
  306. triggered the error.
  307. Added watchdog debug statement any time we send an email via fp_mail() function. Added logic to prevent infinite loops if mysql server is down.
  308. 2022-03-04
  309. Fixed typo in code which was causing advisor name not to show on the advising history tab.
  310. 2022-02-25
  311. Added code so that the system can have a default tab to load for students, if not overridden by the individual user's settings.
  312. 2022-02-21
  313. Modified .htaccess for compatibility with Order directive throwing a 500 error in some implementations of Apache 2.4. Thanks, Apache!
  314. Added extra class to html when drawing pie charts, to show the degree level num (1-3) as well as the "classification" (MAJOR, CONC, etc).
  315. Made the popup course description show midterm grades in a superscript correctly.
  316. Fixed a bug when rendering radios, where if we were passed an array for the value, it wouldnt' work, only strings. However, this
  317. caused a problem on the What If selection screen.
  318. 2022-02-15
  319. Added new column to content__engagement: to_sms_phone. This is so we can keep up with what number this txt message was sent TO. Useful for
  320. schools with more than one number. Only applies to engagement type txt_msg.
  321. Added a message on engagements screen when a sent txt message is not delivered.
  322. Altered "engagements received" tab (under alerts) to show txt messages sent to us even though they may not be our advisee. This is based on
  323. phone numbers which we are marked as should receive notifications for.
  324. 2022-02-14
  325. Added new tab to the Alerts (bell icon) page. Engagements (txt or email) sent by student.
  326. Made it so the bell icon badge is recalculated every 1 second to 20 minutes (based on a system setting).
  327. Fixed a bug to where when you logged a received email, it actually SENT the email to the student's address. Same for SMS.
  328. Fixed bug in media.css where it was causing some things to be scrunched up.
  329. Made it so the notification (when you receive a txt from a student) says what number/line name they sent it to.
  330. Made is to that the student_activity record that is created when we receive a txt message states what number/line it was sent to.
  331. Sometimes we get "7BIT" code issues in email bodies, where things like a non-breaking space appears as =C2=A0. Added functionality
  332. to convert to standard HTML instead.
  333. Fixed bug where if you do not have any advisees, you should see nothing on the "Advisee Activities" tab. Same for Advisee Engagements tab.
  334. 2022-02-13
  335. Added ability to have replacement patterns in menu item titles. Good for changing values in tabs.
  336. Minor tweaking to working and examples in hook.api.php.
  337. Modified alerts module to report how many unread alerts there on on tab.
  338. More work on the alerts bell "badge" logic.
  339. 2022-02-12
  340. Minor tweaks to CSS
  341. Preparing to enable "basge" functionality for the alerts bell.
  342. Created a new hook "hook_get_alert_count_by_type()" which will let a module declare the total, read, and unread
  343. counts of *something* (probably content), we we can decideif we need to place a badge on the bell icon at the top of
  344. the screen.
  345. Created new functions in misc.inc to interact with the hook, as well as a change to content when we set the "last access"
  346. value, as well as when we create, edit, or delete any content.
  347. 2022-02-09
  348. Fixed bug where we were checking the wrong permission for adding and editing content from the content page.
  349. 2022-02-08
  350. Fixed bug in content module such that you could only have a "file" field if it was named "attachment". Also added
  351. the ability to have more than one file field per content form.
  352. Added a little extra styling for form fields in content forms.
  353. 2022-02-04
  354. Made it so if a numeric grade is supplied with MID at the end, it is converted to a letter grade with MID at the end.
  355. Added new function, fp_confirm(), which is meant to work with fp_get_js_confirm_link() to create a modal confirm popup,
  356. instead of native javascript popup. From same creator as the fp_alert() dropin replacement.
  357. 2022-02-02
  358. Fixed bug where student name was being used instead of faculty name when sending a txt message via Engagements.
  359. Also fixed bug where if student has no number, it was showing that they had opted-out, which was not necessarily true.
  360. Added extra spans and css styling when showing pie charts.
  361. Changed delete links on History tab to use simple "X" from font-awesome, both
  362. for advising and student files.
  363. Changed queries for advising history to look up "groups" of advising sessions by advising_session_token.
  364. Added ability in creating a confirm link (in misc.php) to have a link title
  365. so something appears when you hover over link.
  366. 2022-01-30
  367. When drawing pie charts, use base_url() instead of function base_path() to use the pchart library. Added more CSS class to make it easier to theme later.
  368. 2022-01-27
  369. Fixed bug where draft mode was no longer accessible.
  370. Fixed several bugs where school_id was not being taken into account with regard to track selection.
  371. Fixed FlightPath::get_all_courses_in_catalog_year()-- noticed that it was hard-coded to only return undergrad courses. Added
  372. a boolean to change that.
  373. 2022-01-26
  374. Tweaked logic to function that "balances" the student profile attributes.
  375. 2022-01-19
  376. Added new function: db_get_user_id_from_user_name()
  377. 2022-01-17
  378. Added ability to change site logo (in system settings).
  379. Added "powered by FlightPath Academics" to bottom of page template.
  380. Correcting if statements checking for if hours < 1 to if hours == 0, since some courses at some
  381. schools may be less than 1 hour.
  382. 2022-01-16
  383. Changed the 404 error to log as "page_not_found" type, instead of "system", as it shows up quite a bit in the logs and can be
  384. difficult to sift through for valid system messages.
  385. Updated Lassie message to show time in site's default timezone.
  386. 2022-01-15
  387. Fixed bug where degrees, groups, and courses not in school 0 were showing up (and causing problems) when the schools
  388. module was turned off. Changed the logic so that when schools module is not enabled, we will only be shown school=0.
  389. Added "date" as element type for form api.
  390. Added new hook to user module, allowing us to change the display value of a user attribute.
  391. Tweaked function to "balance" the profile items on a page.
  392. 2022-01-13
  393. Minor edit: cleared up wording for mass sms permission.
  394. Fixed bug where mass txt was not possible except for admin user because
  395. we were checking the wrong permission.
  396. Small change to fp_space_csv function, to reduce double-spaces.
  397. Fixed bug in course search edit, where it was not showing terms correctly based on school_id.
  398. Added extra message to schools module.
  399. Added ability to have user editable attributes for other users. Must set permission. See user.api.php for help
  400. on how to "register" these custom attributes.
  401. 2022-01-12
  402. Added ability to register and edit user attributes from the student profile page. Saves automatically to the user_attributes table. Created user.api.php
  403. to help illustrate how the hook works.
  404. The user module also automatically adds permissions for new attributes.
  405. Added a convenience function to help "balance" the profile_items array between leftside and rightside, so we can easily "push" items onto it and
  406. they automatically fall into place.
  407. 2022-01-10
  408. Modified content.module to make sure a specific bug didn't happen where redirections might not be seen, as well
  409. as added strip_tags() to values read directly from $_REQUEST.
  410. Fixed bug in group definitions, where if there was a blank line, or somehow a course with no subject_id, it could cause a problem.
  411. 2022-01-09
  412. Removed extraneous testing functions.
  413. Added to logged 404 and 403 errors, added the location to the msg so it shows in the watchdog view.
  414. Added function to course_search to get capacity for particular course.
  415. Updated system to add more indexes to advising tables.
  416. 2022-01-08
  417. Fixed bug where "public files" tab was showing on all "add" content screens.
  418. Changed verbage so that SMS text messages change from "TXT" to "Text messages" throughout FlightPath modules.
  419. Implemented new setting in GUI to opt-out of receiving text messages.
  420. Implemented opting-out of text messages if user replies STOP. Opting back in if they send UNSTOP or SUBSCRIBE.
  421. Removed accidental hard-coded signalwire setting.
  422. Implemented change to sms_history table so we can also track error messages and delivery status.
  423. Only update SMS record (in sms_history table) if price or err_code value changed.
  424. Added extra watchdog (debug) statements for when cron starts and stops.
  425. 2022-01-07
  426. Added numerous new watchdog() statements to better track admin actions, like creating and deleting degrees, groups, etc.
  427. Made the default time to delete watchdog debug statements 1 year instead of 90 days.
  428. Made the default time to delete normal watchdog statements 3 years instead of 1.5 years.
  429. Always add a "text STOP to opt-out" type message to the end of every sms message.
  430. Altered encounters SMS settings to let user specify which phone numbers are specifically for mass text messages. The
  431. mass text messaging form will only select those.
  432. 2022-01-04
  433. Added ability to send arguments to fp_goto() as an array.
  434. Added ability to install Zoom (if zoomapi module is enabled) from login form.
  435. Changed position of email address question in install.php
  436. Fixed bug in content module where attributes field in db data content_files wasn't being created on install.
  437. 2022-01-03
  438. Added new permission just for clearing system cache (was using administer_modules, which isn't really the same thing)
  439. Added ability in public files to replace existing filename if it already exists.
  440. Changed course popup description to note when a student was enrolled in a course, vs. just showing the enrolled
  441. grade (ex: "E").
  442. 2022-01-02
  443. Added extra verbage to cli.php to make it clear it should be run as the webserver user.
  444. 2022-01-01
  445. Added new base_url() function.
  446. Created new concept of "public files" which users may upload to a special directory under /custom/files/content_uploads/public_uploads. This screen is on a subtab
  447. from the normal Content screen, and allows users to upload and delete files (with allowed extensions) for use outside of FlightPath, or when linking
  448. to CSS or other files from within settings.
  449. 2021-12-30
  450. Added new indexes to watchdog table for faster reporting.
  451. Fixed typo in descriptions in encryption module.
  452. Updated cli.php to also allow db updates from the command line, as well as display help if no arguments
  453. are sent, or if ?, -h, --help, or help or sent.
  454. 2021-12-29
  455. Added more permissions and security checks when accessing files and content, especially of the user is a student and just trying out
  456. URLs. We make sure they do not have access to any content, comments, or files they aren't supposed to see.
  457. Added icon for encryption module, removed old, unused settings from hook_menu items throughout FlightPath.
  458. 2021-12-28
  459. Adding new module to core: encryption, and setting up key variable in settings.php on installation (giving it a random string value at the time of
  460. installation).
  461. Adding ability to save all content files as encrypted, and properly decrypt them for end user, based on if the user has permission to view
  462. the original content it was attached to.
  463. 2021-12-27
  464. Adding ability to have encrypted files for content_files. Also, that table tells which piece of content the file belongs to, if any.
  465. Made it so if $content->title is unset, false, or null, then on save we give a simple default value. This is to stop of mysql integrity
  466. constraint where the title cannot be null.
  467. Altered engagements so that received files (via email or SMS) go to temp directory on server first, before we then attach them to a piece
  468. of content via its cid in the content_files table.
  469. Fixed minor sorting issue on Engagements main tab screen.
  470. Altered content module's install so that is_encrypted and cid are both in the table, so we can figure out which piece of content (and therefor, permissions)
  471. the file is related to.
  472. 2021-12-22
  473. Added a strip_tags() call in course_search module, just to make sure we do not display dangerous user-supplied input.
  474. 2021-12-21
  475. Stored results of content_get_types() to a simple GLOBALS cache to reduce amount of times we look for it.
  476. Altered Calendar module to include instructions for de-authorizing Zoom.
  477. Fixed bug in Calendar where Zoom was hardcoded to look for user 1 (admin) tokens.
  478. 2021-12-19
  479. Moved all Zoom functionality into its own (private) module called zoomapi. Updated other core modules to adjust and check for zoomapi before trying to call
  480. functions.
  481. 2021-12-18
  482. Fixed bug in system_enable_module() where status was being sent the schema value instead of "1"
  483. 2021-12-17
  484. Cleaned up old comments.
  485. Fixed bug where we were determing a course's transfer eqv. It was failing even though the souce hours were within the range
  486. of min and max hours. (We were only looking at == max hours, rather than a range from min to max).
  487. Fixed bug so that the "mini search" at top of the screen will cause the Students tab to "remember" last search.
  488. Added concept of "return to student" to the top nav of all pages, so you can quickly return to the last student you had pulled up.
  489. This only works for faculty users with something in $_SESSION['last_student_selected'].
  490. Added "E" to default enrolled grades, and "F,W,I" to default retake grades.
  491. We now log (as WATCHDOG_DEBUG) when user tries to access a page and gets either a 404 Not Found or 403 Access Denied.
  492. Suppress rare warning when calling session_destroy().
  493. 2021-12-15
  494. Adding some extra instructions for the edit groups page.
  495. Fixed bug where courses worth less than 1 credit hour were not showing as repeatable in groups, even when the "set catalog repeats" box was checked.
  496. Adding concept of "delete_flag" to advising_sessions table, similar to the advising_comments table. Also added permission to let users delete advising sessions
  497. for up to 3 months after posting, again, similar to the comments module.
  498. Updated comments module to make sure only the original author of a comment can delete it.
  499. 2021-12-14
  500. Added extra protection in our _fp_error_handler to not accidentally log passwords in plaintext.
  501. Fixed small bug in viewing watchdog entries where page was set to 1, always sending us to the second page
  502. of results if we clicked the Watchdog breadcrumb.
  503. 2021-12-13
  504. Added code to create /custom/files/content_uploads/ folder. Updated content module and engagements module
  505. to place uploaded files there.
  506. Fixed spelling of "README" file.
  507. 2021-12-12
  508. In calendar, when parsing ical feeds, we now correctly ignore time marked as "free" (transp == TRANSPARENT in the event). Also fixed bug where you couldn't schedule appointments
  509. on the exact start and stop hour of a date's availability window (based on the "default" setting for that unavail time).
  510. Altered the way Zoom API works to better support api specs for Zoom marketplace apps.
  511. If SMS is not enabled, then txt messages cannot be selected as a default notification method.
  512. 2021-12-09
  513. Added more watchdog (debug) statements having to do with checking IMAP server for messages.
  514. 2021-12-08
  515. Fixed error in engagements where test name was being shown as author of engagement.
  516. 2021-12-07
  517. Small modifications to media.css.
  518. 2021-12-02
  519. Added a README.txt file under custom/themes so that the themes folder will be created upon install.
  520. 2021-11-26
  521. Implemented multi-factor authentication (via email) for local users. The user can also choose to have their device "remembered" for 30 days, so they are not asked to
  522. re-authenticate every time. This will only work for local users with email addresses saved. Users with no email address, or users using LDAP, SSO, etc, will not
  523. be prompted to enter MFA code.
  524. Added convenience string functions like str_starts_with() to misc.inc, if not included. These are implemented in PHP 8; they are here for users not running PHP 8.
  525. Added admin email address as a required field in the initial install script for FlightPath.
  526. 2021-11-23
  527. Fixed bug where advising snapshot (on dashboard) wasn't taking all advisees into account, only the first 20. Simultaneously added
  528. code to allow for more than 20 student results at a time. Previously 20 was hard-coded, not a variable.
  529. Converted the "Contact the FlightPath Production Team" popup window into a dialog.
  530. 2021-11-19
  531. For the content type "schedule_unavailable_time", changed the ics url field to a textarea and text (in mysql) to be able to handle URLs longer than 255 chars.
  532. Fixed bug in install process where current schema of modules were not being set, causing the user to be told they need to run db updates even
  533. on first install.
  534. Enable almost all core modules on initial install.
  535. Modified smtp module so that if we send a blank message it will just not send (but log it) rather than show an error message.
  536. 2021-11-18
  537. Added "spinner" to submit button for duplicating an entire year of degree data.
  538. Watchdog page converted to use sortable table and pager query. Also added severity as column.
  539. Fixed bug in major students progress report (wasn't paying attention to school properly)
  540. Fixed bug where if student's school wasn't set correctly, it would look it up upon object creation.
  541. 2021-11-16
  542. Gave "clear all cache" its own permission.
  543. Cleaning up CSS.
  544. 2021-11-02
  545. Added concept of "capacity" to course_search module (stored per-term in the course_rotation_schedule table). Also added extra CSS when editing course schedule
  546. information.
  547. 2021-10-28
  548. Fixed bug in course_search module where the filter for "view courses offered" (and you select the term) was not working as expected
  549. in all situations, because it was not taking the school_id into account.
  550. Made the users module filter selection more intuitive. For example, the school selection, and the behavior when you search
  551. for a particular name, while a school is selected. Plus, made sure not to reset ALL filters if you select a letter. For example,
  552. you can now select a school, and then select by letters to see the students/users in that school. The Major pulldown also gets altered
  553. based on selected school. Also changed the order of the sub tabs so that Student Users comes second.
  554. 2021-10-27
  555. Added a new "how to customize" folder and custom theme which inherits from fp6_clean theme. It also includes instructions
  556. in a README file for copying the theme to your /custom/theme folder and overriding CSS styles.
  557. Added new function to make CSV strings prettier by adding a space after the comma. Makes them break correctly in HTML. Also
  558. changed term settings fields for advising settings from textfield to textarea, so you can enter more than 255 chars.
  559. 2021-10-24
  560. Added ability to designate notification recipients for when a student sends an SMS to a specific line (advisors will *always* receive
  561. such notifications from their advisees). This is a setting on the admin/user page for faculty-staff members only.
  562. 2021-10-21
  563. Added new concept to textareas with a maxlength set. It will now by default show the character count up to the max.
  564. Completed sending mass txt messages with Engagements, and getting back results in a CSV.
  565. 2021-10-20
  566. Made alteration to student_search so that if you have schools enabled, and search for a major within a school, you only see results for that
  567. school. Also, fixed bug where if more than one school had the same major code, it was skipping over them.
  568. Fixed some malformed HTML in the user module causing placeholder text to look weird.
  569. Fixed a bug by adding permission to schools, to permit a user to edit users/students from a particular school.
  570. 2021-10-17
  571. Minor change in admin.module to fix typo.
  572. Implemented sending mass text messages function as part of the Engagements
  573. module.
  574. 2021-10-14
  575. Fixed bug in notify module, where the notification history table wasn't created.
  576. Added permissions on a per-phone number level for sending SMS messages.
  577. Engagements show which department/description the SMS was sent to or from on the main screen.
  578. 2021-10-13
  579. Made changes to engagements schema, so that we can track the SMS number a txt message was sent from, as well as the sms message id, in the table.
  580. Made change to content_versions table schema, so we have the option of saving a "log" message with the content. This is accomplished by entering:
  581. $content->log = "some text here";
  582. before calling content_save($content);
  583. 2021-10-12
  584. Working on Engagements' ability to have multiple numbers on account they can receive SMS from.
  585. 2021-10-11
  586. Fixed bug in Engagements, where it was not showing attached files correctly from SMS.
  587. Changed how we handle incoming SMS messages to better catch "real time" messages.
  588. 2021-10-10
  589. Cleaned up code in various places.
  590. Fixed bug in Engagements where date_sent was not in correct format. Also fixed old code which was causing a PHP syntax error for txt messages.
  591. Added function db_get_cwid_from_user_id() to db.inc file.
  592. Added missing function engagements_handle_incoming_sms() to engagements to stop 404 error, though at the moment this function is just
  593. a placeholder, and might be removed in the future.
  594. 2021-10-08
  595. Upon system install, correctly get the modules' schema from their .info file, so we aren't told we need to run updates right off the bat.
  596. 2021-10-07
  597. Made changes to content module, so that we keep track of each version's author (user_id), but the original
  598. user_id in the content table doesn't get overwritten. This lets admin edit an existing piece of content, for example,
  599. without us losing track of who the original author was, or who the author is of each version.
  600. Added some extra CSS to Advising Screen, for the table rows containing the pie charts. Should make it easier
  601. to selectively hide or show them for future CSS devs.
  602. 2021-10-05
  603. Added a "view combined" link on History for advisings of multiple terms, so you can see all the selections on
  604. one screen.
  605. Added new column to "advising_sessions", called "advising_session_token". It is the same value when we advise for
  606. 1 or more terms. It makes it easier to get a list of all the terms that were advised at the same time, and possibly can
  607. be useful in the future for other modules.
  608. 2021-10-03
  609. Made it so the db updates system uses the Batch API so it won't timeout over long update jobs.
  610. Made it so that the watchdog "message" column is "longtext" instead of just "text". Same for announcements, alerts, and other core modules' tables.
  611. This was to prevent users from entering more than 65kb of text in a single field, something that was indeed a possibility, especially in the watchdog
  612. table when debugging complex datatypes. The decision was made to either use blob or "longtext" from now on, instead of "text", as it can store up to
  613. 4gb of data, with only a 2 byte increase in overhead over "text".
  614. Modified content module so we only look for content whose modules are enabled. This was done
  615. to prevent a PHP warning message, and to prevent strange behavior if we tried to edit previously
  616. submitted content.
  617. Made minor edit to batch test routine to better illustrate how limits work.
  618. Minor tweak when loading degree to prevent PHP warning.
  619. Since "groups" is a reserved keyword in MySQL 8+, edited various files to enclose in backticks when performing sql on that table.
  620. 2021-09-27
  621. Altered weights in dashboard render array for consistency.
  622. 2021-09-26
  623. Increased weight of submit and delete buttons in content module.
  624. 2021-09-22
  625. Made it so custom content types' add form is automatically allowed up to 4 additional wildcards in the menu, for future module
  626. developers to make use of, if desired.
  627. Fixed bug in the way form submissions were handled, which caused problems if you were depending on wildcards in URL during form submission.
  628. Fixed bug in Content module where editing content for non-admin wasn't working.
  629. Fixed bug in Content module to skip over markup fields.
  630. 2021-09-18
  631. Wrapped some strings in announcements with t().
  632. Converted system dashboard to use render array system so other modules can modify it.
  633. Made it so that we can pass strings in a render array for simplicity (they appear as plain html markup)
  634. Weights in elements can be floats now, instead of only ints.
  635. 2021-08-19
  636. Made it so that What If selection screen will show grad degree options if the student belongs to a grad rank other than 'GR' by checking
  637. setting first. Also re-worded the description of that school setting for clarity.
  638. 2021-08-18
  639. Fixed bug in edit groups, where it was looking for school_id in prod table, and not draft table. Same for degrees and courses.
  640. 2021-08-16
  641. Since FireFox (as of this date) does not support the datetime-local type, I added a "shim" library where we will override the browser's behavior
  642. with jquery.datetimepicker, if the browser does not support it.
  643. Removed logging of _REQUEST from when forms are submitted, as it could represent an insecure watchdog message.
  644. 2021-08-13
  645. Made alterations to the default settings.php file, to better explain certain concepts.
  646. Fixed system status page to not show %FLIGHTPATH_VERSION% as system version, if it came from git repository. Instead
  647. it just shows "GitRepo".
  648. 2021-08-12
  649. Cleaned up some CSS for the permissions form (in the user module).
  650. Added "sticky" headers to permissions form to make it easier to use.
  651. 2021-08-11
  652. Added a "custom settings" area to the default settings.php which is created during the installation process. Also changed some of the wording in the
  653. settings.php file, for clarity.
  654. 2021-08-10
  655. Made the access stats report look nicer.
  656. Added more logging (including WATCHDOG_DEBUG) throughout FlightPath to make it easier to track activity.
  657. Added more time to setting to keep DEBUG entries, as well as wrapped more strings in t().
  658. Made changes to stats to make it easier to add a "school select" form for reports that need it.
  659. Adjusted major students progress report to use school_id correctly.
  660. 2021-08-09
  661. Fixed bug with What If limit on selections; wasn't counting tracks correctly.
  662. 2021-08-08
  663. Added the school_id and school_code to body class when viewing students. The idea is to help CSS developers down the road.
  664. Cleaned up some on-screen messaging when changing terms.
  665. Added "spinner" property to apply draft changes button, changed description text as well.
  666. Fixed bug in editing group definitions where it was not respecting the new setting which allows "default" courses as well.
  667. Also it was not properly disabling the Required Courses textarea, as it was using a String and not an Array for attributes.
  668. Made it so that when setting attributes on a form element, it must always be in the form of an array. Updated various files
  669. throughout FlightPath to make sure that was the case.
  670. Added new file, cli.php. It's a command-line-only file. At the moment, all it can do is clear the system's cache, but more commands
  671. will be added eventually.
  672. 2021-08-06
  673. Added new module_enabled() function to misc, which, due to caching, will make it faster to see if a module
  674. is enabled or not, rather than using function_exists(). Updated various files to use this new function instead
  675. of function_exists()
  676. Added new setting to schools where courses from the "default" school can be used in non-default degrees and groups.
  677. Added create table instructions to enagagements.install for required tables.
  678. Modified the fp_join_assoc() and explode functions to use a separator of _S- instead of just - (since we might be sending negative numbers).
  679. Removed bug where "Substitute" tab was showing in popup even on "courses added".
  680. Removed "Required by" text/line if we are in the Courses Added block, or if we are looking at a degree with only one "degree" (not combined).
  681. Fixed bug with student_files which was preventing file uploads.
  682. 2021-08-05
  683. Added styling for "date" and "time" form element types.
  684. Added "major student progress" report to core system reports.
  685. Updated various reports (from stats module) to handle school_id in some way.
  686. Updated code to make sure school_id was supplied to key functions for determing course_id from name, as well
  687. as changes to prereq module to ensure school_id was supplied to key functions.
  688. Marked a couple unused methods/functions for removal by adding z__ before the name.
  689. Fixed bug in users' Faculty Advisees list, where in the comment for an advisee you couldn't see their major code correctly.
  690. 2021-08-04
  691. Removed out-of-date setting for student_search, where we can only search for majors in the current catalog year.
  692. Got rid of the course_search "report" where you can download offerings as CSV. Should be under stats anyway. For now,
  693. simply removed.
  694. Updated parts of course_search (dealing with getting syllabus) to only use course_id in queries.
  695. Updated add new degree and copy degree to pay attention to school_id.
  696. Added new icons to system, and made sure all core modules had an icon associated with them in the Admin Console.
  697. Changed the way we denote that we are NOT overriding a core variable. Instead of deleting from table, we mark it as 'no'
  698. Added multi-school functionality to audit settings.
  699. Added multi-school functionality to course search settings.
  700. Fixed bug with upcoming appointments.
  701. If using schools, made it so the advising snapshot lets you switch between schools.
  702. 2021-08-03
  703. Added new variable_delete() function to db.inc.
  704. Added new variable_exists() function to db.inc. Returns TRUE or FALSE if the variable is even in the variables table.
  705. Changed schools module to let us override default school settings on a *per field* level.
  706. Modified how variable_get_for_school() checks to see if we are overriding the default school's val.
  707. Modified admin's edit-advising-settings to handle multiple schools.
  708. Fixed bug where db's update_course_requirement_by_name was trying to use school_id in tables which didn't have it.
  709. 2021-08-02
  710. Added new menu type: MENU_TYPE_DEFAULT_TAB. This is a tab which otherwise behaves like a MENU_TYPE_NORMAL_ITEM.
  711. Added new page_setting to menu router api: $item['page_settings']['tab_title'] = "blah". This is an optional special string
  712. used just for the tab of a page, separate from it's regular title.
  713. Replaced calls to GLOBALS['fp_system_settings'] array with variable_get() where appropriate. Cleaned up unused functions.
  714. Added school column to output for student search of advisees.
  715. Added ability to specify optgroups for options in select lists in the Form API.
  716. Added ability to search for majors within a school (if user is allowed) on the student search screen.
  717. Modified course_search to let you search by school, if schools module is enabled.
  718. Fixed bug in course_search where it was not uploading syllabi correctly. Also shortened filename of uploaded
  719. syllabi to a more reasonable length.
  720. Added "school" column to the list of courses you can edit from course_search module.
  721. 2021-08-01
  722. Deprecating fp_get_system_settings() function. It is now better served by simple use of variable_get().
  723. Changed school setting "what_if_catalog_year" to "what_if_catalog_year_mode" to disambiguate from advising variables.
  724. 2021-07-31
  725. Removed extra files from modules that used to be contrib, but are now in core (ex: CHANGELOG files)
  726. Added school_id to primary key for table degree_college
  727. In AdvisingScreen's output_to_browser(), $page_title has tags stripped before being used as HTML tag </li><li> </li><li> Tweaked tabs' css slightly to give a little more whitespace below tabs. </li><li> </li><li> Fixed bug where unchecked checkbox was never being saved as boolean false, and was instead being saved as NULL. Also, wasn't working </li><li> if inside a fieldset. </li><li> </li><li> </li><li>2021-07-30 </li><li> Fixed bug in Calendar with Upcoming Appointments still not showing "today" and "tomorrow" appointments correctly. Went with different approach. </li><li> </li><li> Added ability to edit semester block numbers when editing a degree. </li><li> </li><li> Added ability to limit the number of selections on What If. It defaults to 5. This is to help keep students from blowing up the server by selecting </li><li> every degree possible. </li><li> </li><li> Updated blank degrees (and schools) to be able to search by school. </li><li> </li><li> </li><li> </li><li>2021-07-29 </li><li> Fixed deprecated notice. </li><li> </li><li> Calendar bug left in from dev-- it was not preventing students from clicking "back" and saving a second time. </li><li> </li><li> Added "spinner" attribute to button for confirm appointment and save. </li><li> </li><li> Added ICS attachment to notifications for student-initiated appointments. </li><li> </li><li> Removed dev code for external calendars. </li><li> </li><li> Added new code for caching external calendars for at least 5 minutes, to save frequent lookups. </li><li> </li><li> Added new code for Course objects, to keep track of all the semesters it appears in. Good for combo-degrees. </li><li> </li><li> </li><li>2021-07-28 </li><li> Fixed bug in calendar's upcoming appointments tab, wasn't showing date ranges correctly for timezones. </li><li> </li><li> Added ability to handle attachments to fp_mail(), as well as string attachments to smtp module. </li><li> </li><li> Added ability to send attachments (string method) with notifications by email. </li><li> </li><li> Added new property that can be added to form elements (like submit buttons), "spinner" => TRUE. This </li><li> will cause a spinning graphic to appear when the button is pressed, and the button to disable itself so it </li><li> cannot be pressed more than once. </li><li> </li><li> Made it so all "content" forms use the spinner property for their submit buttons. </li><li> </li><li> </li><li>2021-07-27 </li><li> Implemented check when searching for students, to make sure user has correct permissions to search for student in particular school. </li><li> </li><li> Added ability to trim only DEBUG messages from the watchdog. </li><li> </li><li> Added ability to have external CSS files. This is now a setting in System Settings, under the theme section. </li><li> </li><li> Added default favicon to fp6_clean theme. </li><li> </li><li> </li><li>2021-07-26 </li><li> Fixed bug when editing groups, where school_id was not correctly being loaded. </li><li> </li><li> Fixed bug in group definitions and group course repeats, where FP was not respecting the school_id. </li><li> </li><li> Set a default icon (major.gif) for new groups. </li><li> </li><li> Added "upcoming appointments" tab to the Calendar page, which displays events which are approaching. </li><li> </li><li> </li><li>2021-07-25 </li><li> Configured blank degrees to make use of the render system (so other modules can make changes more easily) </li><li> </li><li> </li><li>2021-07-23 </li><li> Added a few more details to render array in AdvisingScreen, when drawing course rows. Also added argument to include the group a course is assigned to, if applicable, to </li><li> draw_course_row(). This also helps the render engine and any modules which need it. </li><li> </li><li> </li><li>2021-07-14 </li><li> Fixed bug where form_error's was messing up markup_no_wrappers elements. </li><li> </li><li> Added extra validation on degree edit form, so that it stops you from adding a duplicate group with mismatched type or min hours. Also made it </li><li> so you can delete such a group. </li><li> </li><li> </li><li>2021-07-12 </li><li> Made it more clear that the currently used SMS service in Engagements is "SignalWire". Also made sure that emails processed by Engagements were deleted after </li><li> they were parsed, so they do not fill up the email server's Trash folder. </li><li> </li><li> </li><li>2021-07-11 </li><li> Fixed bug in engagements module where it was looking for a table which does not exist. </li><li> </li><li> Made it so when an appointment (with Zoom) is cancelled, it also deletes the Zoom meeting from zoom's servers. </li><li> </li><li> </li><li>2021-07-10 </li><li> Removed page titles from the Student search pages/forms. </li><li> </li><li> Added new CSS for printing. </li><li> </li><li> Added ability to add classes to collapsible fieldsets. </li><li> </li><li> </li><li>2021-07-09 </li><li> Implemented handling of numeric grades in FlightPath. Basically, they must be converted to letter grades at the time </li><li> they are assigned. There is also now a new field in Course: db_grade. This is the actual grade as it is stored in the </li><li> the database. </li><li> </li><li> </li><li> </li><li>2021-07-08 </li><li> Cleaning up code, adding more content to render array system. Cleaning up malformed HTML. </li><li> </li><li> Continuing work on themeing and rendering system. </li><li> </li><li> </li><li>2021-07-07 </li><li> Converted advise_display_view to use render array system. </li><li> </li><li> Changed when drawing course rows, no longer hard-coding widths, styles, align, etc. </li><li> elements. Instead, we are relying entirely only CSS classes for styling. </li><li> </li><li> </li><li>2021-07-06 </li><li> Converted AdvisingScreen::displaySemester to using render array system. </li><li> </li><li> For markup elements in the form_api, if type is not explicitly set to "markup", and is left blank, </li><li> then the default will be "markup_no_wrappers", which means no wrapping divs will be used. </li><li> </li><li> Converted AdvisingScreen::draw_course_row to use render array system. </li><li> </li><li> Fixed bug where remainder of course requirement (after partial sub) wasn't sorting correctly when using </li><li> the "sort by database id" setting. </li><li> </li><li> Fixed bug in Substitution tab, where split sub "pieces" were not showing the correct number of hours. </li><li> </li><li> </li><li> </li><li>2021-07-02 </li><li> Modified Calendar module so that event types can be sheduled for longer durations (up to 2 hrs), have longer buffers (up to 2hrs) and have longer "prevent within" times </li><li> (up to 24 hours). </li><li> </li><li> Added more literal strings to t() so they can be translated. </li><li> </li><li> </li><li>2021-06-28 </li><li> Made change in content_content_load(), to make sure that when we load based on cid, we order by vid DESC, to make </li><li> sure we always get the most recent version. </li><li> </li><li> Fixed code in student_search, where the "include inactive students" checkbox was being ignored. Also changed settings </li><li> for extra conditions to add to query. </li><li> </li><li> Made changes to the way Student Profile hook works, so that other modules can more easily add to the list, and modify existing </li><li> entries if desired. </li><li> </li><li> Fixed bug where recommended and hidden courses were not behaving correctly in groups. Worked in Blank Degrees but not in What If or </li><li> on the actual degree plan. </li><li> </li><li> </li><li>2021-06-26 </li><li> Added new field to calendar's appointment content type, to keep up with video meeting data. </li><li> </li><li> Fixed typo in the content.module (misspelling of word). </li><li> </li><li> </li><li>2021-06-23 </li><li> Instead of passing the session_id during redirect, we now pass a "fp_session_str" which contains </li><li> a method of validating the session_id, to make sure it is not a hacker attempting to imitate a valid </li><li> session. This was accomplished by new functions in misc.inc and checking in index.php before we </li><li> trust the session_id in the URL. </li><li> </li><li> </li><li> </li><li>2021-06-22 </li><li> Fixed bug in user module where adding a new faculty user caused mysql error. </li><li> </li><li> Added a backtrace (like we do for MySQL errors) to the PHP error handler in misc.inc. Also adding to watchdog </li><li> when we get a warning or error from the handler. </li><li> </li><li> Changed the way cookies are unset on logout, to fix an issue where they were not being unset correctly, but also </li><li> to handle possible array notation in the cookie names. See system.module </li><li> </li><li> Made changes to watchdog severity level for certain types of data, in anticipation of a module which would delete, for example, </li><li> "WATCHDOG_DEBUG" entries after X amount of time, since they are the least important. Also made changes to the PHP error handler </li><li> so it correctly identifies in the watchdog whether it was a PHP error or warning, and adjusts the severity constant accordingly. </li><li> </li><li> Fixed typo in user settings pulldown menu. </li><li> </li><li> Made it so if you are not logged in, the left sidebar menu shows a link to the login page. </li><li> </li><li> </li><li>2021-06-17 </li><li> Fixed small typo in form_error() message when rejecting a saved degree. </li><li> </li><li> In student_search module, got rid of the "majors"-related permissions. Also cleaned up code which had been commented out. </li><li> </li><li> </li><li>2021-06-16 </li><li> Adding in new setting to disable all student logins (unless whitelisted). It's in the System Settings form. </li><li> </li><li> Added is_disabled and last_login to fields in the user object. </li><li> </li><li> Added new hook to allow easy manipulation of student profile items in the "currently advising" box at top of screen. </li><li> </li><li> Changing user_settings to be a key/value pair type table, making it easy to add new settings in the future. </li><li> </li><li> Created new table called "user_attributes", and it's used the same as user_settings. This lets us store details about </li><li> a student, for example, if they are an athlete or student worker, etc, w/o having to hard-code any values. We are removing the </li><li> student_attributes and faculty_attributes tables at the same time; user_attributes will replace both tables. </li><li> </li><li> </li><li> </li><li>2021-06-15 </li><li> Added more literal strings to t() function so they can be translated. </li><li> </li><li> </li><li>2021-06-13 </li><li> Changed system.install so that institution_id is a 100 varchar in the database, instead of 10. Also made `name` an index for transfer_institutions table. </li><li> </li><li> Removed some default character set and collation vals from .install scripts, as this can cause a problem in MySQL 8+. </li><li> </li><li> Removed apply_draft_changes logic from schools module, since no longer needed and causing error. Cleaned up old code. Made sure </li><li> What If mode only showed correct degrees based on the students' school. </li><li> </li><li> Added logic in schools and admin.degrees.inc when copying a degree, make sure to keep up with school id. </li><li> </li><li> Fixed Duplicate entire catalog year function to also respect school_id. </li><li> </li><li> </li><li>2021-06-12 </li><li> Working on schools functionlity for groups & definitions. </li><li> </li><li> Fixed a bug where icon filename field was no longer visible when editing degrees. </li><li> </li><li> Tweaks to popup which displays the degrees using group. </li><li> </li><li> Added a confirm dialog when changing schools, since it could cause all sorts of problems. </li><li> </li><li> Watchdog insert was failing because anon user school_id was null; wasn't being intval'd. </li><li> </li><li> Fixing PHP warning in system_init(). </li><li> </li><li>2021-06-11 </li><li> Added _validate function when editing a degree, so we can test for school mis-match. Also fixed a bug where if there was more than one </li><li> form_error() for the same element, it wouldn't display the red border around that element. Also made it so that markup fields </li><li> can also have form_error called on them. </li><li> </li><li> </li><li>2021-06-10 </li><li> Added ability to have group requirements (in degrees) with fractional hours. Ex: 0.5 hours or 1.2 hours, etc. Previously, </li><li> when a group was loaded, the hours_required field was being intval()'d. Changed to floatval(). </li><li> </li><li> Fixed bug where course descriptions were not being cached correctly due to a typo. </li><li> </li><li> Wrapped "hours" and "hrs" with t() function so those words can be translated to "credits" if need be in a hook_translate function. </li><li> </li><li> Fixed bug where group couldn't be deleted from degree plan due to school_id being set. </li><li> </li><li> Worked on courses issues with schools. </li><li> </li><li> </li><li>2021-06-07 </li><li> Added schools select list option for user forms, made other cosmetic changes. </li><li> </li><li> Changed users module so that you can enter DEPT_CODE along with department. Change table schema so that </li><li> college, dept_code, and deparment are varchar 255. Will use a machine name version of department if no DEPT_CODE </li><li> is entered. </li><li> </li><li> Found a bug on the dashboard (system.module), where it states what day it is. I was using strtotime("today"), which apparently </li><li> was causing issues due to timezone conversions. Switched it to time() and that fixed the issue. </li><li> </li><li> </li><li>2021-06-06 </li><li> Finishing up users screen for school id, both faculty and students. Also added filter options to make it look </li><li> more consistent. Added pager to student users screen, since we might theoretically load the entire student </li><li> list, both past and present. It shows 30 at a time now. </li><li> </li><li> </li><li>2021-06-04 </li><li> Working on courses with new school_id. Changed appearance of courses screen to look more like the other degree </li><li> edit pages. Made better use of tables and highlighting when you mouse over a row. Added a filter form like others </li><li> as well. </li><li> </li><li> </li><li>2021-06-03 </li><li> Added new schools filter option to degrees, and working on groups. Filters on degrees list now actually </li><li> a form (and added new form to groups) so other modules can modify with hook_form_alter if desired. Right now, </li><li> it's only really for the schools module. </li><li> </li><li> </li><li>2021-06-01 </li><li> Fixed bug in pager_query which was sometimes throwing numbers off. Expanded functionality of the paget_query function. </li><li> </li><li> More work on school_id system, amending the need in some tables. Decided to declare that CWIDs *must be unique* in FlightPath. </li><li> Therefore, the users table will be the only place that a user's school_id is stored. </li><li> </li><li> Changed wording on user module, which stated CWID had to be numeric. It does not. </li><li> </li><li> </li><li>2021-05-31 </li><li> Adding school_id to api and queries throughout FlightPath. </li><li> </li><li> </li><li>2021-05-27 </li><li> Changing some style issues when listing multiple degrees for a student. </li><li> </li><li> Change wording for select of tracks if you are required to select a certain number of tracks for a degree. </li><li> </li><li> Fixed bug where you couldn't override a semester block title unless you also had a course. </li><li> </li><li> </li><li>2021-05-25 </li><li> Added schools module to core, and made changes to system.install as well as other .install files, so that tables </li><li> now have a school_id field and needed keys. </li><li> </li><li> </li><li>2021-05-16 </li><li> Added lots of changes to student search. We now can see Academic Priority. Uses pager query and table sort as well. No </li><li> more limit on 300 students, since we can do pager. Made table headers responsive, as well as priority vals. </li><li> </li><li> </li><li>2021-05-11 </li><li> Added ability to have custom logout messages. </li><li> </li><li> </li><li>2021-05-09 </li><li> Added "last_login" column to users table, and to users screen in admin console. Also make it so the "contact FlightPath production team" link </li><li> does not appear if no email address is entered. </li><li> </li><li> </li><li>2021-05-05 </li><li> In the school settings form, you may now choose to sort courses in degrees and groups not by alphabetical, but by the order </li><li> in which they were entered. </li><li> </li><li> </li><li>2021-05-04 </li><li> Added fields to groups and group_requirements tables (incl. draft_) to facilitate public notes in groups, </li><li> as well as "attributes" on a per-requirement level. </li><li> </li><li> Changed popup description to use fp_alert() function, with base64 encoding so we don't have to worry </li><li> about trouble characters, and can enter HTML as well. </li><li> </li><li> </li><li>2021-04-21 </li><li> Made it simpler to define "unavailable days" for scheduling appointments. </li><li> </li><li> Fixed unavailable times table to look cleaner and easier to understand. </li><li> </li><li>2021-04-20 </li><li> Making sure we log incorrect login attempts. </li><li> </li><li> </li><li>2021-04-06 </li><li> Fixing up blank degrees module, make it show if user has permission. </li><li> </li><li> Added masquerade module to core, permits searching by partial email and lastname now. </li><li> </li><li> </li><li>2021-04-05 </li><li> Making new degrees "allow dynamic" by default. </li><li> </li><li> Removing outdated settings variables. </li><li> </li><li> Documentation for content module. Fleshed out the basic page content type as well. </li><li> </li><li> </li><li>2021-03-14 </li><li> Removing "blocks" module from Core. </li><li> </li><li> Adding various modules to core. </li><li> </li><li> </li><li>2021-02-20 </li><li> Added the base_url to the server name when sending mysql errors via email. </li><li> </li><li>2020-10-07 </li><li> Initial commit of 6.x branch. There are about to be various changes to FlightPath, which warrants </li><li> a new major version. </li></ol></code></pre></div></div> </div> </div> <!-- /.block --> </div> <!-- /.region --> </section> </div> <!-- First sidebar --> <aside id="sidebar-first"><div class="region region-sidebar-first"> <div id="block-block-1" class="block block-block"> <div class="content"> <p><strong>Get it now</strong> (free download)<br /> <img alt="" src="/sites/getflightpath/files/uploads/download_icon.png" style="width: 18px; height: 18px;" /><span style="font-size: 16px;">  </span><a href="/project/flightpath"><span style="font-size:16px;">FlightPath 6.x</span></a></p> <p><strong>Hosting & Support<br /> Services  </strong><br /> <span style="font-size: 16px;"><img alt="" src="/sites/getflightpath/files/uploads/FlightPath%20Academics_plane%20only.png" style="width: 18px; height: 13px;" />  <a href="https://flightpathacademics.com">FlightPath Academics</a></span></p> <!-- <p><strong>Try it out</strong><br /> <span style="font-size:16px;"><span style="color:#ff99cc;"><span style="font-size: 22px;"><img alt="" src="/sites/getflightpath/files/uploads/Heart.png" style="width: 18px; height: 18px;" /></span></span>  <a href="http://getflightpath.com/sites/getflightpath/demo/4x/flightpath" target="_blank">Live Demo</a></span></p> --> <p><strong>Add-ons</strong><br /> <span style="font-size:16px;"><img alt="" src="/sites/getflightpath/files/uploads/kcmdf.png" style="width: 18px; height: 18px;" />  <a href="/projects">Modules</a></span></p> </div> </div> <!-- /.block --> <div id="block-menu-menu-site-menu" class="block block-menu"> <h2 >Resources</h2> <div class="content"> <ul class="menu"><li class="first leaf"><a href="/documentation" class="site-documentation">Documentation</a></li> <li class="leaf"><a href="/videos">Videos & Demos</a></li> <li class="leaf"><a href="/api/flightpath" class="site-api">API Reference</a></li> <li class="leaf"><a href="/contact" class="site-contact">Contact / Support</a></li> <li class="last leaf"><a href="https://github.com/swampopus/flightpath" class="site-github">Github</a></li> </ul> </div> </div> <!-- /.block --> </div> <!-- /.region --> </aside> </div> <!-- Second sidebar --> </div> </div> <div class="parallax-block" id="home-block-one"> </div> <div class="parallax-block two" id="home-block-two"> </div> <div class="parallax-block" id="home-block-three"> </div> <div id="home-bottom-block" class="footer_block bottom_widget"> </div> <div class="parallax-block" id="home-block-three"> </div> <!-- Footer --> <div id="footer"> <div class="footer_credit"> <div id="copyright" class="full-wrap clearfix"> <p class="copyright">Copyright © 2024, FlightPath Academics</p> <p class="credits"> Powered by <a href="https://flightpathacademics.com">FlightPath Academics</a></p> <!-- Social Links --> <!-- End Social Links --> </div> </div> </div> </div> </body> </html>