v4.2.0 release
Release date: July 3, 2019
Significant new features
- The new media module is a more user-friendly alternative to the promo module with no link option. In the new media module, you can select Image (default), Video, or Audio for the Type. To use the new media module, there are two options:
Image Video Audio Type
- On the New Module content edit form, select Media for the Type.
- Create any new content type to which content can be added (e.g., page) by selecting Add for Content > Misc > Media. Filed under: media module
- The content management API in GraphQL now supports deleting content. Filed under: GraphQL, API
The following features have been added to notifications:
- A built-in workflow subscription
- An option to select which message formatter that Brightspot should use. (Set under Admin > Sites & Settings > Global > Main > Notifications.) Filed under: notification
Significant improvements
- When creating or editing a custom content edit form, you can now show, hide, or rename fields. Filed under: content form
- The blog content edit form now contains a description field with a rich-text editor, which is the same as the description field for section, page, and tag. Filed under: blog, rich-text editor
- On the Assignment Desk dashboard, you can now save a search to run again at a later time, and you can now export the results of a search as a .csv file. Filed under: Assignment Desk, CMS search
- The Sharing Overrides (External) options that exist on other content types such as season, franchise, episode, special, tag, and section have been added to the author content type. The Sharing Overrides, which are on the Overrides tab, are:
Sharing Overrides (External) Sharing Overrides Overrides
- Share title, which displays when a visitor shares the author information via the social toolbar to Facebook, LinkedIn, etc. By default, it is the Name field on the Main tab but you can change it.
- Share description, which displays when a visitor shares an asset via the social toolbar.
- Share image, which displays when a visitor shares an image via the social toolbar. By default, the image is the same as the one used for the author but you can change it to another image. Filed under: author
Significant defects addressed
- An error which appeared for the search results for SEMrush Keywords has been addressed. Filed under: SEMrush
- Users were unable to edit their current profiles; the profile functionality now works as expected. Filed under: user profile
Breaking changes
- This release changes
SavedSearches
to be stored as a record, so existing saved searches will no longer work. Use the following script to pull old saved searches and re-save them to work with the new implementation:
public class Code {
public static Object main() throws Throwable {
(new SavedSearchesTask()).submit();
return new Date();
}
public static class SavedSearchesTask extends Task {
private static int TASK_WRITERS_SIZE = 4;
private static int TASK_BATCH_SIZE = 50;
private static boolean TASK_COMMIT_EVENTUALLY = Boolean.TRUE;
private static final String TASK_DESCRIPTION = "Migrate SavedSearches";
@Override
public void doTask() throws Exception {
// set up async queue & writers
AsyncQueue<Object> queue = new AsyncQueue<>();
Database db = Database.Static.getDefault();
for (int i = 0; i < TASK_WRITERS_SIZE; i++) {
AsyncDatabaseWriter<Object> asyncDbWriter = new AsyncDatabaseWriter<>(
TASK_DESCRIPTION, queue, db,
WriteOperation.SAVE, TASK_BATCH_SIZE, TASK_COMMIT_EVENTUALLY);
asyncDbWriter.submit();
}
// Query
Query<ToolUser> query = Query.from(ToolUser.class);
for (ToolUser user : query
.noCache()
.iterable(50)) {
State state = user.getState();
Object savedSearches = state.get("savedSearches");
if (savedSearches instanceof Map) {
Map<String, String> oldSavedSearches = (Map<String, String>) savedSearches;
// Create new SavedSearches from existing map
for (Map.Entry<String, String> search : oldSavedSearches.entrySet()) {
SavedSearch savedSearch = new SavedSearch(search.getKey(), search.getValue(), user);
// Queue up new SavedSearch to be saved on its own as it's not an embedded object
queue.add(savedSearch);
}
// Remove old map of savedSearches
state.remove("savedSearches");
// then queue it up
queue.add(user);
}
}
// Close the queue!
queue.closeAutomatically();
}
}
}
Previous Topic
v4.2.1.1 release