--- /dev/null
+*.pyc
+*.swp
+mkwsxb_xblock.egg-info/
--- /dev/null
+from .mkwsxb import MKWSXB
\ No newline at end of file
--- /dev/null
+"""Embed widgets from MKWS, the MasterKey Widget Set"""
+
+import pkg_resources
+
+from xblock.core import XBlock
+from xblock.fields import Integer, Scope, String, Any, Boolean, Dict
+from xblock.fragment import Fragment
+
+class MKWSXB(XBlock):
+ """Embed widgets from MKWS, the MasterKey Widget Set"""
+
+ # Fields
+ query = String(
+ help="Search query",
+ default="water",
+ scope=Scope.content
+ )
+
+ def resource_string(self, path):
+ """Helper for accessing resources."""
+ data = pkg_resources.resource_string(__name__, path)
+ return data.decode("utf8")
+
+ def student_view(self, context=None):
+ """The primary view of the MKWS XBlock, shown to students when viewing courses."""
+ html = self.resource_string("static/html/mkwsxb.html")
+ frag = Fragment(html.format(query=self.query))
+ frag.add_javascript_url("//mkws.indexdata.com/mkws-complete.js")
+ frag.add_javascript_url("//example.indexdata.com/mkws-widget-ru.js")
+ frag.add_css(self.resource_string("static/css/mkws-widget-ru.css"))
+ frag.add_javascript(self.resource_string("static/js/src/mkwsxb.js"))
+ frag.initialize_js('MKWSXB')
+ return frag;
+
+ def studio_view(self, context=None):
+ """Studio configuration view."""
+ html = self.resource_string("static/html/settings.html")
+ frag = Fragment(html.format(query=self.query))
+ frag.add_javascript(self.resource_string("static/js/settings.js"))
+ frag.initialize_js('MKWSXBSettings')
+ return frag
+
+ @XBlock.json_handler
+ def update_settings(self, data, suffix=''):
+ """Studio configuration callback."""
+ self.query = data['query']
+ return {"result": "success"}
+
+ @staticmethod
+ def workbench_scenarios():
+ """A canned scenario for display in the workbench."""
+ return [
+ ("MKWSXB",
+ """<vertical_demo>
+ <mkwsxb/>
+ </vertical_demo>
+ """),
+ ]
--- /dev/null
+.mkwsReferenceUniverse {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ background: #FCFBFA;
+ padding: 0.5em 1em 0.25em;
+ box-shadow: 0 0 2px 0 #7F8F93;
+ border-radius: 0 0 1.5em;
+ -moz-border-radius: 0 0 1.5em;
+ -webkit-border-radius: 0 0 1.5em;
+ line-height: 1.4;
+ color: #86979B;
+ background: radial-gradient(ellipse at center, #ffffff 0%,#f8f8f8 100%);
+}
+
+.mkwsReferenceUniverse h2 {
+ font-size: 100%;
+ color: #4A5456;
+ padding-bottom: .5em;
+}
+
+.mkwsReferenceUniverse ul {
+ margin: 0;
+ padding: 0;
+}
+
+.mkwsReferenceUniverse li {
+ margin: .95em .25em;
+ padding-top: .75em;
+ border-top: 1px dotted #BEC8CC;
+ font-size: 90%;
+ list-style: none;
+}
+
+.mkwsReferenceUniverse a {
+ text-decoration: none;
+ font-weight:bold;
+ color: #2B77AF;
+}
--- /dev/null
+<div class="mkwsxb_block">
+ <div class="mkwsReferenceUniverse" autosearch="{query}">Searching Reference Universe...</div>
+</div>
--- /dev/null
+<div class="wrapper-comp-settings is-active editor-with-buttons" id="settings-tab">
+ <ul class="list-input settings-list">
+ <li class="field comp-setting-entry is-set">
+ <div class="wrapper-comp-setting">
+ <label class="label setting-label" for="query">Query</label>
+ <input class="input setting-input" name="query" id="query" value="{query}" type="text" />
+ </div>
+ <span class="tip setting-help">Search query to run when the block loads</span>
+ </li>
+ </ul>
+ <div class="xblock-actions">
+ <ul>
+ <li class="action-item">
+ <a href="#" class="button action-primary save-button">Save</a>
+ </li>
+ <li class="action-item">
+ <a href="#" class="button cancel-button">Cancel</a>
+ </li>
+ </ul>
+ </div>
+</div>
--- /dev/null
+/* Javascript for MKWSXB. */
+function MKWSXB(runtime, element) {
+ $(function ($) {
+ mkws.init();
+ });
+}
--- /dev/null
+function MKWSXBSettings(runtime, element) {
+ $(element).find('.save-button').bind('click', function() {
+ var handlerUrl = runtime.handlerUrl(element, 'update_settings');
+ var data = {
+ query: $(element).find('input[name=query]').val()
+ };
+ console.log($(element).find('input[query]'));
+ $.post(handlerUrl, JSON.stringify(data)).done(function(response) {
+ window.location.reload(false);
+ });
+ });
+
+ $(element).find('.cancel-button').bind('click', function() {
+ runtime.notify('cancel', {});
+ });
+};
--- /dev/null
+"""Setup for mkwsxb XBlock."""
+
+import os
+from setuptools import setup
+
+
+def package_data(pkg, root):
+ """Generic function to find package_data for `pkg` under `root`."""
+ data = []
+ for dirname, _, files in os.walk(os.path.join(pkg, root)):
+ for fname in files:
+ data.append(os.path.relpath(os.path.join(dirname, fname), pkg))
+
+ return {pkg: data}
+
+
+setup(
+ name='mkwsxb-xblock',
+ version='0.1',
+ description='XBlock to embed MKWS widgets.',
+ packages=[
+ 'mkwsxb',
+ ],
+ install_requires=[
+ 'XBlock',
+ ],
+ entry_points={
+ 'xblock.v1': [
+ 'mkwsxb = mkwsxb:MKWSXB',
+ ]
+ },
+ package_data=package_data("mkwsxb", "static"),
+)