1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import $ from 'jquery';
- function createSnippetChooser(id, modelString) {
- const chooserElement = $('#' + id + '-chooser');
- const docTitle = chooserElement.find('.title');
- const input = $('#' + id);
- const editLink = chooserElement.find('.edit-link');
- const chooserBaseUrl = chooserElement.data('chooserUrl') + modelString + '/';
- /*
- Construct initial state of the chooser from the rendered (static) HTML and arguments passed to
- createSnippetChooser. State is either null (= no document chosen) or a dict of id, string and
- edit_link.
- The result returned from the snippet chooser modal (see wagtail.snippets.views.chooser.chosen)
- is a superset of this, and can therefore be passed directly to chooser.setState.
- */
- let state = null;
- if (input.val()) {
- state = {
- id: input.val(),
- edit_link: editLink.attr('href'),
- string: docTitle.text(),
- };
- }
- /* define public API functions for the chooser */
- const chooser = {
- getState: () => state,
- getValue: () => state && state.id,
- setState: (newState) => {
- if (newState) {
- input.val(newState.id);
- docTitle.text(newState.string);
- chooserElement.removeClass('blank');
- editLink.attr('href', newState.edit_link);
- } else {
- input.val('');
- chooserElement.addClass('blank');
- }
- state = newState;
- },
- getTextLabel: (opts) => {
- if (!state) return null;
- const result = state.string;
- if (opts && opts.maxLength && result.length > opts.maxLength) {
- return result.substring(0, opts.maxLength - 1) + '…';
- }
- return result;
- },
- focus: () => {
- $('.action-choose', chooserElement).focus();
- },
- openChooserModal: () => {
- // eslint-disable-next-line no-undef, new-cap
- ModalWorkflow({
- url: chooserBaseUrl,
- // eslint-disable-next-line no-undef
- onload: SNIPPET_CHOOSER_MODAL_ONLOAD_HANDLERS,
- responses: {
- snippetChosen: (result) => {
- chooser.setState(result);
- },
- },
- });
- },
- clear: () => {
- chooser.setState(null);
- },
- };
- $('.action-choose', chooserElement).on('click', () => {
- chooser.openChooserModal();
- });
- $('.action-clear', chooserElement).on('click', () => {
- chooser.clear();
- });
- if (window.comments) {
- window.comments.initFieldLevelCommentWidget(chooserElement[0]);
- }
- return chooser;
- }
- window.createSnippetChooser = createSnippetChooser;
|