Fixes metric CRUD in data-ui.
authorDavid Schoonover <dsc@wikimedia.org>
Tue, 22 May 2012 15:52:56 +0000 (08:52 -0700)
committerDavid Schoonover <dsc@wikimedia.org>
Tue, 22 May 2012 15:52:56 +0000 (08:52 -0700)
28 files changed:
lib/base/base-view.co
lib/chart/chart-option-view.co
lib/chart/chart-type.co
lib/chart/dygraphs.co
lib/chart/type/d3-bar.co [new file with mode: 0644]
lib/chart/type/d3-geo.co [new file with mode: 0644]
lib/chart/type/d3-line.co [new file with mode: 0644]
lib/chart/type/index.co [new file with mode: 0644]
lib/dataset/data-view.co
lib/dataset/dataset-model.co
lib/dataset/dataset-view.co
lib/dataset/datasource-model.co
lib/dataset/datasource-ui-view.co
lib/dataset/metric-edit-view.co
lib/dataset/metric-model.co
lib/graph/graph-edit-view.co
lib/graph/graph-list-view.co
lib/graph/graph-model.co
lib/main-display.co
lib/main-edit.co
lib/scaffold/scaffold-view.co
lib/template/dataset-metric.jade
lib/template/dataset.jade
lib/template/datasource-ui.jade
lib/template/datasource.jade
lib/util/backbone.co
lib/util/formatters.co [new file with mode: 0644]
lib/util/underscore/object.co

index a8d3ec9..16fcd57 100644 (file)
@@ -111,7 +111,7 @@ BaseView = exports.BaseView = Backbone.View.extend mixinBase do # {{{
     
     removeAllSubviews: ->
         @subviews.forEach @removeSubview, this
-        @subviews = new ViewList
+        # @subviews = new ViewList
         this
     
     
@@ -232,12 +232,12 @@ BaseView = exports.BaseView = Backbone.View.extend mixinBase do # {{{
     
     /* * * *  Events  * * * */
     
-    bubbleEvent: (evt) ->
+    bubbleEventDown: (evt) ->
         @invokeSubviews 'trigger', ...arguments
         this
     
-    redispatch: (evt) ->
-        @trigger ...arguments
+    redispatch: (evt, ...args) ->
+        @trigger evt, this, ...args
         this
     
     onlyOnReturn: (fn, ...args) ->
index 5a6f84f..1fde054 100644 (file)
@@ -43,7 +43,8 @@ ChartOptionView = exports.ChartOptionView = BaseView.extend do # {{{
         json = ChartOptionView.__super__.toTemplateLocals ...
         json.id or= _.camelize json.name
         json.value ?= ''
-        json.value = JSON.stringify v if v = json.value and (_.isArray(v) or _.isPlainObject(v))
+        v = json.value
+        json.value = JSON.stringify(v) if v and ( _.isArray(v) or _.isPlainObject(v) )
         json
     
     /**
index 68357c2..aea28cd 100644 (file)
@@ -70,7 +70,7 @@ class exports.ChartType extends ReadyEmitter
      * @type String
      * @readonly
      */
-    CHART_SPEC_URL : null
+    SPEC_URL : null
     
     /**
      * Chart-type name.
@@ -160,8 +160,9 @@ class exports.ChartType extends ReadyEmitter
         return this if @ready
         proto = @constructor::
         jQuery.ajax do
-            url     : @CHART_SPEC_URL
+            url     : @SPEC_URL
             success : (spec) ~>
+                proto.spec = spec
                 proto.options_ordered = spec
                 proto.options = _.synthesize spec, -> [it.name, it]
                 proto.ready = true
@@ -351,6 +352,7 @@ class exports.ChartType extends ReadyEmitter
         data       = @getData()
         options    = @getDefaultOptions() import @transform @model, @view
         viewport   = @getElementsForRole 'viewport'
+        return @lastChart unless data?.length and viewport?.length
         @lastChart = @renderChart data, viewport, options, @chart
     
     
index dd95a64..49c3f86 100644 (file)
@@ -5,7 +5,9 @@ _ = require 'kraken/util/underscore'
 
 class exports.DygraphsChartType extends ChartType
     __bind__ : <[ dygNumberFormatter dygNumberFormatterHTML ]>
-    CHART_SPEC_URL : '/schema/dygraph.json'
+    SPEC_URL : '/schema/dygraph.json'
+    
+    # NOTE: ChartType.register() must come AFTER `typeName` declaration.
     typeName : 'dygraphs'
     ChartType.register this
     
@@ -93,6 +95,9 @@ class exports.DygraphsChartType extends ChartType
         { width, height }
     
     
+    /**
+     * Resizes the HTML viewport.
+     */
     resizeViewport: ->
         size = @determineSize()
         @getElementsForRole 'viewport' .css size
diff --git a/lib/chart/type/d3-bar.co b/lib/chart/type/d3-bar.co
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/chart/type/d3-geo.co b/lib/chart/type/d3-geo.co
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/chart/type/d3-line.co b/lib/chart/type/d3-line.co
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/chart/type/index.co b/lib/chart/type/index.co
new file mode 100644 (file)
index 0000000..e69de29
index b947e9a..7201d84 100644 (file)
@@ -40,7 +40,7 @@ DataView = exports.DataView = BaseView.extend do # {{{
         @model.once 'ready',    @onReady,       this
     
     onReady: ->
-        console.log "#this.onReady! #{@model.metrics}"
+        # console.log "#this.onReady! #{@model.metrics}"
         dataset = @model
         @model.metrics.each @addMetric, this
         @dataset_view = new DataSetView {@model, @graph_id, dataset, @datasources}
