Rolling
[mkws-moved-to-github.git] / doc / mkws-developer.txt
index ec3ab7e..34e5532 100644 (file)
@@ -1,12 +1,15 @@
+INTRODUCTION
+============
+
 Development with MKWS consists primarily of defining new types of
 widgets. These can interact with the core functionality is several
 defined ways.
 
-You cleare a new widget ttpe this by calling the
-mkws.registerWidgetType function, passing in the widget name and a
-function. The name is used to recognise HTML elements as being widgets
-of this type -- for example, if you register a "Foo" widget, elements
-like <div class="mkwsFoo"> will be widgets of this type.
+You create a new widget type by calling the mkws.registerWidgetType
+function, passing in the widget name and a function. The name is used
+to recognise HTML elements as being widgets of this type -- for
+example, if you register a "Foo" widget, elements like <div
+class="mkwsFoo"> will be widgets of this type.
 
 The function promotes a bare widget object (passed as `this') into a
 widget of the appropriate type. MKWS doesn't use classes or explicit
@@ -43,3 +46,83 @@ This simple widget illustrates several important points:
   which is called whenever the event is published. The arguments to
   the function are different for different events.
 
+* The value of `this' is lost inside the subscribe callback, so it
+  must be saved if it's to be used inside that callback (typically as
+  a local variable named `that').
+
+
+SPECIALISATION (INHERITANCE)
+============================
+
+Many widgets are simple specialisations of existing widgets. For
+example, the "Record" widget is the same as the "Records" widget
+except that it defaults to displaying a single record. It's defined as
+follows:
+
+       mkws.registerWidgetType('Record', function() {
+           mkws.promotionFunction('Records').call(this);
+           if (!this.config.maxrecs) this.config.maxrecs = 1;
+       });
+
+Remember that when a promotion function is called, it's passed a base
+widget object that's not specialised for any particular task. To make
+a specialised widget, first promote that base widget into the type
+that you want to specialise from -- in this case, "Records" -- using
+the promotion function that's been registered for that type.
+
+Once this has been done, the specialisations can be introduced. In
+this case, it's a very matter of changing the "maxrecs" configuration
+setting to 1 unless it's already been given an explicit value. (That
+would occur if the HTML used an element like <div class="mkwsRecord"
+maxrecs="2">, though it's not obvious why anyone would do that.)
+
+
+WIDGET PROPERTIES AND METHODS
+=============================
+
+this.type -- a string containing the type of the widget.
+
+this.team -- the team object to which this widget belongs. The team
+       has several additional important properties and methods,
+       described below.
+
+this.node -- the DOM element of the widget
+
+this.config -- a table of configuration values for the widget. This
+       table inherits missing values from the team's configuration,
+       which in turn inherits from the top-level MKWS configuration,
+       which inherits from the default configuration. Instances of
+       widgets in HTML can set configuration items as HTML
+       attributes, as in <div class="mkwsRecords" maxrecs="2">.
+
+this.toString() -- a function returning a string that briefly names
+       this widget. Can be useful in logging.
+
+this.log(string) -- a function to log a string for debugging
+       purposes. The string is written on the browser console, and
+       also published to any "log" subcribers.
+
+
+TEAM PROPERTIES AND METHODS
+===========================
+
+team.queue
+team.name
+team.targetFiltered(data[i].id)
+team.config()
+team.log()
+team.newSearch(query, sortOrder, maxrecs, perpage, limit, targets, targetfilter);
+team.totalRecordCount()
+team.perpage()
+team.currentPage();
+team.recordElementId(hit.recid[0])
+team.currentRecordId()
+team.currentRecordData()
+team.renderDetails()
+team.loadTemplate()
+team.filters()
+team.set_sortOrder()
+team.submitted()
+team.resetPage()
+team.reShow()
+team.set_perpage()