Allow overriding xblock icons with plugins

Description

This is a follow-up to #19772, which allowed setting custom icons for each unit in Studio. By default the icon would be derived from unit's type. The suggestion was to do move it to a plugin. This PR introduces some changes required to move it to external Django application

Most of this diff is about extracting modals from monolithic `cms/static/js/views/modals/course_outline_modals.js` to make them reusable. We also extracted `CourseOutlineView` class into a field in `cms/static/js/views/pages/course_outline.js` to make this view easily extendable.

For overriding implementation of getting icon, we implemented `pluggable_override` decorator.

*JIRA tickets*: TBD

*Merge deadline*: None

*Testing instructions*:

1. Install [custom-unit-icons](https://github.com/open-craft/custom-unit-icons) for both LMS (`make lms-shell` and studio (`make studio-shell`):
pip install git+https://github.com/open-craft/custom-unit-icons.git@agrendalath/bb-933-custom-icons`
1. Set `GET_UNIT_ICON_IMPL = 'custom_unit_icons.icons.get_icon'` in `lms/envs/private.py` and `make lms-restart`.
1. Install a comprehensive theme that adds icon editor to studio (we'll publish this part after the internal review). It is also possible to do this one and the next step by updating modulestore directly via mongo shell, but the level of nesting makes it a little more complex.
1. Use the "eye" button next to the unit in studio and change icon for the unit.
1. Check in the LMS that the icon has been changed.

*Reviewers*

  • [ ] @viadanna

  • [ ] edX reviewer[s] TBD

Status

Assignee

Marco Morales

Reporter

Open Source Pull Request Bot

Labels

Contributor Name

Piotr Surowiec

Repo

edx/edx-platform

Customer

Epic Link

None

OSCM Assignee

None

Priority

Unset
Configure