This reverts commit 104d42c67a.
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
"""
|
||||
Common utility functions useful throughout the contentstore
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import configparser
|
||||
import logging
|
||||
from collections import defaultdict
|
||||
@@ -443,7 +442,7 @@ def get_taxonomy_list_url():
|
||||
return taxonomy_list_url
|
||||
|
||||
|
||||
def get_taxonomy_tags_widget_url(course_locator=None) -> str | None:
|
||||
def get_taxonomy_tags_widget_url(course_locator) -> str:
|
||||
"""
|
||||
Gets course authoring microfrontend URL for taxonomy tags drawer widget view.
|
||||
|
||||
@@ -452,9 +451,7 @@ def get_taxonomy_tags_widget_url(course_locator=None) -> str | None:
|
||||
taxonomy_tags_widget_url = None
|
||||
# Uses the same waffle flag as taxonomy list page
|
||||
if use_tagging_taxonomy_list_page():
|
||||
mfe_base_url = settings.COURSE_AUTHORING_MICROFRONTEND_URL
|
||||
if course_locator:
|
||||
mfe_base_url = get_course_authoring_url(course_locator)
|
||||
mfe_base_url = get_course_authoring_url(course_locator)
|
||||
if mfe_base_url:
|
||||
taxonomy_tags_widget_url = f'{mfe_base_url}/tagging/components/widget/'
|
||||
return taxonomy_tags_widget_url
|
||||
|
||||
@@ -25,14 +25,10 @@ from common.djangoapps.edxmako.shortcuts import render_to_response
|
||||
from common.djangoapps.student.auth import has_course_author_access
|
||||
from common.djangoapps.xblock_django.api import authorable_xblocks, disabled_xblocks
|
||||
from common.djangoapps.xblock_django.models import XBlockStudioConfigurationFlag
|
||||
from cms.djangoapps.contentstore.toggles import (
|
||||
use_new_problem_editor,
|
||||
use_tagging_taxonomy_list_page,
|
||||
)
|
||||
from cms.djangoapps.contentstore.toggles import use_new_problem_editor
|
||||
from openedx.core.lib.xblock_utils import get_aside_from_xblock, is_xblock_aside
|
||||
from openedx.core.djangoapps.discussions.models import DiscussionsConfiguration
|
||||
from openedx.core.djangoapps.content_staging import api as content_staging_api
|
||||
from openedx.core.djangoapps.content_tagging.api import get_content_tags
|
||||
from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-order
|
||||
from xmodule.modulestore.exceptions import ItemNotFoundError # lint-amnesty, pylint: disable=wrong-import-order
|
||||
from ..toggles import use_new_unit_page
|
||||
@@ -65,7 +61,7 @@ CONTAINER_TEMPLATES = [
|
||||
"editor-mode-button", "upload-dialog",
|
||||
"add-xblock-component", "add-xblock-component-button", "add-xblock-component-menu",
|
||||
"add-xblock-component-support-legend", "add-xblock-component-support-level", "add-xblock-component-menu-problem",
|
||||
"xblock-string-field-editor", "xblock-access-editor", "publish-xblock", "publish-history", "tag-list",
|
||||
"xblock-string-field-editor", "xblock-access-editor", "publish-xblock", "publish-history",
|
||||
"unit-outline", "container-message", "container-access", "license-selector", "copy-clipboard-button",
|
||||
"edit-title-button",
|
||||
]
|
||||
@@ -182,14 +178,9 @@ def container_handler(request, usage_key_string):
|
||||
prev_url = quote_plus(prev_url) if prev_url else None
|
||||
next_url = quote_plus(next_url) if next_url else None
|
||||
|
||||
show_unit_tags = use_tagging_taxonomy_list_page()
|
||||
unit_tags = None
|
||||
if show_unit_tags and is_unit_page:
|
||||
unit_tags = get_unit_tags(usage_key)
|
||||
|
||||
# Fetch the XBlock info for use by the container page. Note that it includes information
|
||||
# about the block's ancestors and siblings for use by the Unit Outline.
|
||||
xblock_info = create_xblock_info(xblock, include_ancestor_info=is_unit_page, tags=unit_tags)
|
||||
xblock_info = create_xblock_info(xblock, include_ancestor_info=is_unit_page)
|
||||
|
||||
if is_unit_page:
|
||||
add_container_page_publishing_info(xblock, xblock_info)
|
||||
@@ -225,7 +216,6 @@ def container_handler(request, usage_key_string):
|
||||
'draft_preview_link': preview_lms_link,
|
||||
'published_preview_link': lms_link,
|
||||
'templates': CONTAINER_TEMPLATES,
|
||||
'show_unit_tags': show_unit_tags,
|
||||
# Status of the user's clipboard, exactly as would be returned from the "GET clipboard" REST API.
|
||||
'user_clipboard': user_clipboard,
|
||||
})
|
||||
@@ -608,84 +598,3 @@ def component_handler(request, usage_key_string, handler, suffix=''):
|
||||
)
|
||||
|
||||
return webob_to_django_response(resp)
|
||||
|
||||
|
||||
def get_unit_tags(usage_key):
|
||||
"""
|
||||
Get the tags of a Unit and build a json to be read by the UI
|
||||
|
||||
Note: When migrating the `TagList` subview from `container_subview.js` to the course-authoring MFE,
|
||||
this function can be simplified to use the REST API of openedx-learning,
|
||||
which already provides this grouping + sorting logic.
|
||||
"""
|
||||
# Get content tags from content tagging API
|
||||
content_tags = get_content_tags(usage_key)
|
||||
|
||||
# Group content tags by taxonomy
|
||||
taxonomy_dict = {}
|
||||
for content_tag in content_tags:
|
||||
taxonomy_id = content_tag.taxonomy_id
|
||||
# When a taxonomy is deleted, the id here is None.
|
||||
# In that case the tag is not shown in the UI.
|
||||
if taxonomy_id:
|
||||
if taxonomy_id not in taxonomy_dict:
|
||||
taxonomy_dict[taxonomy_id] = []
|
||||
taxonomy_dict[taxonomy_id].append(content_tag)
|
||||
|
||||
taxonomy_list = []
|
||||
total_count = 0
|
||||
|
||||
def handle_tag(tags, root_ids, tag, child_tag_id=None):
|
||||
"""
|
||||
Group each tag by parent to build a tree.
|
||||
"""
|
||||
tag_processed_before = tag.id in tags
|
||||
if not tag_processed_before:
|
||||
tags[tag.id] = {
|
||||
'id': tag.id,
|
||||
'value': tag.value,
|
||||
'children': [],
|
||||
}
|
||||
if child_tag_id:
|
||||
# Add a child into the children list
|
||||
tags[tag.id].get('children').append(tags[child_tag_id])
|
||||
if tag.parent_id is None:
|
||||
if tag.id not in root_ids:
|
||||
root_ids.append(tag.id)
|
||||
elif not tag_processed_before:
|
||||
# Group all the lineage of this tag.
|
||||
#
|
||||
# Skip this if the tag has been processed before,
|
||||
# we don't need to process lineage again to avoid duplicates.
|
||||
handle_tag(tags, root_ids, tag.parent, tag.id)
|
||||
|
||||
# Build a tag tree for each taxonomy
|
||||
for content_tag_list in taxonomy_dict.values():
|
||||
tags = {}
|
||||
root_ids = []
|
||||
|
||||
for content_tag in content_tag_list:
|
||||
# When a tag is deleted from the taxonomy, the `tag` here is None.
|
||||
# In that case the tag is not shown in the UI.
|
||||
if content_tag.tag:
|
||||
handle_tag(tags, root_ids, content_tag.tag)
|
||||
|
||||
taxonomy = content_tag_list[0].taxonomy
|
||||
|
||||
if tags:
|
||||
count = len(tags)
|
||||
# Add the tree to the taxonomy list
|
||||
taxonomy_list.append({
|
||||
'id': taxonomy.id,
|
||||
'value': taxonomy.name,
|
||||
'tags': [tags[tag_id] for tag_id in root_ids],
|
||||
'count': count,
|
||||
})
|
||||
total_count += count
|
||||
|
||||
unit_tags = {
|
||||
'count': total_count,
|
||||
'taxonomies': taxonomy_list,
|
||||
}
|
||||
|
||||
return unit_tags
|
||||
|
||||
@@ -99,7 +99,6 @@ from ..utils import (
|
||||
has_children_visible_to_specific_partition_groups,
|
||||
is_currently_visible_to_students,
|
||||
is_self_paced,
|
||||
get_taxonomy_tags_widget_url,
|
||||
)
|
||||
|
||||
from .create_xblock import create_xblock
|
||||
@@ -1094,7 +1093,6 @@ def create_xblock_info( # lint-amnesty, pylint: disable=too-many-statements
|
||||
course=None,
|
||||
is_concise=False,
|
||||
summary_configuration=None,
|
||||
tags=None,
|
||||
):
|
||||
"""
|
||||
Creates the information needed for client-side XBlockInfo.
|
||||
@@ -1387,10 +1385,6 @@ def create_xblock_info( # lint-amnesty, pylint: disable=too-many-statements
|
||||
)
|
||||
else:
|
||||
xblock_info["ancestor_has_staff_lock"] = False
|
||||
if tags is not None:
|
||||
xblock_info["tags"] = tags
|
||||
if use_tagging_taxonomy_list_page():
|
||||
xblock_info["taxonomy_tags_widget_url"] = get_taxonomy_tags_widget_url()
|
||||
|
||||
if course_outline:
|
||||
if xblock_info["has_explicit_staff_lock"]:
|
||||
|
||||
@@ -173,10 +173,6 @@ define(
|
||||
* True if summary configuration is enabled.
|
||||
*/
|
||||
summary_configuration_enabled: null,
|
||||
/**
|
||||
* List of tags of the unit. This list is managed by the content_tagging module.
|
||||
*/
|
||||
tags: null,
|
||||
},
|
||||
|
||||
initialize: function() {
|
||||
|
||||
@@ -11,12 +11,10 @@
|
||||
define(['jquery', 'underscore', 'js/views/xblock_outline', 'edx-ui-toolkit/js/utils/string-utils',
|
||||
'common/js/components/utils/view_utils', 'js/views/utils/xblock_utils',
|
||||
'js/models/xblock_outline_info', 'js/views/modals/course_outline_modals', 'js/utils/drag_and_drop',
|
||||
'common/js/components/views/feedback_notification', 'common/js/components/views/feedback_prompt',
|
||||
'js/views/utils/tagging_drawer_utils',],
|
||||
'common/js/components/views/feedback_notification', 'common/js/components/views/feedback_prompt',],
|
||||
function(
|
||||
$, _, XBlockOutlineView, StringUtils, ViewUtils, XBlockViewUtils,
|
||||
XBlockOutlineInfo, CourseOutlineModalsFactory, ContentDragger, NotificationView, PromptView,
|
||||
TaggingDrawerUtils
|
||||
XBlockOutlineInfo, CourseOutlineModalsFactory, ContentDragger, NotificationView, PromptView
|
||||
) {
|
||||
var CourseOutlineView = XBlockOutlineView.extend({
|
||||
// takes XBlockOutlineInfo as a model
|
||||
@@ -460,12 +458,41 @@ function(
|
||||
event.stopPropagation();
|
||||
},
|
||||
|
||||
openManageTagsDrawer() {
|
||||
closeManageTagsDrawer(drawer, drawerCover) {
|
||||
$(drawerCover).css('display', 'none');
|
||||
$(drawer).empty();
|
||||
$(drawer).css('display', 'none');
|
||||
$('body').removeClass('drawer-open');
|
||||
},
|
||||
|
||||
openManageTagsDrawer(event) {
|
||||
const drawer = document.querySelector("#manage-tags-drawer");
|
||||
const drawerCover = document.querySelector(".drawer-cover")
|
||||
const article = document.querySelector('[data-taxonomy-tags-widget-url]');
|
||||
const taxonomyTagsWidgetUrl = $(article).attr('data-taxonomy-tags-widget-url');
|
||||
const contentId = this.model.get('id');
|
||||
|
||||
TaggingDrawerUtils.openDrawer(taxonomyTagsWidgetUrl, contentId);
|
||||
// Add handler to close drawer when dark background is clicked
|
||||
$(drawerCover).click(function() {
|
||||
this.closeManageTagsDrawer(drawer, drawerCover);
|
||||
}.bind(this));
|
||||
|
||||
// Add event listen to close drawer when close button is clicked from within the Iframe
|
||||
window.addEventListener("message", function (event) {
|
||||
if (event.data === 'closeManageTagsDrawer') {
|
||||
this.closeManageTagsDrawer(drawer, drawerCover)
|
||||
}
|
||||
}.bind(this));
|
||||
|
||||
$(drawerCover).css('display', 'block');
|
||||
// xss-lint: disable=javascript-jquery-html
|
||||
$(drawer).html(
|
||||
`<iframe src="${taxonomyTagsWidgetUrl}${contentId}" onload="this.contentWindow.focus()" frameborder="0" style="width: 100%; height: 100%;"></iframe>`
|
||||
);
|
||||
$(drawer).css('display', 'block');
|
||||
|
||||
// Prevent background from being scrollable when drawer is open
|
||||
$('body').addClass('drawer-open');
|
||||
},
|
||||
|
||||
addButtonActions: function(element) {
|
||||
|
||||
@@ -8,11 +8,10 @@ define(['jquery', 'underscore', 'backbone', 'gettext', 'js/views/pages/base_page
|
||||
'js/models/xblock_info', 'js/views/xblock_string_field_editor', 'js/views/xblock_access_editor',
|
||||
'js/views/pages/container_subviews', 'js/views/unit_outline', 'js/views/utils/xblock_utils',
|
||||
'common/js/components/views/feedback_notification', 'common/js/components/views/feedback_prompt',
|
||||
'js/views/utils/tagging_drawer_utils',
|
||||
],
|
||||
function($, _, Backbone, gettext, BasePage, ViewUtils, ContainerView, XBlockView, AddXBlockComponent,
|
||||
EditXBlockModal, MoveXBlockModal, XBlockInfo, XBlockStringFieldEditor, XBlockAccessEditor,
|
||||
ContainerSubviews, UnitOutlineView, XBlockUtils, NotificationView, PromptView, TaggingDrawerUtils) {
|
||||
ContainerSubviews, UnitOutlineView, XBlockUtils, NotificationView, PromptView) {
|
||||
'use strict';
|
||||
|
||||
var XBlockContainerPage = BasePage.extend({
|
||||
@@ -28,7 +27,6 @@ function($, _, Backbone, gettext, BasePage, ViewUtils, ContainerView, XBlockView
|
||||
'click .show-actions-menu-button': 'showXBlockActionsMenu',
|
||||
'click .new-component-button': 'scrollToNewComponentButtons',
|
||||
'click .paste-component-button': 'pasteComponent',
|
||||
'click .tags-button': 'openManageTags',
|
||||
},
|
||||
|
||||
options: {
|
||||
@@ -99,12 +97,6 @@ function($, _, Backbone, gettext, BasePage, ViewUtils, ContainerView, XBlockView
|
||||
});
|
||||
this.viewLiveActions.render();
|
||||
|
||||
this.tagListView = new ContainerSubviews.TagList({
|
||||
el: this.$('.unit-tags'),
|
||||
model: this.model
|
||||
});
|
||||
this.tagListView.render();
|
||||
|
||||
this.unitOutlineView = new UnitOutlineView({
|
||||
el: this.$('.wrapper-unit-overview'),
|
||||
model: this.model
|
||||
@@ -133,7 +125,6 @@ function($, _, Backbone, gettext, BasePage, ViewUtils, ContainerView, XBlockView
|
||||
xblockView = this.xblockView,
|
||||
loadingElement = this.$('.ui-loading'),
|
||||
unitLocationTree = this.$('.unit-location'),
|
||||
unitTags = this.$('.unit-tags'),
|
||||
hiddenCss = 'is-hidden';
|
||||
|
||||
loadingElement.removeClass(hiddenCss);
|
||||
@@ -159,7 +150,6 @@ function($, _, Backbone, gettext, BasePage, ViewUtils, ContainerView, XBlockView
|
||||
// Refresh the views now that the xblock is visible
|
||||
self.onXBlockRefresh(xblockView);
|
||||
unitLocationTree.removeClass(hiddenCss);
|
||||
unitTags.removeClass(hiddenCss);
|
||||
|
||||
// Re-enable Backbone events for any updated DOM elements
|
||||
self.delegateEvents();
|
||||
@@ -419,13 +409,6 @@ function($, _, Backbone, gettext, BasePage, ViewUtils, ContainerView, XBlockView
|
||||
this.duplicateComponent(this.findXBlockElement(event.target));
|
||||
},
|
||||
|
||||
openManageTags: function(event) {
|
||||
const taxonomyTagsWidgetUrl = this.model.get('taxonomy_tags_widget_url');
|
||||
const contentId = this.findXBlockElement(event.target).data('locator');
|
||||
|
||||
TaggingDrawerUtils.openDrawer(taxonomyTagsWidgetUrl, contentId);
|
||||
},
|
||||
|
||||
showMoveXBlockModal: function(event) {
|
||||
var xblockElement = this.findXBlockElement(event.target),
|
||||
parentXBlockElement = xblockElement.parents('.studio-xblock-wrapper'),
|
||||
|
||||
@@ -2,9 +2,8 @@
|
||||
* Subviews (usually small side panels) for XBlockContainerPage.
|
||||
*/
|
||||
define(['jquery', 'underscore', 'gettext', 'js/views/baseview', 'common/js/components/utils/view_utils',
|
||||
'js/views/utils/xblock_utils', 'js/views/utils/move_xblock_utils', 'edx-ui-toolkit/js/utils/html-utils',
|
||||
'js/views/utils/tagging_drawer_utils'],
|
||||
function($, _, gettext, BaseView, ViewUtils, XBlockViewUtils, MoveXBlockUtils, HtmlUtils, TaggingDrawerUtils) {
|
||||
'js/views/utils/xblock_utils', 'js/views/utils/move_xblock_utils', 'edx-ui-toolkit/js/utils/html-utils'],
|
||||
function($, _, gettext, BaseView, ViewUtils, XBlockViewUtils, MoveXBlockUtils, HtmlUtils) {
|
||||
'use strict';
|
||||
|
||||
var disabledCss = 'is-disabled';
|
||||
@@ -296,175 +295,11 @@ function($, _, gettext, BaseView, ViewUtils, XBlockViewUtils, MoveXBlockUtils, H
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* TagList displays the tags of a unit.
|
||||
*/
|
||||
var TagList = BaseView.extend({
|
||||
// takes XBlockInfo as a model
|
||||
|
||||
events: {
|
||||
'click .wrapper-tag-header': 'expandTagContainer',
|
||||
'click .tagging-label': 'expandContentTag',
|
||||
'click .manage-tag-button': 'openManageTagDrawer',
|
||||
'keydown .wrapper-tag-header': 'handleKeyDownOnHeader',
|
||||
'keydown .tagging-label': 'handleKeyDownOnContentTag',
|
||||
'keydown .manage-tag-button': 'handleKeyDownOnTagDrawer',
|
||||
},
|
||||
|
||||
initialize: function() {
|
||||
BaseView.prototype.initialize.call(this);
|
||||
this.template = this.loadTemplate('tag-list');
|
||||
this.model.on('sync', this.onSync, this);
|
||||
},
|
||||
|
||||
onSync: function(model) {
|
||||
if (ViewUtils.hasChangedAttributes(model, ['tags'])) {
|
||||
this.render();
|
||||
}
|
||||
},
|
||||
|
||||
handleKeyDownOnHeader: function(event) {
|
||||
if (event.key === 'Enter' || event.key === ' ') {
|
||||
event.preventDefault();
|
||||
this.expandTagContainer();
|
||||
}
|
||||
},
|
||||
|
||||
handleKeyDownOnContentTag: function(event) {
|
||||
if (event.key === 'Enter' || event.key === ' ') {
|
||||
event.preventDefault();
|
||||
this.expandContentTag(event);
|
||||
}
|
||||
},
|
||||
|
||||
handleKeyDownOnTagDrawer: function(event) {
|
||||
if (event.key === 'Enter' || event.key === ' ') {
|
||||
event.preventDefault();
|
||||
this.openManageTagDrawer();
|
||||
}
|
||||
},
|
||||
|
||||
expandTagContainer: function() {
|
||||
var $content = this.$('.wrapper-tags .wrapper-tag-content'),
|
||||
$header = this.$('.wrapper-tags .wrapper-tag-header'),
|
||||
$icon = this.$('.wrapper-tags .wrapper-tag-header .icon');
|
||||
|
||||
if ($content.hasClass('is-hidden')) {
|
||||
$content.removeClass('is-hidden');
|
||||
$icon.addClass('fa-caret-up');
|
||||
$icon.removeClass('fa-caret-down');
|
||||
$header.attr('aria-expanded', 'true');
|
||||
} else {
|
||||
$content.addClass('is-hidden');
|
||||
$icon.removeClass('fa-caret-up');
|
||||
$icon.addClass('fa-caret-down');
|
||||
$header.attr('aria-expanded', 'false');
|
||||
}
|
||||
},
|
||||
|
||||
expandContentTag: function(event) {
|
||||
var contentId = event.target.id,
|
||||
$content = this.$(`.wrapper-tags .content-tags-${contentId}`),
|
||||
$header = this.$(`.wrapper-tags .tagging-label-${contentId}`),
|
||||
$icon = this.$(`.wrapper-tags .tagging-label-${contentId} .icon`);
|
||||
|
||||
if ($content.hasClass('is-hidden')) {
|
||||
$content.removeClass('is-hidden');
|
||||
$icon.addClass('fa-caret-up');
|
||||
$icon.removeClass('fa-caret-down');
|
||||
$header.attr('aria-expanded', 'true');
|
||||
} else {
|
||||
$content.addClass('is-hidden');
|
||||
$icon.removeClass('fa-caret-up');
|
||||
$icon.addClass('fa-caret-down');
|
||||
$header.attr('aria-expanded', 'false');
|
||||
}
|
||||
},
|
||||
|
||||
renderTagElements: function(tags, depth, parentId) {
|
||||
const tagListElement = this;
|
||||
tags.forEach(function(tag) {
|
||||
const parentElement = document.querySelector(`.content-tags-${parentId}`);
|
||||
var tagContentElement = document.createElement('div'),
|
||||
tagValueElement = document.createElement('span');
|
||||
|
||||
// Element that contains the tag value and the arrow icon
|
||||
tagContentElement.style.marginLeft = `${depth}em`;
|
||||
tagContentElement.className = `tagging-label tagging-label-tag-${tag.id}`;
|
||||
tagContentElement.id = `tag-${tag.id}`;
|
||||
|
||||
// Element that contains the tag value
|
||||
tagValueElement.textContent = tag.value;
|
||||
tagValueElement.id = `tag-${tag.id}`;
|
||||
tagValueElement.className = 'tagging-label-value';
|
||||
|
||||
tagContentElement.appendChild(tagValueElement);
|
||||
parentElement.appendChild(tagContentElement);
|
||||
|
||||
if (tag.children.length > 0) {
|
||||
var tagIconElement = document.createElement('span'),
|
||||
tagChildrenElement = document.createElement('div');
|
||||
|
||||
// Arrow icon
|
||||
tagIconElement.className = 'icon fa fa-caret-down';
|
||||
tagIconElement.ariaHidden = 'true';
|
||||
tagIconElement.id = `tag-${tag.id}`;
|
||||
|
||||
// Element that contains the children of this tag
|
||||
tagChildrenElement.className = `content-tags-tag-${tag.id} is-hidden`;
|
||||
|
||||
tagContentElement.tabIndex = 0;
|
||||
tagContentElement.role = "button";
|
||||
tagContentElement.ariaExpanded = "false";
|
||||
tagContentElement.setAttribute('aria-controls', `content-tags-tag-${tag.id}`);
|
||||
tagContentElement.appendChild(tagIconElement);
|
||||
parentElement.appendChild(tagChildrenElement);
|
||||
|
||||
// Render children
|
||||
tagListElement.renderTagElements(tag.children, depth + 1, `tag-${tag.id}`);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
renderTags: function() {
|
||||
if (this.model.get('tags') !== null) {
|
||||
const taxonomies = this.model.get('tags').taxonomies;
|
||||
const tagListElement = this;
|
||||
taxonomies.forEach(function(taxonomy) {
|
||||
tagListElement.renderTagElements(taxonomy.tags, 1, `tax-${taxonomy.id}`);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
openManageTagDrawer: function() {
|
||||
const taxonomyTagsWidgetUrl = this.model.get('taxonomy_tags_widget_url');
|
||||
const contentId = this.model.get('id');
|
||||
|
||||
TaggingDrawerUtils.openDrawer(taxonomyTagsWidgetUrl, contentId);
|
||||
},
|
||||
|
||||
render: function() {
|
||||
HtmlUtils.setHtml(
|
||||
this.$el,
|
||||
HtmlUtils.HTML(
|
||||
this.template({
|
||||
tags: this.model.get('tags'),
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
this.renderTags();
|
||||
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
MessageView: MessageView,
|
||||
ViewLiveButtonController: ViewLiveButtonController,
|
||||
Publisher: Publisher,
|
||||
PublishHistory: PublishHistory,
|
||||
ContainerAccess: ContainerAccess,
|
||||
TagList: TagList
|
||||
ContainerAccess: ContainerAccess
|
||||
};
|
||||
}); // end define();
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
/**
|
||||
* Provides utilities to open and close the tagging drawer to manage tags.
|
||||
*
|
||||
* To use this drawer you need to add the following code into your template:
|
||||
*
|
||||
* ```
|
||||
* <div id="manage-tags-drawer" class="drawer"></div>
|
||||
* <div class="drawer-cover"></div>
|
||||
* ```
|
||||
*/
|
||||
define(['jquery'],
|
||||
function($,) {
|
||||
'use strict';
|
||||
|
||||
var closeDrawer, openDrawer;
|
||||
|
||||
closeDrawer = function(drawer, drawerCover) {
|
||||
$(drawerCover).css('display', 'none');
|
||||
$(drawer).empty();
|
||||
$(drawer).css('display', 'none');
|
||||
$('body').removeClass('drawer-open');
|
||||
};
|
||||
|
||||
openDrawer = function(taxonomyTagsWidgetUrl, contentId) {
|
||||
const drawer = document.querySelector("#manage-tags-drawer");
|
||||
const drawerCover = document.querySelector(".drawer-cover");
|
||||
|
||||
// Add handler to close drawer when dark background is clicked
|
||||
$(drawerCover).click(function() {
|
||||
closeDrawer(drawer, drawerCover);
|
||||
}.bind(this));
|
||||
|
||||
// Add event listen to close drawer when close button is clicked from within the Iframe
|
||||
window.addEventListener("message", function (event) {
|
||||
if (event.data === 'closeManageTagsDrawer') {
|
||||
closeDrawer(drawer, drawerCover)
|
||||
}
|
||||
}.bind(this));
|
||||
|
||||
$(drawerCover).css('display', 'block');
|
||||
// xss-lint: disable=javascript-jquery-html
|
||||
$(drawer).html(
|
||||
`<iframe src="${taxonomyTagsWidgetUrl}${contentId}" onload="this.contentWindow.focus()" frameborder="0" style="width: 100%; height: 100%;"></iframe>`
|
||||
);
|
||||
$(drawer).css('display', 'block');
|
||||
|
||||
// Prevent background from being scrollable when drawer is open
|
||||
$('body').addClass('drawer-open');
|
||||
};
|
||||
|
||||
return {
|
||||
openDrawer: openDrawer,
|
||||
closeDrawer: closeDrawer
|
||||
};
|
||||
});
|
||||
@@ -119,34 +119,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
// inverse primary button
|
||||
%btn-primary-inverse {
|
||||
@extend %ui-btn-primary;
|
||||
|
||||
background: theme-color("inverse");
|
||||
border-color: theme-color("primary");
|
||||
color: theme-color("primary");
|
||||
|
||||
&:hover,
|
||||
&:active {
|
||||
background: theme-color("primary");
|
||||
border-color: $uxpl-blue-hover-active;
|
||||
color: theme-color("inverse");
|
||||
}
|
||||
|
||||
&.current,
|
||||
&.active {
|
||||
background: theme-color("primary");
|
||||
border-color: $uxpl-blue-hover-active;
|
||||
color: theme-color("inverse");
|
||||
|
||||
&:hover,
|
||||
&:active {
|
||||
background: theme-color("primary");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// +Secondary Button - Extends
|
||||
// ====================
|
||||
// gray secondary button
|
||||
|
||||
@@ -242,77 +242,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
.unit-tags {
|
||||
.wrapper-tags {
|
||||
margin-bottom: $baseline;
|
||||
padding: ($baseline*0.75);
|
||||
background-color: $white;
|
||||
|
||||
.wrapper-tag-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
|
||||
.tag-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.count-badge {
|
||||
background-color: $gray-l5;
|
||||
border-radius: 50%;
|
||||
display: inline-block;
|
||||
padding: 0px 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.wrapper-tag-header:focus {
|
||||
border: 1px dotted gray;
|
||||
}
|
||||
|
||||
.action-primary {
|
||||
@extend %btn-primary-inverse;
|
||||
|
||||
width: 100%;
|
||||
margin: 16px 2px 8px 2px;
|
||||
}
|
||||
|
||||
.wrapper-tag-content {
|
||||
background-color: $white;
|
||||
|
||||
.content-taxonomies {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-top: 10px;
|
||||
|
||||
.tagging-label {
|
||||
display: flex;
|
||||
padding: 4px 0px;
|
||||
|
||||
.tagging-label-value {
|
||||
display: inline-block;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.tagging-label-count {
|
||||
display: inline-block;
|
||||
margin: 0 0.5em;
|
||||
}
|
||||
}
|
||||
|
||||
.tagging-label:hover,
|
||||
.tagging-label:focus {
|
||||
color: $blue;
|
||||
}
|
||||
|
||||
.icon {
|
||||
margin-left: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// versioning widget
|
||||
.unit-publish-history {
|
||||
.wrapper-last-publish {
|
||||
|
||||
@@ -213,10 +213,7 @@ from openedx.core.djangolib.markup import HTML, Text
|
||||
)}</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
% if show_unit_tags:
|
||||
<div class="unit-tags is-hidden"></div>
|
||||
% endif
|
||||
</div>
|
||||
% endif
|
||||
</aside>
|
||||
</section>
|
||||
@@ -241,7 +238,4 @@ from openedx.core.djangolib.markup import HTML, Text
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="manage-tags-drawer" class="drawer"></div>
|
||||
<div class="drawer-cover"></div>
|
||||
</%block>
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
<% if (tags !== null) { %>
|
||||
<div class="wrapper wrapper-tags">
|
||||
<div class="wrapper-tag-header" tabindex=0 role="button" aria-controls="tag-list-content" aria-expanded=false>
|
||||
<span>
|
||||
<span class="tag-title label">
|
||||
<%- gettext("Tags") %>
|
||||
</span>
|
||||
<span class="count-badge">
|
||||
<%- tags.count %>
|
||||
</span>
|
||||
</span>
|
||||
<span class="icon fa fa-caret-down" aria-hidden="true"></span>
|
||||
</div>
|
||||
<div class="wrapper wrapper-tag-content is-hidden" id="tag-list-content">
|
||||
<div class="content-taxonomies">
|
||||
<% for (var i = 0; i < tags.taxonomies.length; i++) {
|
||||
var taxonomy = tags.taxonomies[i];
|
||||
%>
|
||||
<div class="tagging-label tagging-label-tax-<%- taxonomy.id %>" id="tax-<%- taxonomy.id %>" tabindex=0 role="button" aria-controls="content-tags-tax-<%- taxonomy.id %>" aria-expanded=false>
|
||||
<span class="tagging-label-value" id="tax-<%- taxonomy.id %>"><%- taxonomy.value %></span>
|
||||
<span class="tagging-label-count" id="tax-<%- taxonomy.id %>">(<%- taxonomy.count %>)</span>
|
||||
<span class="icon fa fa-caret-down" aria-hidden="true" id="tax-<%- taxonomy.id %>"></span>
|
||||
</div>
|
||||
<div class="content-tags-tax-<%- taxonomy.id %> is-hidden" id="content-tags-tax-<%- taxonomy.id %>"></div>
|
||||
<% } %>
|
||||
</div>
|
||||
<a class="action-primary manage-tag-button" tabindex=0 role="button">
|
||||
<%- gettext("Manage tags") %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
@@ -7,14 +7,13 @@ from lms.lib.utils import is_unit
|
||||
from openedx.core.djangolib.js_utils import (
|
||||
dump_js_escaped_json, js_escaped_string
|
||||
)
|
||||
from cms.djangoapps.contentstore.toggles import use_new_text_editor, use_new_problem_editor, use_new_video_editor, use_video_gallery_flow, use_tagging_taxonomy_list_page
|
||||
from cms.djangoapps.contentstore.toggles import use_new_text_editor, use_new_problem_editor, use_new_video_editor, use_video_gallery_flow
|
||||
%>
|
||||
<%
|
||||
use_new_editor_text = use_new_text_editor()
|
||||
use_new_editor_video = use_new_video_editor()
|
||||
use_new_editor_problem = use_new_problem_editor()
|
||||
use_new_video_gallery_flow = use_video_gallery_flow()
|
||||
use_tagging = use_tagging_taxonomy_list_page()
|
||||
xblock_url = xblock_studio_url(xblock)
|
||||
show_inline = xblock.has_children and not xblock_url
|
||||
section_class = "level-nesting" if show_inline else "level-element"
|
||||
@@ -119,11 +118,6 @@ block_is_unit = is_unit(xblock)
|
||||
<a class="duplicate-button" href="#" role="button">${_("Duplicate")}</a>
|
||||
</li>
|
||||
% endif
|
||||
% if use_tagging:
|
||||
<li class="nav-item">
|
||||
<a class="tags-button" href="#" role="button">${_("Manage tags")}</a>
|
||||
</li>
|
||||
% endif
|
||||
% if can_move:
|
||||
<li class="nav-item">
|
||||
<a class="move-button" href="#" role="button">${_("Move")}</a>
|
||||
|
||||
Reference in New Issue
Block a user