From 48a249971972a66d54393bbd7f189b132e6ec317 Mon Sep 17 00:00:00 2001 From: jordij Date: Fri, 23 Jan 2015 10:32:13 +1300 Subject: [PATCH] A bit of a cleanup --- README.md | 22 ++- wagtailembedder/helper.py | 3 + .../wagtailembedder/js/hallo-embedder.js | 163 +++++------------- .../wagtailembedder/snippets/type_index.html | 3 +- .../wagtailembedder/snippets/type_index.js | 11 -- .../wagtailembedder/snippets/types_list.js | 11 -- wagtailembedder/views/chooser.py | 22 ++- wagtailembedder/wagtail_hooks.py | 5 +- 8 files changed, 90 insertions(+), 150 deletions(-) diff --git a/README.md b/README.md index cd0c4c0..75e08d3 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,24 @@ wagtailembedder Snippets embedder for Wagtail richtext fields. -UNDER CONSTRUCTION \ No newline at end of file +# Quickstart + +``` $ pip install wagtailembedder [GITHUB SSH URI]``` + +add wagtailembedder to your settings.py in the INSTALLED_APPS section: + +``` +... + 'modelcluster', + 'wagtailembedder', + 'core', +... +``` + +For each of your models registered as a wagtail.wagtailsnippets create an html file to render the template inside a RichText field. +Example: if we have a ```SocialMediaLink``` snippet in our ```core``` app we need to create a template in ```core/templates/snippets/social_media_link.html``` + +If no template is defined then nothing will be outputted in the frontend when rendering a RichText field, don't be a dick and write some nice templates. + +Templates names will match snippets models names replacing capital letters with underscores, Wagtail style. + diff --git a/wagtailembedder/helper.py b/wagtailembedder/helper.py index b1904a8..34ff748 100644 --- a/wagtailembedder/helper.py +++ b/wagtailembedder/helper.py @@ -35,5 +35,8 @@ def expand_db_attributes(attrs, for_editor): def add_embed_handler(): + """ + Add our own SnippetEmbedHandler into the wagtailcore EMBED_HANDLERS var + """ EMBED_HANDLERS['snippet'] = SnippetEmbedHandler return True diff --git a/wagtailembedder/static/wagtailembedder/js/hallo-embedder.js b/wagtailembedder/static/wagtailembedder/js/hallo-embedder.js index 9e8fa9d..38ba34c 100644 --- a/wagtailembedder/static/wagtailembedder/js/hallo-embedder.js +++ b/wagtailembedder/static/wagtailembedder/js/hallo-embedder.js @@ -9,134 +9,65 @@ var button, widget; widget = this; + + getEnclosingEmbed = function() { + var node; + + node = widget.options.editable.getSelection().commonAncestorContainer; + return $(node).parents('div[data-embedtype="snippet"]').get(0); + }; + button = $(''); button.hallobutton({ uuid: this.options.uuid, editable: this.options.editable, label: 'Snippets', icon: 'icon-snippet', - command: null + queryState: function(event) { + var refreshedButton = button.hallobutton('checked', getEnclosingEmbed()); + if ($(refreshedButton).hasClass('ui-state-active')) { + $(toolbar).find('button').not($(button).children()[0]).removeClass('ui-state-active'); + } + return refreshedButton; + } }); toolbar.append(button); return button.on("click", function(event) { - var insertionPoint, lastSelection; - - lastSelection = widget.options.editable.getSelection(); - insertionPoint = $(lastSelection.endContainer).parentsUntil('.richtext').last(); - return ModalWorkflow({ - url: window.embedderChooserUrls.embedderChooser, - responses: { - snippetChosen: function(embedData) { - var elem; - - elem = $(embedData).get(0); - lastSelection.insertNode(elem); - // if (elem.getAttribute('contenteditable') === 'false') { - // insertRichTextDeleteControl(elem); - // } - return widget.options.editable.element.trigger('change'); + var enclosingLink, insertionPoint, lastSelection; + + enclosingLink = getEnclosingEmbed(); + if (!enclosingLink) { + + lastSelection = widget.options.editable.getSelection(); + insertionPoint = $(lastSelection.endContainer).parentsUntil('.richtext').last(); + return ModalWorkflow({ + url: window.embedderChooserUrls.embedderChooser, + responses: { + snippetChosen: function(embedData) { + var elem = $(embedData).get(0); + lastSelection.insertNode(elem); + if (elem.getAttribute('contenteditable') === 'false') { + insertRichTextDeleteControl(elem); + } + + var parentElement = $(lastSelection.endContainer); + var eol; + if ($(parentElement).hasClass('richtext')) { + eol = $(elem).parent().append("
"); + } else { + parentElement = $(parentElement).parent(); + eol = $( "
" ).insertAfter(parentElement); + } + placeCaretAtEnd(eol[0]); + + return widget.options.editable.element.trigger('change'); + } } - } - }); + }); + } }); } }); })(jQuery); -}).call(this); - - - - - - -// (function() { -// (function($) { -// return $.widget("IKS.halloembedder", { -// options: { -// uuid: '', -// editable: null -// }, -// populateToolbar: function(toolbar) { -// var button, getEnclosingLink, widget; - -// widget = this; -// getEnclosingLink = function() { -// var node; - -// node = widget.options.editable.getSelection().commonAncestorContainer; -// return $(node).parents('a').get(0); -// }; -// button = $(''); -// button.hallobutton({ -// uuid: this.options.uuid, -// editable: this.options.editable, -// label: 'Snippets', -// icon: 'icon-snippet', -// command: null -// /*queryState: function(event) { -// return button.hallobutton('checked', !!getEnclosingLink()); -// }*/ -// }); -// toolbar.append(button); -// return button.on("click", function(event) { -// var insertionPoint, lastSelection; - -// lastSelection = widget.options.editable.getSelection(); -// insertionPoint = $(lastSelection.endContainer).parentsUntil('.richtext').last(); - -// return ModalWorkflow({ -// url: window.embedderChooserUrls.embedderChooser, -// responses: { -// embedChosen: function(embedData) { -// var elem; -// elem = $(embedData).get(0); -// lastSelection.insertNode(elem); -// // if (elem.getAttribute('contenteditable') === 'false') { -// // insertRichTextDeleteControl(elem); -// // } -// return widget.options.editable.element.trigger('change'); -// } -// } -// }); -// // enclosingLink = getEnclosingLink(); -// /*if (enclosingLink) { -// $(enclosingLink).replaceWith(enclosingLink.innerHTML); -// button.hallobutton('checked', false); -// return widget.options.editable.element.trigger('change'); -// } else { -// lastSelection = widget.options.editable.getSelection(); -// if (lastSelection.collapsed) { -// url = window.chooserUrls.pageChooser + '?allow_external_link=true&allow_email_link=true&prompt_for_link_text=true'; -// } else { -// url = window.chooserUrls.pageChooser + '?allow_external_link=true&allow_email_link=true'; -// } -// return ModalWorkflow({ -// url: url, -// responses: { -// pageChosen: function(pageData) { -// var a; - -// a = document.createElement('a'); -// a.setAttribute('href', pageData.url); -// if (pageData.id) { -// a.setAttribute('data-id', pageData.id); -// a.setAttribute('data-linktype', 'page'); -// } -// if ((!lastSelection.collapsed) && lastSelection.canSurroundContents()) { -// lastSelection.surroundContents(a); -// } else { -// a.appendChild(document.createTextNode(pageData.title)); -// lastSelection.insertNode(a); -// } -// return widget.options.editable.element.trigger('change'); -// } -// } -// }); -// }*/ -// }); -// } -// }); -// })(jQuery); - -// }).call(this); \ No newline at end of file +}).call(this); \ No newline at end of file diff --git a/wagtailembedder/templates/wagtailembedder/snippets/type_index.html b/wagtailembedder/templates/wagtailembedder/snippets/type_index.html index 704b9df..000934c 100644 --- a/wagtailembedder/templates/wagtailembedder/snippets/type_index.html +++ b/wagtailembedder/templates/wagtailembedder/snippets/type_index.html @@ -13,8 +13,9 @@

