diff --git a/_includes/data.js b/_includes/data.js
index 44015ffd..57065512 100644
--- a/_includes/data.js
+++ b/_includes/data.js
@@ -1,9 +1,9 @@
var data = [
- {id: 0, date: '2011-01-01', x: 1, y: 2, z: 3, country: 'DE', label: 'first', lat:52.56, lon:13.40},
- {id: 1, date: '2011-02-02', x: 2, y: 4, z: 24, country: 'UK', label: 'second', lat:54.97, lon:-1.60},
- {id: 2, date: '2011-03-03', x: 3, y: 6, z: 9, country: 'US', label: 'third', lat:40.00, lon:-75.5},
- {id: 3, date: '2011-04-04', x: 4, y: 8, z: 6, country: 'UK', label: 'fourth', lat:57.27, lon:-6.20},
- {id: 4, date: '2011-05-04', x: 5, y: 10, z: 15, country: 'UK', label: 'fifth', lat:51.58, lon:0},
- {id: 5, date: '2011-06-02', x: 6, y: 12, z: 18, country: 'DE', label: 'sixth', lat:51.04, lon:7.9}
+ {id: 0, date: '2011-01-01', x: 1, y: 2, z: 3, country: 'DE', geo: {lat:52.56, lon:13.40} },
+ {id: 1, date: '2011-02-02', x: 2, y: 4, z: 24, country: 'UK', geo: {lat:54.97, lon:-1.60}},
+ {id: 2, date: '2011-03-03', x: 3, y: 6, z: 9, country: 'US', geo: {lat:40.00, lon:-75.5}},
+ {id: 3, date: '2011-04-04', x: 4, y: 8, z: 6, country: 'UK', geo: {lat:57.27, lon:-6.20}},
+ {id: 4, date: '2011-05-04', x: 5, y: 10, z: 15, country: 'UK', geo: {lat:51.58, lon:0}},
+ {id: 5, date: '2011-06-02', x: 6, y: 12, z: 18, country: 'DE', geo: {lat:51.04, lon:7.9}}
];
diff --git a/_includes/example-backends-gdocs.js b/_includes/example-backends-gdocs.js
index 72fa38fd..555d6a2c 100644
--- a/_includes/example-backends-gdocs.js
+++ b/_includes/example-backends-gdocs.js
@@ -1,10 +1,8 @@
// Create a dataset with a Google Docs backend and a url to the Google Doc
var dataset = new recline.Model.Dataset({
- url: 'https://docs.google.com/spreadsheet/ccc?key=0Aon3JiuouxLUdGZPaUZsMjBxeGhfOWRlWm85MmV0UUE#gid=0'
- },
- // backend name or instance
- 'gdocs'
-);
+ url: 'https://docs.google.com/spreadsheet/ccc?key=0Aon3JiuouxLUdGZPaUZsMjBxeGhfOWRlWm85MmV0UUE#gid=0',
+ backend: 'gdocs'
+});
// Optional - display the results in a grid
// Note how we can set this up before any data has arrived
@@ -15,14 +13,9 @@ var grid = new recline.View.Grid({
$('#my-gdocs').append(grid.el);
// Now do the query to the backend to load data
-dataset.fetch().done(function() {
- dataset.query().done(function(data) {
- // The grid will update automatically
- // Log some data as an example
- if (console) {
- console.log(data);
- console.log(dataset.currentDocuments);
- }
- });
+dataset.fetch().done(function(dataset) {
+ if (console) {
+ console.log(dataset.currentDocuments);
+ }
});
diff --git a/_includes/tutorial-basics-ex-1.js b/_includes/tutorial-basics-ex-1.js
new file mode 100644
index 00000000..067a1f1b
--- /dev/null
+++ b/_includes/tutorial-basics-ex-1.js
@@ -0,0 +1,24 @@
+// (for convenience) assume availability of jquery
+// must have div with class="ex-1"
+var $el = $('.ex-1');
+
+// we will define this function display so we can reuse it below!
+function display(dataset) {
+ // total number of records resulting from latest query
+ $el.append('Total found: ' + dataset.recordCount + '
');
+ $el.append('Total returned: ' + dataset.currentRecords.length);
+
+ $el.append('
');
+
+ // dataset.currentRecords is a Backbone Collection of Records that resulted from latest query (hence "current")
+ // Get the first record in the list - it returns an instance of the Record object
+ var record = dataset.currentRecords.at(0);
+
+ // Use the summary helper method which produces proper html
+ // You could also do record.toJSON() to get a hash of the record data
+ $el.append(dataset.recordSummary(record));
+}
+
+// now display our existing dataset ...
+display(dataset);
+
diff --git a/_includes/tutorial-basics-ex-2.js b/_includes/tutorial-basics-ex-2.js
new file mode 100644
index 00000000..79b937ae
--- /dev/null
+++ b/_includes/tutorial-basics-ex-2.js
@@ -0,0 +1,13 @@
+// must have a div with class="ex-1"
+var $el = $('.ex-2');
+
+// query with text 'UK' - this will attempt to match any field for UK
+// Also limit the query to return a maximum of 2 results using the size attribute
+
+// query function has asynchronous behaviour and returns a promise object
+// (even for the case of in memory data where querying in fact happens synchronously)
+// On completion the display function will be called
+dataset.query({q: 'UK', size: 2}).done(function() {
+ display(dataset);
+});
+
diff --git a/_includes/tutorial-basics-ex-events.js b/_includes/tutorial-basics-ex-events.js
new file mode 100644
index 00000000..a9a78ebe
--- /dev/null
+++ b/_includes/tutorial-basics-ex-events.js
@@ -0,0 +1,13 @@
+function onChange() {
+ $('.ex-events').append('Queried: ' + dataset.queryState.get('q') + '. Records matching: ' + dataset.recordCount);
+ $('.ex-events').append('
');
+}
+
+dataset.currentRecords.bind('reset', onChange);
+
+dataset.query({q: 'DE'});
+dataset.query({q: 'UK'});
+dataset.query({q: 'US'});
+
+dataset.unbind('reset', onChange);
+
diff --git a/_includes/tutorial-basics-ex-fields-2.js b/_includes/tutorial-basics-ex-fields-2.js
new file mode 100644
index 00000000..0559abc8
--- /dev/null
+++ b/_includes/tutorial-basics-ex-fields-2.js
@@ -0,0 +1,10 @@
+var $el = $('.ex-fields-2');
+
+dataset.fields.models[6] = new recline.Model.Field({
+ id: 'geo',
+ label: 'Location',
+ type: 'geo_point'
+});
+var rec = dataset.currentRecords.at(0);
+$el.append(dataset.recordSummary(rec));
+
diff --git a/_includes/tutorial-basics-ex-fields.js b/_includes/tutorial-basics-ex-fields.js
new file mode 100644
index 00000000..d6cc38eb
--- /dev/null
+++ b/_includes/tutorial-basics-ex-fields.js
@@ -0,0 +1,20 @@
+var $el = $('.ex-fields');
+
+// Now list the Fields of this Dataset (these will have be automatically extracted from the data)
+$el.append('Fields: ');
+// Dataset.fields is a Backbone collection of Fields (i.e. record attributes)
+dataset.fields.each(function(field) {
+ $el.append(field.id + ' || ');
+});
+
+$el.append('
');
+
+// Show all field info
+var json = dataset.fields.toJSON();
+$el.append(
+ $('')
+ .append(
+ JSON.stringify(json, null, 2)
+ )
+);
+
diff --git a/docs/index.html b/docs/index.html
index 7f7f7ece..432e7b54 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -50,57 +50,21 @@ root: ../
likely be useful in understanding the details of these tutorials.
-
-
-
-
Customing Display and Import using Fields
-
-
-
-
-
Listening to events
-
-
-
-
-
Setting and Getting State
-
-
-
-
- Extending Recline
-
-
-
-
Create a new View
-
-
-
-
-
Create a new Backend
-
-
-
-
-
Create a Custom Record Object
-
-
diff --git a/docs/models.markdown b/docs/models.markdown
index 05ec1976..676dbcb2 100644
--- a/docs/models.markdown
+++ b/docs/models.markdown
@@ -21,7 +21,7 @@ holding summary information about a Field (or multiple Fields).
All the models are Backbone models, that is they extend Backbone.Model. Note,
however that they do not 'sync' (load/save) like normal Backbone models.
-## Dataset
+Dataset
A Dataset is *the* central object in Recline. Standard usage is:
@@ -159,7 +159,6 @@ field's value (if any) and the current record. It's signature and behaviour is
the same as for renderer.
-
Query
Query instances encapsulate a query to the backend (see Fields stored in the `fields` attribute. Fields provide information about the fields/columns in the Dataset, for example their id (key name in record), label, type etc.
+
+The Dataset's fields will be automatically computed from records or provided by the backend but they can also be explicitly provided and configured. Let's take a look at the fields on the dataset at present using the following code:
+
+{% highlight javascript %}
+{% include tutorial-basics-ex-fields.js %}
+{% endhighlight %}
+
+Running this results in the following:
+
+
+
+
+
+As can be seen all fields have the default type of 'string'. Let's change the geo field to have type geo\_point and see what affect that has on displaying of the dataset (for good measure we'll also set the label):
+
+{% highlight javascript %}
+{% include tutorial-basics-ex-fields-2.js %}
+{% endhighlight %}
+
+
+
+
+
+As can be seen the rendering of the field has changed. This is because the `recordSummary` method uses the Record.getFieldValue function which in turn renders a record field using the Field's renderer function. This function varies depending on the type and can also be customized (see the Field documentation).
+
+
+## Querying
+
+The basic thing we want to do with Datasets is query and filter them. This is very easy to do:
+
+{% highlight javascript %}
+{% include tutorial-basics-ex-2.js %}
+{% endhighlight %}
+
+This results in the following. Note how recordCount is now 3 (the total number of records matched by the query) but that currentRecords only contains 2 records as we restricted number of returned records using the size attribute.
+
+
+
+
+
+Full details of the query structure and its options can be found in the reference documentation.
+
+Also worth noting is that the last run query is stored as a Query instance in the `queryState` attribute of the Dataset object. Modifying `queryState` will also resulting in a query being run. This is useful when building views that want to display or manage the query state (see, for example, Query Editor or Filter Editor widgets).
+
+
+## Listening for Events
+
+Often you'll want to listen to events on Datasets and its associated objects rather than have to explicitly notify. This is easy to do thanks to the use of Backbone model objects which have a [standard set of events](http://backbonejs.org/#FAQ-events).
+
+Here's an example to illustrate:
+
+{% highlight javascript %}
+{% include tutorial-basics-ex-events.js %}
+{% endhighlight %}
+
+
+
+
+
+Here's a summary of the main objects and their events:
+
+* Dataset:
+
+ * Standard Backbone events for changes to attributes (note that this will **not** include changes to records)
+ * *query:start / query:end* called at start and completion of a query
+
+* Dataset.currentRecords: Backbone.Collection of "current" records (i.e. those resulting from latest query) with standard Backbone set of events: *add, reset, remove*
+
+* Dataset.queryState: queryState is a Query object with standard Backbone Model set of events
+
+* Dataset.fields: Backbone Collection of Fields.
+
diff --git a/docs/tutorial-views.markdown b/docs/tutorial-views.markdown
index 750bb065..7e22f018 100644
--- a/docs/tutorial-views.markdown
+++ b/docs/tutorial-views.markdown
@@ -17,7 +17,7 @@ root: ../
Before writing any code with Recline, you need to do the following preparation steps on your page:
-1. [Download ReclineJS](download.html) and relevant dependencies.
+1. [Download ReclineJS]({{page.root}}download.html) and relevant dependencies.
2. Include the relevant CSS in the head section of your document:
{% highlight html %}
@@ -34,7 +34,6 @@ Before writing any code with Recline, you need to do the following preparation s
diff --git a/download.markdown b/download.markdown
index fd8d381c..412715b5 100644
--- a/download.markdown
+++ b/download.markdown
@@ -9,9 +9,10 @@ title: Download
-Besides the library itself, the download package contains full source code,
-unit tests, files for debugging and a build system. The production files
-(included the same way as in the code above) are in the dist folder.
+Besides the library itself, the download package contains full source
+code, unit tests, external vendor libraries and documentation. The
+production files (included the same way as in the code above) are in the
+dist folder.
Download Recline v0.5 (master) (in-progress version)
diff --git a/src/model.js b/src/model.js
index 9453ce5c..1651559d 100644
--- a/src/model.js
+++ b/src/model.js
@@ -225,6 +225,8 @@ my.Dataset = Backbone.Model.extend({
return data;
},
+ // ### getFieldsSummary
+ //
// Get a summary for each field in the form of a `Facet`.
//
// @return null as this is async function. Provides deferred/promise interface.
@@ -250,6 +252,19 @@ my.Dataset = Backbone.Model.extend({
return dfd.promise();
},
+ // ### recordSummary
+ //
+ // Get a simple html summary of a Dataset record in form of key/value list
+ recordSummary: function(record) {
+ var html = '';
+ this.fields.each(function(field) {
+ if (field.id != 'id') {
+ html += '' + field.get('label') + ': ' + record.getFieldValue(field) + '
';
+ }
+ });
+ return html;
+ },
+
// ### _backendFromString(backendString)
//
// See backend argument to initialize for details
@@ -344,16 +359,6 @@ my.Record = Backbone.Model.extend({
return val;
},
- summary: function(fields) {
- var html = '';
- for (key in this.attributes) {
- if (key != 'id') {
- html += '' + key + ': '+ this.attributes[key] + '
';
- }
- }
- return html;
- },
-
// Override Backbone save, fetch and destroy so they do nothing
// Instead, Dataset object that created this Record should take care of
// handling these changes (discovery will occur via event notifications)