upgrade
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"machineName": "H5PEditor.VerticalTabs",
|
||||
"title": "H5P Editor Vertical Tabs",
|
||||
"license": "MIT",
|
||||
"author": "Joubel",
|
||||
"majorVersion": 1,
|
||||
"minorVersion": 3,
|
||||
"patchVersion": 7,
|
||||
"runnable": 0,
|
||||
"coreApi": {
|
||||
"majorVersion": 1,
|
||||
"minorVersion": 24
|
||||
},
|
||||
"preloadedJs": [
|
||||
{
|
||||
"path": "vertical-tabs.js"
|
||||
}
|
||||
],
|
||||
"preloadedCss": [
|
||||
{
|
||||
"path": "styles/css/vertical-tabs.css"
|
||||
}
|
||||
],
|
||||
"preloadedDependencies": [
|
||||
{
|
||||
"machineName": "FontAwesome",
|
||||
"majorVersion": 4,
|
||||
"minorVersion": 5
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,264 @@
|
||||
/* line 3, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtab-wrapper:after {
|
||||
visibility: hidden;
|
||||
display: block;
|
||||
font-size: 0;
|
||||
content: ' ';
|
||||
clear: both;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/* line 12, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs {
|
||||
float: left;
|
||||
width: 212px;
|
||||
position: relative;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* line 18, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtab-forms {
|
||||
border: 1px solid #d0d0d1;
|
||||
margin-left: 217px;
|
||||
}
|
||||
|
||||
/* line 22, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtab-form {
|
||||
position: relative;
|
||||
display: none;
|
||||
margin: 0;
|
||||
border: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* line 29, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtab-form.h5p-current {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* line 32, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtab-form > .field {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* line 35, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs .h5p-vtab-li,
|
||||
.h5p-vtabs .h5p-placeholder {
|
||||
position: relative;
|
||||
padding: 0;
|
||||
margin: 0 0 3px 0;
|
||||
}
|
||||
|
||||
/* line 42, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtab-a {
|
||||
border: 1px solid #d0d0d1;
|
||||
background-color: #f5f5f5;
|
||||
height: 38px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
line-height: 38px;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
padding: 0 30px;
|
||||
margin: 0 12px 0 0;
|
||||
cursor: pointer;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
/* line 61, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs .h5p-vtab-li.h5p-current .h5p-vtab-a {
|
||||
background: #747275;
|
||||
border: 1px solid #636164;
|
||||
border-right: 0;
|
||||
color: white;
|
||||
}
|
||||
/* line 68, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs .h5p-vtab-li.h5p-current:after, .h5p-vtabs .h5p-vtab-li.h5p-current:before {
|
||||
position: absolute;
|
||||
left: 200px;
|
||||
content: " ";
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
/* line 77, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs .h5p-vtab-li.h5p-current:before {
|
||||
top: 0;
|
||||
border-top: 20px solid transparent;
|
||||
border-bottom: 20px solid transparent;
|
||||
border-left: 13px solid #636164;
|
||||
}
|
||||
/* line 84, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs .h5p-vtab-li.h5p-current:after {
|
||||
top: 1px;
|
||||
border-top: 19px solid transparent;
|
||||
border-bottom: 19px solid transparent;
|
||||
border-left: 12px solid #747275;
|
||||
}
|
||||
/* line 92, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-up,
|
||||
.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-down {
|
||||
background: #636164;
|
||||
}
|
||||
/* line 96, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-up[aria-disabled="false"]:hover,
|
||||
.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-down[aria-disabled="false"]:hover {
|
||||
background: #49484a;
|
||||
}
|
||||
/* line 100, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-up:after,
|
||||
.h5p-vtabs .h5p-vtab-li.h5p-current > .vtab-order-wrapper > .order-down:after {
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* line 107, ../scss/vertical-tabs.scss */
|
||||
.h5p-placeholder > .h5p-vtab-a {
|
||||
background: #e8f2fa;
|
||||
border: dashed 2px #2782d1;
|
||||
height: 36px;
|
||||
}
|
||||
|
||||
/* line 113, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs > button {
|
||||
float: right;
|
||||
margin: 8px 14px 8px 8px;
|
||||
}
|
||||
|
||||
/* line 118, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs .h5p-moving {
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
}
|
||||
/* line 122, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtabs .h5p-moving > .h5p-vtab-a {
|
||||
cursor: grabbing;
|
||||
cursor: -moz-grabbing;
|
||||
cursor: -webkit-grabbing;
|
||||
}
|
||||
|
||||
/* line 129, ../scss/vertical-tabs.scss */
|
||||
.vtab-order-wrapper {
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
left: 1px;
|
||||
}
|
||||
/* line 134, ../scss/vertical-tabs.scss */
|
||||
.vtab-order-wrapper > .order-up,
|
||||
.vtab-order-wrapper > .order-down {
|
||||
width: 19px;
|
||||
height: 19px;
|
||||
background: #d0d0d1;
|
||||
font-size: 14px;
|
||||
line-height: 19px;
|
||||
cursor: pointer;
|
||||
text-align: center;
|
||||
}
|
||||
/* line 144, ../scss/vertical-tabs.scss */
|
||||
.vtab-order-wrapper > .order-up[aria-disabled="false"]:hover,
|
||||
.vtab-order-wrapper > .order-down[aria-disabled="false"]:hover {
|
||||
background-color: #b6b6b8;
|
||||
}
|
||||
/* line 148, ../scss/vertical-tabs.scss */
|
||||
.vtab-order-wrapper > .order-up:before,
|
||||
.vtab-order-wrapper > .order-down:before {
|
||||
right: auto;
|
||||
left: -5px;
|
||||
}
|
||||
/* line 153, ../scss/vertical-tabs.scss */
|
||||
.vtab-order-wrapper > .order-up[aria-disabled="true"],
|
||||
.vtab-order-wrapper > .order-down[aria-disabled="true"] {
|
||||
cursor: default;
|
||||
}
|
||||
/* line 156, ../scss/vertical-tabs.scss */
|
||||
.vtab-order-wrapper > .order-up[aria-disabled="true"]:after,
|
||||
.vtab-order-wrapper > .order-down[aria-disabled="true"]:after {
|
||||
opacity: 0;
|
||||
}
|
||||
/* line 162, ../scss/vertical-tabs.scss */
|
||||
.vtab-order-wrapper > .order-up:after {
|
||||
font-family: "H5P";
|
||||
content: "\e58e";
|
||||
}
|
||||
/* line 167, ../scss/vertical-tabs.scss */
|
||||
.vtab-order-wrapper > .order-down {
|
||||
top: auto;
|
||||
bottom: 1px;
|
||||
}
|
||||
/* line 171, ../scss/vertical-tabs.scss */
|
||||
.vtab-order-wrapper > .order-down:after {
|
||||
font-family: "H5P";
|
||||
content: "\e58f";
|
||||
}
|
||||
|
||||
/* line 178, ../scss/vertical-tabs.scss */
|
||||
.vtab-remove-wrapper {
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
right: 12px;
|
||||
}
|
||||
/* line 183, ../scss/vertical-tabs.scss */
|
||||
.vtab-remove-wrapper > .remove {
|
||||
cursor: pointer;
|
||||
width: 1.25em;
|
||||
height: 38px;
|
||||
font-size: 1.75em;
|
||||
text-align: center;
|
||||
}
|
||||
/* line 190, ../scss/vertical-tabs.scss */
|
||||
.vtab-remove-wrapper > .remove:after {
|
||||
font-family: "H5P";
|
||||
content: "\e890";
|
||||
color: #6f6f71;
|
||||
display: inline-block;
|
||||
line-height: 38px;
|
||||
}
|
||||
|
||||
/* line 200, ../scss/vertical-tabs.scss */
|
||||
.h5p-current > .vtab-remove-wrapper > .remove:after {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* line 204, ../scss/vertical-tabs.scss */
|
||||
.h5peditor-button.add-entity {
|
||||
width: 200px;
|
||||
height: 40px;
|
||||
background: #2579C6 linear-gradient(#3080c9 50%, transparent 50%, transparent);
|
||||
border: 1px solid #1f67a8;
|
||||
color: white;
|
||||
font-weight: 600;
|
||||
font-size: 14px;
|
||||
box-sizing: border-box;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
text-transform: uppercase;
|
||||
line-height: 38px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
padding: 0 5px;
|
||||
border-radius: 3px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
/* line 225, ../scss/vertical-tabs.scss */
|
||||
.h5peditor-button.add-entity:hover {
|
||||
background: #1f67a8 linear-gradient(#2a6fac 50%, transparent 50%, transparent);
|
||||
}
|
||||
/* line 229, ../scss/vertical-tabs.scss */
|
||||
.h5peditor-button.add-entity:before {
|
||||
font-family: "H5P";
|
||||
content: "\e902";
|
||||
margin-right: 6px;
|
||||
font-weight: 400;
|
||||
font-size: 1.5em;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
/* line 240, ../scss/vertical-tabs.scss */
|
||||
.h5p-vtab-form > .library,
|
||||
.h5p-vtab-form > .list,
|
||||
.h5p-vtab-form > .group > .content {
|
||||
padding: 10px;
|
||||
border: none;
|
||||
}
|
||||
@@ -0,0 +1,481 @@
|
||||
/** @namespace H5PEditor */
|
||||
var H5PEditor = H5PEditor || {};
|
||||
|
||||
H5PEditor.VerticalTabs = (function ($) {
|
||||
|
||||
/**
|
||||
* Draws the list.
|
||||
*
|
||||
* @class
|
||||
* @param {List} list
|
||||
*/
|
||||
function VerticalTabs(list) {
|
||||
var self = this;
|
||||
var entity = list.getEntity();
|
||||
|
||||
// Make first letter upper case.
|
||||
entity = entity.substr(0,1).toUpperCase() + entity.substr(1);
|
||||
|
||||
// Create DOM elements
|
||||
var $wrapper = $('<div/>', {
|
||||
'class': 'h5p-vtab-wrapper'
|
||||
});
|
||||
var $inner = $('<div/>', {
|
||||
'class': 'h5p-vtabs'
|
||||
}).appendTo($wrapper);
|
||||
var $tabs = $('<ol/>', {
|
||||
id: list.getId(),
|
||||
'aria-describedby': list.getDescriptionId(),
|
||||
'role': 'tablist',
|
||||
'class': 'h5p-ul'
|
||||
}).appendTo($inner);
|
||||
H5PEditor.createButton('add-entity', H5PEditor.t('core', 'addEntity', {':entity': entity}), function () {
|
||||
if (list.addItem()) {
|
||||
$tabs.children(':last').trigger('open');
|
||||
toggleOrderButtonsState();
|
||||
}
|
||||
}, true).appendTo($inner);
|
||||
var $forms = $('<div/>', {
|
||||
'class': 'h5p-vtab-forms'
|
||||
}).appendTo($wrapper);
|
||||
|
||||
// Once all items have been added we toggle the state of the order buttons
|
||||
list.once('changeWidget', function () {
|
||||
toggleOrderButtonsState();
|
||||
});
|
||||
|
||||
// Used when dragging items around
|
||||
var adjustX, adjustY, marginTop, formOffset, $currentTab;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param {jQuery} $item
|
||||
* @param {jQuery} $placeholder
|
||||
* @param {Number} x
|
||||
* @param {Number} y
|
||||
*/
|
||||
var moveItem = function ($item, $placeholder, x, y) {
|
||||
var currentIndex;
|
||||
|
||||
// Adjust so the mouse is placed on top of the icon.
|
||||
x = x - adjustX;
|
||||
y = y - adjustY;
|
||||
|
||||
$item.css({
|
||||
top: y - marginTop - formOffset.top,
|
||||
left: x - formOffset.left
|
||||
});
|
||||
|
||||
// Try to move up.
|
||||
var $prev = $item.prev().prev();
|
||||
if ($prev.length && y < $prev.offset().top + ($prev.height() / 2)) {
|
||||
$prev.insertAfter($item);
|
||||
|
||||
|
||||
currentIndex = $item.index();
|
||||
list.moveItem(currentIndex, currentIndex - 1);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Try to move down.
|
||||
var $next = $item.next();
|
||||
if ($next.length && y + $item.height() > $next.offset().top + ($next.height() / 2)) {
|
||||
$next.insertBefore($placeholder);
|
||||
|
||||
currentIndex = $item.index() - 2;
|
||||
list.moveItem(currentIndex, currentIndex + 1);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Re-index labels. Necessary after tabs are sorted or removed.
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
var reindexLabels = function () {
|
||||
$tabs.find('.h5p-index-label').each(function (index, element) {
|
||||
$(element).text(index + 1);
|
||||
});
|
||||
toggleOrderButtonsState();
|
||||
};
|
||||
|
||||
/**
|
||||
* Always run after reordering, adding or removing to ensure correct
|
||||
* state of the order buttons.
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
var toggleOrderButtonsState = function () {
|
||||
$tabs.children().each(function (index, element) {
|
||||
var $tab = $(element);
|
||||
var isTopTab = !$tab.prev().length;
|
||||
$tab.find('.order-up').attr('aria-disabled', isTopTab).attr('tabindex', isTopTab ? '-1' : '0');
|
||||
var isBottomTab = !$tab.next().length;
|
||||
$tab.find('.order-down').attr('aria-disabled', isBottomTab).attr('tabindex', isBottomTab ? '-1' : '0');
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Opens the given tab.
|
||||
*
|
||||
* @private
|
||||
* @param {jQuery} $newTab
|
||||
*/
|
||||
var openTab = function ($newTab) {
|
||||
if ($currentTab !== undefined) {
|
||||
H5PEditor.Html.removeWysiwyg();
|
||||
$currentTab.removeClass('h5p-current');
|
||||
}
|
||||
$newTab.addClass('h5p-current');
|
||||
$currentTab = $newTab;
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds UI items to the widget.
|
||||
*
|
||||
* @public
|
||||
* @param {Object} item
|
||||
*/
|
||||
self.addItem = function (item) {
|
||||
|
||||
var $placeholder;
|
||||
var $tab = $('<li/>', {
|
||||
'class': 'h5p-vtab-li'
|
||||
}).appendTo($tabs);
|
||||
|
||||
/**
|
||||
* Mouse move callback
|
||||
*
|
||||
* @private
|
||||
* @param {Object} event
|
||||
*/
|
||||
var move = function (event) {
|
||||
moveItem($tab, $placeholder, event.pageX, event.pageY);
|
||||
};
|
||||
|
||||
/**
|
||||
* Mouse button release callback
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
var up = function () {
|
||||
H5P.$window
|
||||
.unbind('mousemove', move)
|
||||
.unbind('mouseup', up);
|
||||
|
||||
H5P.$body
|
||||
.attr('unselectable', 'off')
|
||||
.css({
|
||||
'-moz-user-select': '',
|
||||
'-webkit-user-select': '',
|
||||
'user-select': '',
|
||||
'-ms-user-select': '',
|
||||
'overflow': '',
|
||||
})[0].onselectstart = H5P.$body[0].ondragstart = null;
|
||||
|
||||
$tab.removeClass('h5p-moving').css({
|
||||
width: 'auto',
|
||||
height: 'auto',
|
||||
top: '',
|
||||
left: ''
|
||||
});
|
||||
$placeholder.remove();
|
||||
reindexLabels();
|
||||
};
|
||||
|
||||
/**
|
||||
* Mouse button down callback
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
var down = function (event) {
|
||||
if (event.which !== 1) {
|
||||
return; // Only allow left mouse button
|
||||
}
|
||||
|
||||
H5P.$window
|
||||
.mousemove(move)
|
||||
.mouseup(up);
|
||||
|
||||
// Start tracking mouse
|
||||
H5P.$body
|
||||
.attr('unselectable', 'on')
|
||||
.css({
|
||||
'-moz-user-select': 'none',
|
||||
'-webkit-user-select': 'none',
|
||||
'user-select': 'none',
|
||||
'-ms-user-select': 'none',
|
||||
'overflow': 'hidden'
|
||||
})[0].onselectstart = H5P.$body[0].ondragstart = function () {
|
||||
return false;
|
||||
};
|
||||
|
||||
var offset = $tab.offset();
|
||||
adjustX = event.pageX - offset.left;
|
||||
adjustY = event.pageY - offset.top;
|
||||
marginTop = parseInt($tab.css('marginTop'));
|
||||
formOffset = $tabs.offsetParent().offset();
|
||||
// TODO: Couldn't formOffset and margin be added?
|
||||
|
||||
var width = $tab.width();
|
||||
var height = $tab.height();
|
||||
|
||||
$tab.addClass('h5p-moving').css({
|
||||
width: width,
|
||||
height: height
|
||||
});
|
||||
$placeholder = $('<li/>', {
|
||||
'class': 'h5p-placeholder'
|
||||
}).insertBefore($tab);
|
||||
|
||||
$('<div/>', {
|
||||
class: 'h5p-vtab-a',
|
||||
}).appendTo($placeholder);
|
||||
|
||||
move(event);
|
||||
};
|
||||
|
||||
/**
|
||||
* Order current list item up
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
var moveItemUp = function () {
|
||||
var $prev = $tab.prev();
|
||||
if (!$prev.length) {
|
||||
return; // Cannot move item further up
|
||||
}
|
||||
|
||||
var currentIndex = $tab.index();
|
||||
$prev.insertAfter($tab);
|
||||
list.moveItem(currentIndex, currentIndex - 1);
|
||||
reindexLabels();
|
||||
};
|
||||
|
||||
/**
|
||||
* Order current ist item down
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
var moveItemDown = function () {
|
||||
var $next = $tab.next();
|
||||
if (!$next.length) {
|
||||
return; // Cannot move item further down
|
||||
}
|
||||
|
||||
var currentIndex = $tab.index();
|
||||
$next.insertBefore($tab);
|
||||
list.moveItem(currentIndex, currentIndex + 1);
|
||||
reindexLabels();
|
||||
};
|
||||
|
||||
// Handle opening of the tab
|
||||
$tab.on('open', function () {
|
||||
openTab($tab.add($form));
|
||||
});
|
||||
|
||||
var mouseDownPos;
|
||||
|
||||
// Add clickable label
|
||||
$('<div/>', {
|
||||
'class' : 'h5p-vtab-a',
|
||||
html: '<span class="h5p-index-label">' + ($tab.index() + 1) + '</span>. <span class="h5p-label" title="' + entity + '">' + entity + '</span>',
|
||||
role: 'tab',
|
||||
tabIndex: 0,
|
||||
on: {
|
||||
mouseup: function (e) {
|
||||
|
||||
if (!mouseDownPos) {
|
||||
return;
|
||||
}
|
||||
// Determine movement
|
||||
var xDiff = Math.abs(mouseDownPos.x - e.pageX);
|
||||
var yDiff = Math.abs(mouseDownPos.y - e.pageY);
|
||||
var moveThreshold = 20;
|
||||
|
||||
// Open tab if moved less than threshold
|
||||
if (xDiff < moveThreshold && yDiff < moveThreshold) {
|
||||
$tab.trigger('open');
|
||||
}
|
||||
},
|
||||
mousedown: function (e) {
|
||||
// Start position
|
||||
mouseDownPos = {
|
||||
x: e.pageX,
|
||||
y: e.pageY
|
||||
};
|
||||
|
||||
// Order element
|
||||
down(e);
|
||||
},
|
||||
keypress: function (e) {
|
||||
if (e.which === 32) {
|
||||
e.preventDefault();
|
||||
$tab.trigger('open');
|
||||
}
|
||||
}
|
||||
}
|
||||
}).appendTo($tab);
|
||||
|
||||
var $tabLabel = $tab.find('.h5p-label');
|
||||
|
||||
var setTabLabel = function (label) {
|
||||
$tabLabel.text(label).attr('title', label);
|
||||
};
|
||||
|
||||
// Add buttons for ordering
|
||||
var $orderWrapper = $('<div/>', {
|
||||
'class': 'vtab-order-wrapper',
|
||||
appendTo: $tab
|
||||
});
|
||||
H5PEditor.createButton('order-up', H5PEditor.t('core', 'orderItemUp'), moveItemUp).appendTo($orderWrapper);
|
||||
H5PEditor.createButton('order-down', H5PEditor.t('core', 'orderItemDown'), moveItemDown).appendTo($orderWrapper);
|
||||
|
||||
// Add remove button
|
||||
var $removeWrapper = $('<div/>', {
|
||||
'class': 'vtab-remove-wrapper',
|
||||
appendTo: $tab
|
||||
});
|
||||
H5PEditor.createButton('remove', H5PEditor.t('core', 'removeItem'), function () {
|
||||
confirmRemovalDialog.show($(this).offset().top);
|
||||
}).appendTo($removeWrapper);
|
||||
|
||||
// Create confirmation dialog for removing list item
|
||||
var confirmRemovalDialog = new H5P.ConfirmationDialog({
|
||||
dialogText: H5PEditor.t('core', 'confirmRemoval', {':type': entity.toLocaleLowerCase()})
|
||||
}).appendTo(document.body);
|
||||
|
||||
// Remove list item on confirmation
|
||||
confirmRemovalDialog.on('confirmed', function () {
|
||||
var $next, index = $tab.index();
|
||||
|
||||
if ($tab.hasClass('h5p-current')) {
|
||||
if (index) {
|
||||
// Go to previous tab
|
||||
$next = $tab.prev().add($form.prev());
|
||||
}
|
||||
else {
|
||||
// Go to next tab
|
||||
$next = $tab.next().add($form.next());
|
||||
}
|
||||
|
||||
if ($next.length) {
|
||||
// Open another tab
|
||||
$next.trigger('open');
|
||||
}
|
||||
}
|
||||
|
||||
list.removeItem(index);
|
||||
$tab.remove();
|
||||
$form.remove();
|
||||
reindexLabels();
|
||||
});
|
||||
|
||||
// Create form wrapper
|
||||
var $form = $('<fieldset/>', {
|
||||
'role': 'tabpanel',
|
||||
'class': 'h5p-vtab-form'
|
||||
});
|
||||
|
||||
if (item instanceof H5PEditor.Group) {
|
||||
item.on('summary', function (event) {
|
||||
if (event.data) {
|
||||
// Update tab with summary
|
||||
setTabLabel(event.data.substr(0, 32));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Append new field item to forms wrapper
|
||||
item.appendTo($form);
|
||||
|
||||
// Append form wrapper to forms list
|
||||
$form.appendTo($forms);
|
||||
|
||||
// Good UX: automatically expand groups
|
||||
if (item instanceof H5PEditor.Group) {
|
||||
item.expand();
|
||||
|
||||
// Remove group title
|
||||
item.$group.children('.title').remove();
|
||||
}
|
||||
else if (item instanceof H5PEditor.Library) {
|
||||
$form.addClass('content');
|
||||
|
||||
let summary = item.$select.children(':selected').text();
|
||||
if (item.params.metadata && item.params.metadata.title) {
|
||||
// The given title usually makes more sense than the type name
|
||||
summary = item.params.metadata.title + (!item.libraries || (item.libraries.length > 1 && item.params.metadata.title.indexOf(summary) === -1) ? ' (' + summary + ')' : '');
|
||||
}
|
||||
setTabLabel(summary);
|
||||
|
||||
// Use selected library as title
|
||||
item.changes.push(function (library) {
|
||||
setTabLabel(library ? library.title : '');
|
||||
});
|
||||
|
||||
let lastLib;
|
||||
const setSummary = function () {
|
||||
if (item.params && item.params.metadata && item.params.metadata.title) {
|
||||
// The given title usually makes more sense than the type name
|
||||
setTabLabel(item.params.metadata.title + (item.libraries.length > 1 && item.params.metadata.title.indexOf(lastLib.title) === -1 ? ' (' + lastLib.title + ')' : ''));
|
||||
}
|
||||
else {
|
||||
setTabLabel(lastLib ? lastLib.title : '');
|
||||
}
|
||||
};
|
||||
if (item.metadataForm) {
|
||||
item.metadataForm.on('titlechange', setSummary);
|
||||
}
|
||||
item.change(function (library) {
|
||||
lastLib = library;
|
||||
setSummary();
|
||||
|
||||
if (item.metadataForm) {
|
||||
// Update summary when metadata title changes
|
||||
item.metadataForm.off('titlechange', setSummary);
|
||||
item.metadataForm.on('titlechange', setSummary);
|
||||
}
|
||||
});
|
||||
}
|
||||
else if (item instanceof H5PEditor.Select) {
|
||||
// Use selected value as title
|
||||
var change = function () {
|
||||
var value = item.$select.val();
|
||||
setTabLabel(value === '-' ? entity : item.$select.children('option[value="' + value + '"]').text());
|
||||
};
|
||||
item.$select.change(change);
|
||||
change();
|
||||
}
|
||||
|
||||
if ($currentTab === undefined) {
|
||||
// Open tab if there are none open
|
||||
$tab.trigger('open');
|
||||
}
|
||||
|
||||
$tabs.find('.h5p-vtab-li .h5p-vtab-a').first().focus();
|
||||
};
|
||||
|
||||
/**
|
||||
* Puts this widget at the end of the given container.
|
||||
*
|
||||
* @public
|
||||
* @param {jQuery} $container
|
||||
*/
|
||||
self.appendTo = function ($container) {
|
||||
$wrapper.appendTo($container);
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove this widget from the editor DOM.
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
self.remove = function () {
|
||||
$wrapper.remove();
|
||||
};
|
||||
}
|
||||
|
||||
return VerticalTabs;
|
||||
})(H5P.jQuery);
|
||||
Reference in New Issue
Block a user