@@ -81,7 +81,7 @@ DataView = exports.DataView = BaseView.extend do # {{{
         { @graph_id, @datasources } import attrs
     
     addMetric: (metric) ->
-        console.log "#this.addMetric!", metric
+        # console.log "#this.addMetric!", metric
         return metric if @metric_views.findByModel metric
         view = new MetricEditView {model:metric, @graph_id, dataset:@model, @datasources}
             .on 'metric-update', @onUpdateMetric, this
@@ -91,7 +91,7 @@ DataView = exports.DataView = BaseView.extend do # {{{
         metric
     
     removeMetric: (metric) ->
-        console.log "#this.removeMetric!", metric
+        # console.log "#this.removeMetric!", metric
         return unless view = @metric_views.findByModel metric
         @metric_views.remove view
         @removeSubview view
@@ -114,7 +114,7 @@ DataView = exports.DataView = BaseView.extend do # {{{
         @$el.css 'min-height', newMinHeight
     
     onUpdateMetric: ->
-        console.log "#this.onUpdateMetric!"
+        # console.log "#this.onUpdateMetric!"
         @trigger 'metric-change', @model, this
         @render()
     
index c797e44..dfe8aa9 100644 (file)
@@ -42,6 +42,8 @@ DataSet = exports.DataSet = BaseModel.extend do # {{{
         BaseModel::initialize ...
         @set 'metrics', @metrics, {+silent}
         @on 'change:metrics', @onMetricChange, this
+        # @metrics.on 'add remove reset', ~>
+        #     @trigger 'change:metrics', @metrics, this
     
     
     load: (opts={}) ->
@@ -51,17 +53,15 @@ DataSet = exports.DataSet = BaseModel.extend do # {{{
         unless @metrics.length
             return @triggerReady()
         
-        console.log "#this.load()..."
+        # console.log "#this.load()..."
         @wait()
         @loading = true
         @trigger 'load', this
         Seq @metrics.models
             .parEach_ (next, metric) ->
                 metric.once 'ready', next.ok .load()
-            # .parEach_ (next, metric) ->
-            #     metric.on 'load-data-success', next.ok .loadData()
             .seq ~>
-                console.log "#{this}.load() complete!"
+                # console.log "#{this}.load() complete!"
                 @loading = false
                 @unwait() # terminates the `load` wait
                 @triggerReady()
@@ -107,7 +107,11 @@ DataSet = exports.DataSet = BaseModel.extend do # {{{
      */
     getData: ->
         return [] unless @ready
-        _.zip ...@getColumns()
+        columns = @getColumns()
+        if columns?.length
+            _.zip ...columns
+        else
+            []
     
     /**
      * @returns {Array<Array>} List of all columns (including date column).
@@ -149,13 +153,13 @@ DataSet = exports.DataSet = BaseModel.extend do # {{{
     newMetric: ->
         index = @metrics.length
         @metrics.add m = new Metric { index, color:ColorBrewer.Spectral[11][index] }
-        # @get 'metrics' .push m.attributes
+        m.on 'ready', ~> @trigger 'metric-data-loaded', this, m
         # @trigger 'change:metrics',  this, @metrics, 'metrics'
         # @trigger 'change',          this, @metrics, 'metrics'
         m
     
     onMetricChange: ->
-        console.log "#this.onMetricChange! ready=#{@ready}"
+        # console.log "#this.onMetricChange! ready=#{@ready}"
         @resetReady()
         @load()
     
index 34d7ff7..bc8189f 100644 (file)
@@ -13,8 +13,9 @@ DataSetView = exports.DataSetView = BaseView.extend do # {{{
     template  : require 'kraken/template/dataset'
     
     events:
-        'click .new-metric-button'       : 'newMetric'
-        'click .metrics .dataset-metric' : 'selectMetric'
+        'click  .new-metric-button'                     : 'onNewMetric'
+        'click  .delete-metric-button'                  : 'onDeleteMetric'
+        'click  .metrics .dataset-metric' : 'selectMetric'
     
     views_by_cid : {}
     active_view : null
@@ -32,30 +33,27 @@ DataSetView = exports.DataSetView = BaseView.extend do # {{{
         @model.metrics
             .on 'add',    @addMetric,         this
             .on 'remove', @removeMetric,      this
+            .on 'change', @onMetricChange,    this
             .on 'reset',  @addAllMetrics,     this
     
     
-    newMetric: ->
-        console.log "#this.newMetric!"
-        # triggers 'add' on @model.metrics
-        @model.newMetric()
-        false
-    
     addMetric: (metric) ->
-        console.log "#this.addMetric!", metric
+        # console.log "#this.addMetric!", metric
         if @views_by_cid[metric.cid]
             @removeSubview that
             delete @views_by_cid[metric.cid]
         
         view = @addSubview new DataSetMetricView {model:metric, @graph_id}
         @views_by_cid[metric.cid] = view
-        # @$ '.metrics' .append view.render().el
         @trigger 'add-metric', metric, view, this
         @render()
         view
     
     removeMetric: (metric) ->
-        console.log "#this.removeMetric!", metric
+        if metric instanceof [jQuery.Event, Event]
+            metric = @getMetricForElement metric.target
+        # console.log "#this.removeMetric!", metric
+        return unless metric
         if view = @views_by_cid[metric.cid]
             @removeSubview view
             delete @views_by_cid[metric.cid]
@@ -63,24 +61,46 @@ DataSetView = exports.DataSetView = BaseView.extend do # {{{
         view
     
     addAllMetrics: ->
-        console.log "#this.addAllMetrics! --> #{@model.metrics}"
+ &n