Blockly Editor

Last modified by Admin on 2022/02/21 00:26

cogAdds a new document template based on Google Blockly
TypeXAR
CategoryApplication
Developed by

Vivek Iyer

Active Installs2
Rating
0 Votes
LicenseGNU Lesser General Public License 2.1
Compatibility

9.11.7

Installable with the Extension Manager

Description

This extension adds the Google Blockly Template to XWiki, to make programming easier for users who have little/no previous experience of programming, by allowing the creation of script using visual blocks. It supports generating scripting code.

This extension was created by Vivek Iyer as a project for GSoC 2018.

Usage

To create a document using the Blockly template, please follow the steps given below:

  1. Make sure you're logged in
  2. Click on create page at the top right corner, and choose the "Blockly" template in the create page document.

    CreateBlocklyTemplateDoc.png
    Selecting Blockly editor to edit the page

  3. This should take you to the Blockly template page. Drag and drop the blocks from the toolbox onto the adjacent div and combine them like puzzle pieces, as desired. For example:

    BlocksView.png
    Combining blocks appropriately

  4. To delete any of the blocks, drag and drop the blocks into the bin.
  5. To view the source code for the blocks generated in the figure, click on the Source tab.

    SourceView.png
    Source Code View

  6. Save the code using either the "Save and View", or the "Save and Continue" buttons.
  7. If you want to view the code you generated and/or execute it, go to the View Page. It looks like this:

    GenCodeView.png
    Viewing the Generated Code

  8. To run the code, click on "Run Code". Now after the code has been run, to view the original code again, click on "View Code".

    ExecCode.png
    The code executed

  9. In case you want to edit the page, click on the edit button once again and all the Blockly blocks are loaded as they should be emoticon_smile

Categories

There are two categories in the XML Toolbox, the default categories like logic, loops, variables, text, colour, lists etc which are there by default in the Blockly toolbox developed by Google, and the custom categories which have been added to meet XWiki-specific requirements and use cases, like queries, XWiki Bindings etc

Default Categories

The blockly documentation contains the documentation for the default categories such as logic (if-else), loops, variables, text, colour, lists etc

Custom Categories

The following custom categories have been introduced:

XWiki Bindings

XWiki Bindings.png

Text Block

  • A simple text input block, used to generate attribute/object names

XWiki Bindings Block

  • Defines the common XWiki Bindings, as defined here

XWiki Bindings Attribute Block

  • Used to access the attributes of the XWiki Bindings
  • Takes the XWiki binding as one input and the attribute name as the other text input
  • For the static XWiki Bindings, the block defined above can be input.
  • For dynamic XWiki Bindings, a variable can be created with the desired name, and that can become the input. 

XWiki Bindings Method Block

  • Used to call the methods of the XWiki Bindings
  • Takes the XWiki binding as one input and the method name as the other text input
  • The number of arguments to the method call is variable, and can be added/removed by clicking on the cog icon in the top left corner
  • For the static XWiki Bindings, the block defined above can be input.
  • For dynamic XWiki Bindings, a variable can be created with the desired name, and that can become the input. 

Queries

Queries.png
This category contains the following blocks:

Execute Block

  • Takes the query string/variable as input
  • Outputs $services.query.xwql(query).execute()

Select, From, Where Block

  • This is the main block that generates the query, and it has SELECT, FROM and WHERE clauses each of which takes arguments as input. These arguments can be constructed using the other blocks on this category.
  • The "SELECT" input block takes a list of attributes while "FROM" takes a list of objects to be selected "from" as input.
  • Where takes a boolean expression as input, which can be constructed using the AND/OR blocks and the comparison blocks, described below.
    SFWBlock.png

Arguments Block

  • Takes variable number of arguments as input, and the arguments can be added/removed by clicking the cog on the top left corner
  • Returns comma separated list of the arguments provided, which can be input to either the "SELECT" or the "FROM" input blocks.
      

