kopia lustrzana https://github.com/wagtail/wagtail
Clear out obsolete templates / js from pre-telepath streamfield
rodzic
599365752f
commit
0e96693fde
|
@ -1,60 +0,0 @@
|
|||
import $ from 'jquery';
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
window.ListBlock = function (opts) {
|
||||
/* contents of 'opts':
|
||||
definitionPrefix (required)
|
||||
childInitializer (optional) - JS initializer function for each child
|
||||
*/
|
||||
const listMemberTemplate = $('#' + opts.definitionPrefix + '-newmember').text();
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
return function (elementPrefix) {
|
||||
// eslint-disable-next-line no-undef, new-cap
|
||||
const sequence = Sequence({
|
||||
prefix: elementPrefix,
|
||||
maxNumChildBlocks: Infinity,
|
||||
onInitializeMember(sequenceMember) {
|
||||
/* initialize child block's JS behaviour */
|
||||
if (opts.childInitializer) {
|
||||
opts.childInitializer(sequenceMember.prefix + '-value');
|
||||
}
|
||||
|
||||
/* initialise delete button */
|
||||
$('#' + sequenceMember.prefix + '-delete').on('click', () => {
|
||||
sequenceMember.delete();
|
||||
});
|
||||
|
||||
/* initialise move up/down buttons */
|
||||
$('#' + sequenceMember.prefix + '-moveup').on('click', () => {
|
||||
sequenceMember.moveUp();
|
||||
});
|
||||
|
||||
$('#' + sequenceMember.prefix + '-movedown').on('click', () => {
|
||||
sequenceMember.moveDown();
|
||||
});
|
||||
},
|
||||
|
||||
onEnableMoveUp(sequenceMember) {
|
||||
$('#' + sequenceMember.prefix + '-moveup').removeClass('disabled');
|
||||
},
|
||||
|
||||
onDisableMoveUp(sequenceMember) {
|
||||
$('#' + sequenceMember.prefix + '-moveup').addClass('disabled');
|
||||
},
|
||||
|
||||
onEnableMoveDown(sequenceMember) {
|
||||
$('#' + sequenceMember.prefix + '-movedown').removeClass('disabled');
|
||||
},
|
||||
|
||||
onDisableMoveDown(sequenceMember) {
|
||||
$('#' + sequenceMember.prefix + '-movedown').addClass('disabled');
|
||||
}
|
||||
});
|
||||
|
||||
/* initialize 'add' button */
|
||||
$('#' + elementPrefix + '-add').on('click', () => {
|
||||
sequence.insertMemberAtEnd(listMemberTemplate);
|
||||
});
|
||||
};
|
||||
};
|
|
@ -1,387 +0,0 @@
|
|||
/*
|
||||
|
||||
Operations on a sequence of items, common to both ListBlock and StreamBlock.
|
||||
|
||||
These assume the presence of a container element named "{prefix}-container" for each list item, and
|
||||
certain hidden fields such as "{prefix}-deleted" as defined in sequence_member.html, but make no assumptions
|
||||
about layout or visible controls within the block.
|
||||
|
||||
For example, they don't assume the presence of a 'delete' button - it's up to the specific subclass
|
||||
(list.js / stream.js) to attach this to the SequenceMember.delete method.
|
||||
|
||||
CODE FOR SETTING UP SPECIFIC UI WIDGETS, SUCH AS DELETE BUTTONS OR MENUS, DOES NOT BELONG HERE.
|
||||
|
||||
*/
|
||||
|
||||
import $ from 'jquery';
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
window.SequenceMember = function (sequence, prefix) {
|
||||
const self = {};
|
||||
self.prefix = prefix;
|
||||
self.container = $('#' + self.prefix + '-container');
|
||||
|
||||
const indexField = $('#' + self.prefix + '-order');
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.delete = function () {
|
||||
sequence.deleteMember(self);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.prependMember = function (template) {
|
||||
sequence.insertMemberBefore(self, template);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.appendMember = function (template) {
|
||||
sequence.insertMemberAfter(self, template);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.moveUp = function () {
|
||||
sequence.moveMemberUp(self);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.moveDown = function () {
|
||||
sequence.moveMemberDown(self);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.markDeleted = function () {
|
||||
/* set this list member's hidden 'deleted' flag to true */
|
||||
$('#' + self.prefix + '-deleted').val('1');
|
||||
/* hide the list item */
|
||||
self.container.slideUp().dequeue().fadeOut();
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.markAdded = function () {
|
||||
self.container.hide();
|
||||
self.container.slideDown();
|
||||
|
||||
// focus first suitable input found
|
||||
setTimeout(() => {
|
||||
const $input = $('.input', self.container);
|
||||
const $firstField = $('input, textarea, [data-hallo-editor], [data-draftail-input]', $input).first();
|
||||
|
||||
if ($firstField.is('[data-draftail-input]')) {
|
||||
$firstField.get(0).draftailEditor.focus();
|
||||
} else {
|
||||
$firstField.trigger('focus');
|
||||
}
|
||||
}, 250);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.getIndex = function () {
|
||||
return parseInt(indexField.val(), 10);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.setIndex = function (i) {
|
||||
indexField.val(i);
|
||||
};
|
||||
|
||||
return self;
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
window.Sequence = function (opts) {
|
||||
const self = {};
|
||||
const list = $('#' + opts.prefix + '-list');
|
||||
const countField = $('#' + opts.prefix + '-count');
|
||||
/* NB countField includes deleted items; for the count of non-deleted items, use members.length */
|
||||
const members = [];
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.getCount = function () {
|
||||
return parseInt(countField.val(), 10);
|
||||
};
|
||||
|
||||
function getNewMemberPrefix() {
|
||||
/* Update the counter and use it to create a prefix for the new list member */
|
||||
const newIndex = self.getCount();
|
||||
countField.val(newIndex + 1);
|
||||
return opts.prefix + '-' + newIndex;
|
||||
}
|
||||
|
||||
function postInsertMember(newMember) {
|
||||
/* run any supplied initializer functions */
|
||||
if (opts.onInitializeMember) {
|
||||
opts.onInitializeMember(newMember);
|
||||
}
|
||||
|
||||
const index = newMember.getIndex();
|
||||
if (index === 0) {
|
||||
/* first item should have 'move up' disabled */
|
||||
if (opts.onDisableMoveUp) opts.onDisableMoveUp(newMember);
|
||||
} else {
|
||||
if (opts.onEnableMoveUp) opts.onEnableMoveUp(newMember);
|
||||
}
|
||||
|
||||
if (index === (members.length - 1)) {
|
||||
/* last item should have 'move down' disabled */
|
||||
if (opts.onDisableMoveDown) opts.onDisableMoveDown(newMember);
|
||||
} else {
|
||||
if (opts.onEnableMoveDown) opts.onEnableMoveDown(newMember);
|
||||
}
|
||||
|
||||
newMember.markAdded();
|
||||
|
||||
if (members.length >= opts.maxNumChildBlocks && opts.onDisableAdd) {
|
||||
/* maximum block capacity has been reached */
|
||||
opts.onDisableAdd(members);
|
||||
}
|
||||
}
|
||||
|
||||
function elementFromTemplate(template, newPrefix) {
|
||||
/* generate a jquery object ready to be inserted into the list, based on the passed HTML template string.
|
||||
'__PREFIX__' will be substituted with newPrefix, and script tags escaped as <-/script> will be un-escaped */
|
||||
return $(template.replace(/__PREFIX__/g, newPrefix).replace(/<-(-*)\/script>/g, '<$1/script>'));
|
||||
}
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.insertMemberBefore = function (otherMember, template) {
|
||||
const newMemberPrefix = getNewMemberPrefix();
|
||||
|
||||
/* Create the new list member element with the real prefix substituted in */
|
||||
const elem = elementFromTemplate(template, newMemberPrefix);
|
||||
otherMember.container.before(elem);
|
||||
// eslint-disable-next-line no-undef, new-cap
|
||||
const newMember = SequenceMember(self, newMemberPrefix);
|
||||
const index = otherMember.getIndex();
|
||||
|
||||
/* bump up index of otherMember and subsequent members */
|
||||
for (let i = index; i < members.length; i++) {
|
||||
members[i].setIndex(i + 1);
|
||||
}
|
||||
|
||||
members.splice(index, 0, newMember);
|
||||
newMember.setIndex(index);
|
||||
|
||||
postInsertMember(newMember);
|
||||
|
||||
if (index === 0 && opts.onEnableMoveUp) {
|
||||
/* other member can now move up */
|
||||
opts.onEnableMoveUp(otherMember);
|
||||
}
|
||||
|
||||
return newMember;
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.insertMemberAfter = function (otherMember, template) {
|
||||
const newMemberPrefix = getNewMemberPrefix();
|
||||
|
||||
/* Create the new list member element with the real prefix substituted in */
|
||||
const elem = elementFromTemplate(template, newMemberPrefix);
|
||||
otherMember.container.after(elem);
|
||||
// eslint-disable-next-line no-undef, new-cap
|
||||
const newMember = SequenceMember(self, newMemberPrefix);
|
||||
const index = otherMember.getIndex() + 1;
|
||||
|
||||
/* bump up index of subsequent members */
|
||||
for (let i = index; i < members.length; i++) {
|
||||
members[i].setIndex(i + 1);
|
||||
}
|
||||
|
||||
members.splice(index, 0, newMember);
|
||||
newMember.setIndex(index);
|
||||
|
||||
postInsertMember(newMember);
|
||||
|
||||
if (index === (members.length - 1) && opts.onEnableMoveDown) {
|
||||
/* other member can now move down */
|
||||
opts.onEnableMoveDown(otherMember);
|
||||
}
|
||||
|
||||
return newMember;
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.insertMemberAtStart = function (template) {
|
||||
/* NB we can't just do
|
||||
self.insertMemberBefore(members[0], template)
|
||||
because that won't work for initially empty lists
|
||||
*/
|
||||
const newMemberPrefix = getNewMemberPrefix();
|
||||
|
||||
/* Create the new list member element with the real prefix substituted in */
|
||||
const elem = elementFromTemplate(template, newMemberPrefix);
|
||||
list.prepend(elem);
|
||||
// eslint-disable-next-line no-undef, new-cap
|
||||
const newMember = SequenceMember(self, newMemberPrefix);
|
||||
|
||||
/* bump up index of all other members */
|
||||
for (let i = 0; i < members.length; i++) {
|
||||
members[i].setIndex(i + 1);
|
||||
}
|
||||
|
||||
members.unshift(newMember);
|
||||
newMember.setIndex(0);
|
||||
|
||||
postInsertMember(newMember);
|
||||
|
||||
if (members.length > 1 && opts.onEnableMoveUp) {
|
||||
/* previous first member can now move up */
|
||||
opts.onEnableMoveUp(members[1]);
|
||||
}
|
||||
|
||||
return newMember;
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.insertMemberAtEnd = function (template) {
|
||||
const newMemberPrefix = getNewMemberPrefix();
|
||||
|
||||
/* Create the new list member element with the real prefix substituted in */
|
||||
const elem = elementFromTemplate(template, newMemberPrefix);
|
||||
list.append(elem);
|
||||
// eslint-disable-next-line no-undef, new-cap
|
||||
const newMember = SequenceMember(self, newMemberPrefix);
|
||||
|
||||
newMember.setIndex(members.length);
|
||||
members.push(newMember);
|
||||
|
||||
postInsertMember(newMember);
|
||||
|
||||
if (members.length > 1 && opts.onEnableMoveDown) {
|
||||
/* previous last member can now move down */
|
||||
opts.onEnableMoveDown(members[members.length - 2]);
|
||||
}
|
||||
|
||||
return newMember;
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.deleteMember = function (member) {
|
||||
const index = member.getIndex();
|
||||
/* reduce index numbers of subsequent members */
|
||||
for (let i = index + 1; i < members.length; i++) {
|
||||
members[i].setIndex(i - 1);
|
||||
}
|
||||
/* remove from the 'members' list */
|
||||
members.splice(index, 1);
|
||||
member.markDeleted();
|
||||
|
||||
if (index === 0 && members.length > 0 && opts.onDisableMoveUp) {
|
||||
/* deleting the first member; the new first member cannot move up now */
|
||||
opts.onDisableMoveUp(members[0]);
|
||||
}
|
||||
|
||||
if (index === members.length && members.length > 0 && opts.onDisableMoveDown) {
|
||||
/* deleting the last member; the new last member cannot move down now */
|
||||
opts.onDisableMoveDown(members[members.length - 1]);
|
||||
}
|
||||
|
||||
if (members.length + 1 >= opts.maxNumChildBlocks && members.length < opts.maxNumChildBlocks && opts.onEnableAdd) {
|
||||
/* there is now capacity left for another block */
|
||||
opts.onEnableAdd(members);
|
||||
}
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.moveMemberUp = function (member) {
|
||||
const oldIndex = member.getIndex();
|
||||
if (oldIndex > 0) {
|
||||
const newIndex = oldIndex - 1;
|
||||
const swappedMember = members[newIndex];
|
||||
|
||||
members[newIndex] = member;
|
||||
member.setIndex(newIndex);
|
||||
|
||||
members[oldIndex] = swappedMember;
|
||||
swappedMember.setIndex(oldIndex);
|
||||
|
||||
member.container.insertBefore(swappedMember.container);
|
||||
|
||||
if (newIndex === 0) {
|
||||
/*
|
||||
member is now the first member and cannot move up further;
|
||||
swappedMember is no longer the first member, and CAN move up
|
||||
*/
|
||||
if (opts.onDisableMoveUp) opts.onDisableMoveUp(member);
|
||||
if (opts.onEnableMoveUp) opts.onEnableMoveUp(swappedMember);
|
||||
}
|
||||
|
||||
if (oldIndex === (members.length - 1)) {
|
||||
/*
|
||||
member was previously the last member, and can now move down;
|
||||
swappedMember is now the last member, and cannot move down
|
||||
*/
|
||||
if (opts.onEnableMoveDown) opts.onEnableMoveDown(member);
|
||||
if (opts.onDisableMoveDown) opts.onDisableMoveDown(swappedMember);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.moveMemberDown = function (member) {
|
||||
const oldIndex = member.getIndex();
|
||||
if (oldIndex < (members.length - 1)) {
|
||||
const newIndex = oldIndex + 1;
|
||||
const swappedMember = members[newIndex];
|
||||
|
||||
members[newIndex] = member;
|
||||
member.setIndex(newIndex);
|
||||
|
||||
members[oldIndex] = swappedMember;
|
||||
swappedMember.setIndex(oldIndex);
|
||||
|
||||
member.container.insertAfter(swappedMember.container);
|
||||
|
||||
if (newIndex === (members.length - 1)) {
|
||||
/*
|
||||
member is now the last member and cannot move down further;
|
||||
swappedMember is no longer the last member, and CAN move down
|
||||
*/
|
||||
if (opts.onDisableMoveDown) opts.onDisableMoveDown(member);
|
||||
if (opts.onEnableMoveDown) opts.onEnableMoveDown(swappedMember);
|
||||
}
|
||||
|
||||
if (oldIndex === 0) {
|
||||
/*
|
||||
member was previously the first member, and can now move up;
|
||||
swappedMember is now the first member, and cannot move up
|
||||
*/
|
||||
if (opts.onEnableMoveUp) opts.onEnableMoveUp(member);
|
||||
if (opts.onDisableMoveUp) opts.onDisableMoveUp(swappedMember);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/* initialize initial list members */
|
||||
const count = self.getCount();
|
||||
for (let i = 0; i < count; i++) {
|
||||
const memberPrefix = opts.prefix + '-' + i;
|
||||
// eslint-disable-next-line no-undef, new-cap
|
||||
const sequenceMember = SequenceMember(self, memberPrefix);
|
||||
members[i] = sequenceMember;
|
||||
if (opts.onInitializeMember) {
|
||||
opts.onInitializeMember(sequenceMember);
|
||||
}
|
||||
|
||||
if (i === 0) {
|
||||
/* first item should have 'move up' disabled */
|
||||
if (opts.onDisableMoveUp) opts.onDisableMoveUp(sequenceMember);
|
||||
} else {
|
||||
if (opts.onEnableMoveUp) opts.onEnableMoveUp(sequenceMember);
|
||||
}
|
||||
|
||||
if (i === (count - 1)) {
|
||||
/* last item should have 'move down' disabled */
|
||||
if (opts.onDisableMoveDown) opts.onDisableMoveDown(sequenceMember);
|
||||
} else {
|
||||
if (opts.onEnableMoveDown) opts.onEnableMoveDown(sequenceMember);
|
||||
}
|
||||
}
|
||||
|
||||
if (members.length >= opts.maxNumChildBlocks && opts.onDisableAdd) {
|
||||
/* block capacity is already reached on initialization */
|
||||
opts.onDisableAdd(members);
|
||||
}
|
||||
|
||||
return self;
|
||||
};
|
|
@ -1,179 +0,0 @@
|
|||
import $ from 'jquery';
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
const StreamBlockMenu = function (opts) {
|
||||
/*
|
||||
Helper object to handle the menu of available block types.
|
||||
Options:
|
||||
childBlocks: list of block definitions (same as passed to StreamBlock)
|
||||
id: ID of the container element (the one around 'c-sf-add-panel')
|
||||
onChooseBlock: callback fired when a block type is chosen -
|
||||
the corresponding childBlock is passed as a parameter
|
||||
*/
|
||||
const self = {};
|
||||
self.container = $('#' + opts.id);
|
||||
self.openCloseButton = $('#' + opts.id + '-openclose');
|
||||
|
||||
if (self.container.hasClass('stream-menu-closed')) {
|
||||
self.container.hide();
|
||||
}
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.show = function () {
|
||||
self.container.slideDown();
|
||||
self.container.removeClass('stream-menu-closed');
|
||||
self.container.attr('aria-hidden', 'false');
|
||||
self.openCloseButton.addClass('c-sf-add-button--close');
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.hide = function () {
|
||||
self.container.slideUp();
|
||||
self.container.addClass('stream-menu-closed');
|
||||
self.container.attr('aria-hidden', 'true');
|
||||
self.openCloseButton.removeClass('c-sf-add-button--close');
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.addFirstBlock = function () {
|
||||
if (opts.onChooseBlock) opts.onChooseBlock(opts.childBlocks[0]);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
self.toggle = function () {
|
||||
if (self.container.hasClass('stream-menu-closed')) {
|
||||
if (opts.childBlocks.length === 1) {
|
||||
/* If there's only one block type, add it automatically */
|
||||
self.addFirstBlock();
|
||||
} else {
|
||||
self.show();
|
||||
}
|
||||
} else {
|
||||
self.hide();
|
||||
}
|
||||
};
|
||||
|
||||
/* set up show/hide on click behaviour */
|
||||
self.openCloseButton.on('click', (e) => {
|
||||
e.preventDefault();
|
||||
self.toggle();
|
||||
});
|
||||
|
||||
/* set up button behaviour */
|
||||
$.each(opts.childBlocks, (i, childBlock) => {
|
||||
const button = self.container.find('.action-add-block-' + childBlock.name);
|
||||
button.on('click', () => {
|
||||
if (opts.onChooseBlock) opts.onChooseBlock(childBlock);
|
||||
self.hide();
|
||||
});
|
||||
});
|
||||
|
||||
return self;
|
||||
};
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
window.StreamBlock = function (opts) {
|
||||
/* Fetch the HTML template strings to be used when adding a new block of each type.
|
||||
Also reorganise the opts.childBlocks list into a lookup by name
|
||||
*/
|
||||
const listMemberTemplates = {};
|
||||
const childBlocksByName = {};
|
||||
for (let i = 0; i < opts.childBlocks.length; i++) {
|
||||
const childBlock = opts.childBlocks[i];
|
||||
childBlocksByName[childBlock.name] = childBlock;
|
||||
const template = $('#' + opts.definitionPrefix + '-newmember-' + childBlock.name).text();
|
||||
listMemberTemplates[childBlock.name] = template;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
return function (elementPrefix) {
|
||||
// eslint-disable-next-line no-undef, new-cap
|
||||
const sequence = Sequence({
|
||||
prefix: elementPrefix,
|
||||
maxNumChildBlocks: opts.maxNumChildBlocks,
|
||||
onInitializeMember(sequenceMember) {
|
||||
/* initialize child block's JS behaviour */
|
||||
const blockTypeName = $('#' + sequenceMember.prefix + '-type').val();
|
||||
const blockOpts = childBlocksByName[blockTypeName];
|
||||
if (blockOpts.initializer) {
|
||||
/* the child block's own elements have the prefix '{list member prefix}-value' */
|
||||
blockOpts.initializer(sequenceMember.prefix + '-value');
|
||||
}
|
||||
|
||||
/* initialize delete button */
|
||||
$('#' + sequenceMember.prefix + '-delete').on('click', () => {
|
||||
sequenceMember.delete();
|
||||
});
|
||||
|
||||
/* initialise move up/down buttons */
|
||||
$('#' + sequenceMember.prefix + '-moveup').on('click', () => {
|
||||
sequenceMember.moveUp();
|
||||
});
|
||||
|
||||
$('#' + sequenceMember.prefix + '-movedown').on('click', () => {
|
||||
sequenceMember.moveDown();
|
||||
});
|
||||
|
||||
/* Set up the 'append a block' menu that appears after the block */
|
||||
// eslint-disable-next-line new-cap
|
||||
StreamBlockMenu({
|
||||
childBlocks: opts.childBlocks,
|
||||
id: sequenceMember.prefix + '-appendmenu',
|
||||
onChooseBlock(childBlock) {
|
||||
const template = listMemberTemplates[childBlock.name];
|
||||
sequenceMember.appendMember(template);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
onEnableMoveUp(sequenceMember) {
|
||||
$('#' + sequenceMember.prefix + '-moveup').removeClass('disabled');
|
||||
},
|
||||
|
||||
onDisableMoveUp(sequenceMember) {
|
||||
$('#' + sequenceMember.prefix + '-moveup').addClass('disabled');
|
||||
},
|
||||
|
||||
onEnableMoveDown(sequenceMember) {
|
||||
$('#' + sequenceMember.prefix + '-movedown').removeClass('disabled');
|
||||
},
|
||||
|
||||
onDisableMoveDown(sequenceMember) {
|
||||
$('#' + sequenceMember.prefix + '-movedown').addClass('disabled');
|
||||
},
|
||||
|
||||
onDisableAdd(members) {
|
||||
for (let i = 0; i < members.length; i++) {
|
||||
$('#' + members[i].prefix + '-appendmenu-openclose')
|
||||
.removeClass('c-sf-add-button--visible').delay(300)
|
||||
.slideUp();
|
||||
}
|
||||
$('#' + elementPrefix + '-prependmenu-openclose')
|
||||
.removeClass('c-sf-add-button--visible').delay(300)
|
||||
.slideUp();
|
||||
},
|
||||
|
||||
onEnableAdd(members) {
|
||||
for (let i = 0; i < members.length; i++) {
|
||||
$('#' + members[i].prefix + '-appendmenu-openclose')
|
||||
.addClass('c-sf-add-button--visible').delay(300)
|
||||
.slideDown();
|
||||
}
|
||||
$('#' + elementPrefix + '-prependmenu-openclose')
|
||||
.addClass('c-sf-add-button--visible').delay(300)
|
||||
.slideDown();
|
||||
}
|
||||
});
|
||||
|
||||
/* Set up the 'prepend a block' menu that appears above the first block in the sequence */
|
||||
// eslint-disable-next-line new-cap
|
||||
StreamBlockMenu({
|
||||
childBlocks: opts.childBlocks,
|
||||
id: elementPrefix + '-prependmenu',
|
||||
onChooseBlock(childBlock) {
|
||||
const template = listMemberTemplates[childBlock.name];
|
||||
sequence.insertMemberAtStart(template);
|
||||
}
|
||||
});
|
||||
};
|
||||
};
|
|
@ -1,12 +0,0 @@
|
|||
// eslint-disable-next-line func-names
|
||||
window.StructBlock = function (childInitializersByName) {
|
||||
// eslint-disable-next-line func-names
|
||||
return function (prefix) {
|
||||
// eslint-disable-next-line no-restricted-syntax, guard-for-in
|
||||
for (const childName in childInitializersByName) {
|
||||
const childInitializer = childInitializersByName[childName];
|
||||
const childPrefix = prefix + '-' + childName;
|
||||
childInitializer(childPrefix);
|
||||
}
|
||||
};
|
||||
};
|
|
@ -26,10 +26,6 @@ const exposedDependencies = {
|
|||
module.exports = function exports() {
|
||||
const entrypoints = {
|
||||
'admin': [
|
||||
'blocks/list',
|
||||
'blocks/sequence',
|
||||
'blocks/stream',
|
||||
'blocks/struct',
|
||||
'core',
|
||||
'date-time-chooser',
|
||||
'draftail',
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
{% load wagtailadmin_tags %}
|
||||
<div class="field {{ field|fieldtype }} widget-{{ field|widgettype }}{% if name %} fieldname-{{ name }}{% endif %}{% if classes %} {{ classes }}{% endif %}{% if errors %} error{% endif %}">
|
||||
<div class="field-content">
|
||||
<div class="input">
|
||||
{{ widget }}
|
||||
|
||||
{# This span only used on rare occasions by certain types of input #}
|
||||
<span></span>
|
||||
</div>
|
||||
{% if field.help_text %}
|
||||
<p class="help">{{ field.help_text }}</p>
|
||||
{% endif %}
|
||||
|
||||
{% if errors %}
|
||||
<p class="error-message">
|
||||
{% for error in errors %}
|
||||
<span>{{ error|escape }}</span>
|
||||
{% endfor %}
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
|
@ -1,6 +0,0 @@
|
|||
{% extends "wagtailadmin/block_forms/sequence.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block footer %}
|
||||
<button type="button" title="Add" id="{{ prefix }}-add" class="c-sf-add-button c-sf-add-button--visible"><i aria-hidden="true">+</i></button>
|
||||
{% endblock %}
|
|
@ -1,14 +0,0 @@
|
|||
{% extends "wagtailadmin/block_forms/sequence_member.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block header_controls %}
|
||||
<button type="button" id="{{ prefix }}-moveup" class="c-sf-block__actions__single" title="{% trans 'Move up' %}">
|
||||
<i class="icon icon-arrow-up" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button type="button" id="{{ prefix }}-movedown" class="c-sf-block__actions__single" title="{% trans 'Move down' %}">
|
||||
<i class="icon icon-arrow-down" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button type="button" id="{{ prefix }}-delete" class="c-sf-block__actions__single" title="{% trans 'Delete' %}">
|
||||
<i class="icon icon-bin" aria-hidden="true"></i>
|
||||
</button>
|
||||
{% endblock %}
|
|
@ -1,44 +0,0 @@
|
|||
{% comment %}
|
||||
A 'sequence' is a generalised structure that implements a collection of blocks that can be
|
||||
ordered, added and deleted.
|
||||
|
||||
It provides the overall HTML structure, and the logic for updating hidden fields to reflect
|
||||
changes to the sequence, but NOT the UI controls for performing those changes: that is the
|
||||
responsibility of specific subtypes of 'sequence', such as list and stream.
|
||||
|
||||
|
||||
DO NOT PUT UI CONTROLS HERE, OR ANYTHING ELSE THAT ASSUMES A SPECIFIC VISUAL RENDERING OF THE LIST.
|
||||
(That belongs in templates that extend this one, such as list.html and stream.html.)
|
||||
|
||||
|
||||
{% endcomment %}
|
||||
|
||||
{% load wagtailadmin_tags %}
|
||||
|
||||
{% if help_text %}
|
||||
<span>
|
||||
<div class="help">
|
||||
{% icon name="help" class_name="default" %}
|
||||
{{ help_text }}
|
||||
</div>
|
||||
</span>
|
||||
{% endif %}
|
||||
|
||||
<div class="c-sf-container{% if classname %} {{ classname }}{% endif %}">
|
||||
<input type="hidden" name="{{ prefix }}-count" id="{{ prefix }}-count" value="{{ list_members_html|length }}">
|
||||
|
||||
{% block header %}{% endblock %}
|
||||
|
||||
{% if block_errors %}
|
||||
{% for error in block_errors %}
|
||||
<div class="help-block help-critical">{{ error }}</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
<div id="{{ prefix }}-list">
|
||||
{% for list_member_html in list_members_html %}
|
||||
{{ list_member_html }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% block footer %}{% endblock %}
|
||||
</div>
|
|
@ -1,42 +0,0 @@
|
|||
{% comment %}
|
||||
A 'sequence' is a generalised structure that implements a collection of blocks that can be
|
||||
ordered, added and deleted.
|
||||
|
||||
It provides the overall HTML structure, and the logic for updating hidden fields to reflect
|
||||
changes to the sequence, but NOT the UI controls for performing those changes: that is the
|
||||
responsibility of specific subtypes of 'sequence', such as list and stream.
|
||||
|
||||
|
||||
DO NOT PUT UI CONTROLS HERE, OR ANYTHING ELSE THAT ASSUMES A SPECIFIC VISUAL RENDERING OF THE LIST.
|
||||
(That belongs in templates that extend this one, such as list_member.html and stream_member.html.)
|
||||
|
||||
|
||||
{% endcomment %}
|
||||
<div id="{{ prefix }}-container" aria-hidden="false">
|
||||
<input type="hidden" id="{{ prefix }}-deleted" name="{{ prefix }}-deleted" value="">
|
||||
<input type="hidden" id="{{ prefix }}-order" name="{{ prefix }}-order" value="{{ index }}">
|
||||
{% block hidden_fields %}{% endblock %}
|
||||
|
||||
<div>
|
||||
<div class="c-sf-container__block-container">
|
||||
<div class="c-sf-block">
|
||||
<div class="c-sf-block__header">
|
||||
<span class="c-sf-block__header__icon">
|
||||
<i class="icon icon-{{ child_block.meta.icon }}"></i>
|
||||
</span>
|
||||
<h3 class="c-sf-block__header__title"></h3>
|
||||
<div class="c-sf-block__actions">
|
||||
<span class="c-sf-block__type">{% block block_type_label %}{% endblock %}</span>
|
||||
{% block header_controls %}{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="c-sf-block__content" aria-hidden="false">
|
||||
<div class="c-sf-block__content-inner">
|
||||
{{ child.render_form }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% block footer_controls %}{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,9 +0,0 @@
|
|||
{% extends "wagtailadmin/block_forms/sequence.html" %}
|
||||
|
||||
{% block header %}
|
||||
{% if list_members_html %}
|
||||
{% include "wagtailadmin/block_forms/stream_menu.html" with menu_id=prefix|add:"-prependmenu" state="closed" %}
|
||||
{% else %}
|
||||
{% include "wagtailadmin/block_forms/stream_menu.html" with menu_id=prefix|add:"-prependmenu" state="open" %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
|
@ -1,25 +0,0 @@
|
|||
{% extends "wagtailadmin/block_forms/sequence_member.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block hidden_fields %}
|
||||
<input type="hidden" id="{{ prefix }}-type" name="{{ prefix }}-type" value="{{ child_block.name }}">
|
||||
<input type="hidden" id="{{ prefix }}-id" name="{{ prefix }}-id" value="{{ block_id|default:"" }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block block_type_label %}{{ child_block.label }}{% endblock %}
|
||||
|
||||
{% block header_controls %}
|
||||
<button type="button" id="{{ prefix }}-moveup" class="c-sf-block__actions__single" title="{% trans 'Move up' %}">
|
||||
<i class="icon icon-arrow-up" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button type="button" id="{{ prefix }}-movedown" class="c-sf-block__actions__single" title="{% trans 'Move down' %}">
|
||||
<i class="icon icon-arrow-down" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button type="button" id="{{ prefix }}-delete" class="c-sf-block__actions__single" title="{% trans 'Delete' %}">
|
||||
<i class="icon icon-bin" aria-hidden="true"></i>
|
||||
</button>
|
||||
{% endblock %}
|
||||
|
||||
{% block footer_controls %}
|
||||
{% include "wagtailadmin/block_forms/stream_menu.html" with menu_id=prefix|add:"-appendmenu" state="closed" %}
|
||||
{% endblock %}
|
|
@ -1,23 +0,0 @@
|
|||
<button type="button" title="Add" class="c-sf-add-button c-sf-add-button--visible {% if state == 'open' %}c-sf-add-button--close{% endif %}" id="{{ menu_id }}-openclose">
|
||||
<i aria-hidden="true">+</i>
|
||||
</button>
|
||||
<div aria-hidden="{% if state == 'closed' %}true{% else %}false{% endif %}" {% if state == 'closed' %}class="stream-menu-closed"{% endif %} id="{{ menu_id }}">
|
||||
<div class="c-sf-add-panel">
|
||||
{% regroup child_blocks by meta.group as grouped_child_blocks %}
|
||||
{% for child_blocks in grouped_child_blocks %}
|
||||
{% if child_blocks.grouper %}
|
||||
<h4 class="c-sf-add-panel__group-title">{{ child_blocks.grouper }}</h4>
|
||||
{% endif %}
|
||||
<div class="c-sf-add-panel__grid">
|
||||
{% for child_block in child_blocks.list %}
|
||||
<button type="button" class="c-sf-button action-add-block-{{ child_block.name }}">
|
||||
<span class="c-sf-button__icon">
|
||||
<i class="icon icon-{{ child_block.meta.icon }}"></i>
|
||||
</span>
|
||||
<span class="c-sf-button__label">{{ child_block.label }}</span>
|
||||
</button>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
|
@ -1,21 +0,0 @@
|
|||
{% load wagtailadmin_tags %}
|
||||
|
||||
<div class="{{ classname }}">
|
||||
{% if help_text %}
|
||||
<span>
|
||||
<div class="help">
|
||||
{% icon name="help" class_name="default" %}
|
||||
{{ help_text }}
|
||||
</div>
|
||||
</span>
|
||||
{% endif %}
|
||||
|
||||
{% for child in children.values %}
|
||||
<div class="field {% if child.block.required %}required{% endif %}">
|
||||
{% if child.block.label %}
|
||||
<label class="field__label" {% if child.id_for_label %}for="{{ child.id_for_label }}"{% endif %}>{{ child.block.label }}</label>
|
||||
{% endif %}
|
||||
{{ child.render_form }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
|
@ -7,7 +7,6 @@ from collections.abc import MutableSequence
|
|||
|
||||
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
|
||||
from django.forms.utils import ErrorList
|
||||
from django.template.loader import render_to_string
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.html import format_html_join
|
||||
from django.utils.translation import gettext as _
|
||||
|
@ -92,23 +91,6 @@ class BaseStreamBlock(Block):
|
|||
self.sorted_child_blocks(), key=lambda child_block: child_block.meta.group
|
||||
)
|
||||
|
||||
def render_list_member(self, block_type_name, value, prefix, index, errors=None, id=None):
|
||||
"""
|
||||
Render the HTML for a single list item. This consists of a container, hidden fields
|
||||
to manage ID/deleted state/type, delete/reorder buttons, and the child block's own HTML.
|
||||
"""
|
||||
child_block = self.child_blocks[block_type_name]
|
||||
child = child_block.bind(value, prefix="%s-value" % prefix, errors=errors)
|
||||
return render_to_string('wagtailadmin/block_forms/stream_member.html', {
|
||||
'child_blocks': self.sorted_child_blocks(),
|
||||
'block_type_name': block_type_name,
|
||||
'child_block': child_block,
|
||||
'prefix': prefix,
|
||||
'child': child,
|
||||
'index': index,
|
||||
'block_id': id,
|
||||
})
|
||||
|
||||
def value_from_datadict(self, data, files, prefix):
|
||||
count = int(data['%s-count' % prefix])
|
||||
values_with_indexes = []
|
||||
|
|
Ładowanie…
Reference in New Issue