add one first??

+

No {{ snippet_type_name_plural }} have been created. Why not add one first?

{% endif %} diff --git a/wagtailembedder/templates/wagtailembedder/snippets/type_index.js b/wagtailembedder/templates/wagtailembedder/snippets/type_index.js index a6a4046..2c5b7d2 100644 --- a/wagtailembedder/templates/wagtailembedder/snippets/type_index.js +++ b/wagtailembedder/templates/wagtailembedder/snippets/type_index.js @@ -2,17 +2,6 @@ function(modal) { $('div.snippet-list h2 a.snippet-choice').click(function(event){ event.preventDefault(); modal.loadUrl(this.href); - // $.get($(this).attr('href'), function(response) { - - // }) - // .done(function() { - // console.log( "second success" ); - // }) - // .fail(function(error) { - // console.log(error); - // console.log( "error" ); - // }); - return false; }); } \ No newline at end of file diff --git a/wagtailembedder/templates/wagtailembedder/snippets/types_list.js b/wagtailembedder/templates/wagtailembedder/snippets/types_list.js index bb54041..77fcabd 100644 --- a/wagtailembedder/templates/wagtailembedder/snippets/types_list.js +++ b/wagtailembedder/templates/wagtailembedder/snippets/types_list.js @@ -2,17 +2,6 @@ function(modal) { $('div.snippet-list h2 a.snippet-embedder').click(function(event){ event.preventDefault(); modal.loadUrl(this.href); - // $.get($(this).attr('href'), function(response) { - - // }) - // .done(function() { - // console.log( "second success" ); - // }) - // .fail(function(error) { - // console.log(error); - // console.log( "error" ); - // }); - return false; }); } \ No newline at end of file diff --git a/wagtailembedder/views/chooser.py b/wagtailembedder/views/chooser.py index cd3976d..a2cab67 100644 --- a/wagtailembedder/views/chooser.py +++ b/wagtailembedder/views/chooser.py @@ -14,12 +14,10 @@ @permission_required('wagtailadmin.access_admin') def index(request): - snippet_types = [ - ( - get_snippet_type_name(content_type)[1], - get_snippet_type_description(content_type), - content_type - ) + snippet_types = [( + get_snippet_type_name(content_type)[1], + get_snippet_type_description(content_type), + content_type) for content_type in get_snippet_content_types() if user_can_edit_snippet_type(request.user, content_type) ] @@ -41,6 +39,7 @@ def index_objects(request, content_type_app_name, content_type_model_name): model = content_type.model_class() items = model.objects.all() snippet_type_name, snippet_type_name_plural = get_snippet_type_name(content_type) + return render_modal_workflow( request, 'wagtailembedder/snippets/type_index.html', @@ -62,14 +61,19 @@ def choose_snippet(request, id, content_type_app_name, content_type_model_name): raise PermissionDenied model = content_type.model_class() try: - instance = model.objects.get(id=id) + model.objects.get(id=id) except ObjectDoesNotExist: return render_modal_workflow( - request, None, None, + request, + None, + None, {'error': 'Sorry, an error occurred. Contact support or try again later.'} ) embed_html = embed_to_editor_html(id, content_type_app_name, content_type_model_name) + return render_modal_workflow( - request, None, 'wagtailembedder/editor/snippet_chosen.js', + request, + None, + 'wagtailembedder/editor/snippet_chosen.js', {'embed_html': embed_html} ) diff --git a/wagtailembedder/wagtail_hooks.py b/wagtailembedder/wagtail_hooks.py index 3aff237..62f5827 100644 --- a/wagtailembedder/wagtail_hooks.py +++ b/wagtailembedder/wagtail_hooks.py @@ -18,7 +18,7 @@ def register_admin_urls(): @hooks.register('insert_editor_js') def editor_js(): """ - Add extra JS files to the admin + Add extra JS files to the admin to register the plugin and set the reversed URL in JS vars """ js_files = [ 'wagtailembedder/js/hallo-embedder.js', @@ -38,4 +38,7 @@ def editor_js(): @hooks.register('before_serve_page') def add_handler(page, request, serve_args, serve_kwargs): + """ + Call add_embed_handler() to set a custom handler for embedded snippets + """ add_embed_handler()