Get XObject Block

  • Returns the specified XObject in the current document 
  • The input is the XWiki Class Name (for example to get get the XObject of class XWiki.XWikiUsers, the inputs in the two text fields will be XWiki and XWikiUsers. The code output for this example would be doc.object(XWiki.XWikiUsers)
    GetClass.png

Get Object Property Block

  • Returns the properties/attributes of an object
  • The first input field takes the object as input, and the second input field is a text input which takes the attribute name as input.
  • For example, to get attribute space.name, we do:
    GetAttrib.png

As Block

  • This provides the AS keyword
  • It takes the value to be aliased as one input, and the alias itself as another text input. The checkbox is used to indicate whether the word "as" itself should be added or not, since specifically mentioning "as" is optional in XWQL.
  • For example, keeping the checkbox checked and aliasing XWikiSpace as space, the code generated would be XWikiSpace as space but on unchecking it, the code generated is simply XWikiSpace space

AND/OR Block

  • This block takes as input two boolean returning blocks, and returns the "AND" or "OR" of these expressions.
  • By default the boolean expression in input is false.
  • It is also possible to chain "AND"/"OR" expressions by giving another AND/OR block as input to the first block.

Comparison Operators Block

  • This block takes as input two expressions, and returns an expression with the two values joined by an operator.
  • The operators can be chosen from the dropdown menu and are one among "=", "≠", ">", "<", "≥", "≤" etc
  • It is possible to chain these expressions too, similar to the AND/OR block.

Like Block

  • This block provides the LIKE keyword
  • Selecting the checkbox on either side adds a "%" on either side to the text input given in the textbook
  • This is given as input to the AND/OR block  

Order by Block

  • This block provides the Order by keyword
  • The ascending/descending order can be chosen from the menu and it takes the XWiki property to be ordered as input.
  • Again this is given as input to the AND/OR block  

Not Block

  • The NOT operator is used to negate the predicate that follows it. 

Distinct Block

  • Returns only distinct, not duplicate, results
  • Takes an object attribute as input 

How to use Blockly template to code some common Scripting Actions

This section demonstrates how to code the common scripting actions given here, using the Blockly Template Extension.

Create a new Document

#set ($newDoc = $xwiki.getDocument('MySpace.MyPage'))
#set ($discard = $newDoc.setContent("new content"))
#set ($discard = $newDoc.save("some comment explaining the save", true))

The above snippet can be used to create a new document and can be coded using Blockly as shown below.
CreateDoc.png

Accessing the request

$request.action

The above snippet can be used to access the action parameter in request and can be coded using Blockly as shown below.
GetAction.png

Add objects to a page

#set($obj = $doc.newObject("XWiki.SomeClass"))
$obj.set("field1",$value1)
$obj.set("field2",$value2)
$doc.save()

The above snippet can be used to access the action parameter in request and can be coded using Blockly as shown below.
AddObjects.png

Redirecting to another page

$response.sendRedirect($xwiki.getURL("Space.Page"))

The above snippet can be used to redirect the user to another page and can be coded using Blockly as shown below.
RedirectURL.png

Add an Attachment to a page

$response.sendRedirect($xwiki.getURL("Space.Page"))

The above snippet can be used to redirect the user to another page and can be coded using Blockly as shown below.
RedirectURL.png

Create an XClass

#set ($mydoc = $xwiki.getDocument('Sandbox.TestClass'))
#set ($myinternaldoc = $mydoc.getDocument())
#set ($myclass = $myinternaldoc.getXClass())
#set ($discard = $myclass.addTextAreaField("mytextarea", "My Text Area", 100, 5))
#set ($discard = $mydoc.save('created doc + xclass'))

The above snippet can be used to create an XClass and can be coded using Blockly as shown below.
CreateXClass.png

Modify the last update date

#set ($mydoc = $xwiki.getDocument('Sandbox.WebHome'))
#set ($date = $datetool.toDate('yyyy-MM-dd', '2013-01-01'))
#set ($mydocinternal = $mydoc.getDocument())
#set ($discard = $mydocinternal.setDate($date))
#set ($discard = $mydocinternal.setMetaDataDirty(false))
#set ($discard = $mydocinternal.setContentDirty(false))
$xwiki.getXWiki().saveDocument($mydocinternal, "change update date", true, $xcontext.getContext())

The above snippet can be used to modify the last update date and can be coded using Blockly as shown below.
ModifyUpdateDate.png

Features

  • A toolbox containing the default categories for loops, logic statements, variables, macros, math, text etc and the customly added categories for XWiki Script bindings and XWQL queries. (Check Categories section given above for more detail)
    BlocklyToolbox.png
    The Blockly toolbox
  • A bin for deleting unnecessary blocks, and features for creating duplicate blocks, adding comments etc by right-clicking on a block
    RightClickBlocklyMenu.png
    Right clicking on Blockly blocks generates this menu
  • Converting, saving and later running the generated Velocity code
  • Running the generated Velocity code in the XWiki context

(For screenshots and more information on how to use these features, please check the Usage section given above emoticon_smile)

Sources

Future

Refer to the issues page and the Blockly design page for further details.

Prerequisites & Installation Instructions

We recommend using the Extension Manager to install this extension (Make sure that the text "Installable with the Extension Manager" is displayed at the top right location on this page to know if this extension can be installed with the Extension Manager). Note that installing Extensions when being offline is currently not supported and you'd need to use some complex manual method.

You can also use the following manual method, which is useful if this extension cannot be installed with the Extension Manager or if you're using an old version of XWiki that doesn't have the Extension Manager:

  1. Log in the wiki with a user having Administration rights
  2. Go to the Administration page and select the Import category
  3. Follow the on-screen instructions to upload the downloaded XAR
  4. Click on the uploaded XAR and follow the instructions
  5. You'll also need to install all dependent Extensions that are not already installed in your wiki

Dependencies

Dependencies for this extension (org.xwiki.contrib:application-blockly-ui 0.9):

Get Connected