Metaboxes not saving data

There were three issues:

The first wasn’t visible in the code presented. a wp_register_styles call was put into the constructor, which caused errors and somehow prevented saving post metadata.

Second, the date field was a HTML5 date field, which conflisted with jQuery’s datepicker. Changing it to a text field fixed that.

Third, the final if statement in the save_meta function would evaluate true whether the metakey existed or not. If it did exist, it wouldn’t get updated since that statement had the add_post_meta function. The second conditional statement ($new_meta_value && $new_meta_value != $meta_value) would be true in both cases and used the update_post_meta function, which will also create a new metakey if it doesn’t already exist.