scheduled_resource 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,157 @@
1
+ 'use strict';
2
+
3
+ // ============================================================================
4
+ // Hi-lock: ((" ?[T]o ?Do:.*" (0 'accent10 t)))
5
+ // Hi-lock: (("\\(^\\|\\W\\)\\*\\(\\w.*\\w\\)\\*\\(\\W\\|$\\)" (2 'accent3 t)))
6
+ // Hi-lock: end
7
+ // ============================================================================
8
+
9
+ /* Controllers */
10
+
11
+ function ResourceListCtrl($scope, $http) {
12
+ $.extend( $scope,
13
+ {
14
+ init_display_parms: function () {
15
+ TimePix.set_display_parms()
16
+ },
17
+
18
+ init_resources: function () {
19
+ $scope.init_display_parms()
20
+
21
+ $scope.rsrcs = UseBlock.rsrcs = TimePix.meta.rsrcs
22
+ $scope.res_tags = []; // ^^ Defines the order of rows
23
+ $scope.rsrcs.forEach( function(rsrc) {
24
+ $scope.res_tags.push( rsrc.tag )
25
+ })
26
+ $scope.use_block_list_Ctls = {} // To access lower-level scopes later on
27
+
28
+ setTimeout( TimePix.scroll_to_tlo, 100 )
29
+ setTimeout( TimePix.set_time_cursor, 1000 )
30
+ setTimeout( TimePix.scroll_monitor, 100 )
31
+ },
32
+
33
+ get_data: function (t1, t2, inc) {
34
+ return $http.get( $scope.make_url(t1, t2, inc) ).
35
+
36
+ success( function(data) {
37
+ TimePix.merge_metadata(data)
38
+ delete data.meta
39
+ $scope.json_data = data // Park this here until we consume it.
40
+
41
+ if (! inc) { $scope.init_resources($scope) }
42
+ $scope.busy = false;
43
+ }). // success
44
+
45
+ error( function(data, status, headers, config) {
46
+ console.log( '\nstatus: ' + status +
47
+ '\nheaders(): ' + headers() +
48
+ '\nconfig: ' + config
49
+ )
50
+ console.debug( data.meta )
51
+ $scope.busy = false;
52
+ }) // error
53
+ },
54
+
55
+ make_url: function (t1, t2, inc) {
56
+ var url = '/schedule.json'
57
+ if (t1 || t2 || inc)
58
+ url += '?t1=' + t1 + '&t2=' + t2 + '&inc=' + inc
59
+ return url
60
+ },
61
+
62
+ rq_data: function(t1, t2, inc) {
63
+ if (! $scope.busy ) {
64
+ $scope.busy = true;
65
+ $scope.get_data( t1, t2, inc ).
66
+ success( function(data) {
67
+ Object.keys($scope.json_data).forEach( function(key) {
68
+ var controller = $scope.use_block_list_Ctls[key] // To Do: Better mis-configuration response
69
+ if( ! controller ) {
70
+ console.log( "No key " + key + " in " +
71
+ $scope.use_block_list_Ctls );
72
+ return
73
+ }
74
+ var blocks = $scope.json_data[key]
75
+ controller.add_blocks( controller, blocks ) // To Do: Better mis-configuration response
76
+ })
77
+
78
+ }); // errors handled above in get_data
79
+ }
80
+ },
81
+
82
+ more_data: function() {
83
+ $scope.rq_data( TimePix.thi, TimePix.next_hi(), 'hi' )
84
+ },
85
+
86
+ less_data: function() {
87
+ $scope.rq_data( TimePix.next_lo(), TimePix.tlo, 'lo' )
88
+ }
89
+ });
90
+ window.RsrcListCtrlScope = $scope;
91
+ $scope.get_data();
92
+ } // end ResourceListCtrl
93
+ ResourceListCtrl.$inject = ['$scope', '$http'];
94
+
95
+
96
+ function ab (o) { return angular.bind( o, o.process ) }
97
+
98
+ var process_fns = {
99
+ Station: ab(StationUseBlock),
100
+ ZTimeHeaderDay: ab(ZTimeHeaderDayUseBlock),
101
+ ZTimeHeaderHour: ab(ZTimeHeaderHourUseBlock)
102
+ }
103
+
104
+
105
+ function UseBlockListCtrl($scope) {
106
+
107
+ $.extend( $scope, {
108
+
109
+ add_blocks: function ( $scope, blocks ) {
110
+ var how = 'push'
111
+ if (TimePix.inc == 'lo') {
112
+ how = 'unshift'
113
+ blocks.reverse()
114
+ }
115
+ if( ! blocks ) { return } // Why bother with this?
116
+ blocks.forEach( function(block) {
117
+ $scope.insert_block( $scope.process_fn(block.blk), how )
118
+ })
119
+ },
120
+
121
+ insert_block: function ( block, how ) {
122
+ $scope.use_blocks[how]( block )
123
+ }
124
+ });
125
+
126
+
127
+ $scope.use_blocks = [];
128
+
129
+ var resourceTag = $scope.res_tag,
130
+ blocks = $scope.json_data[ resourceTag ],
131
+ rsrc_kind = resourceTag.split('_')[0];
132
+
133
+ $scope.process_fn = process_fns[rsrc_kind];
134
+ if (! $scope.process_fn) {
135
+ console.log( 'Skipping use blocks with tag ' + resourceTag + ', Kind ' + rsrc_kind )
136
+ return null
137
+ }
138
+
139
+ $scope.use_block_list_Ctls[resourceTag] = $scope
140
+
141
+ $scope.add_blocks( $scope, blocks )
142
+ }
143
+ UseBlockListCtrl.$inject = ['$scope'];
144
+
145
+
146
+ function UseBlockCtrl($scope) {
147
+ var block = $scope.block // Just for debugger
148
+ }
149
+ UseBlockCtrl.$inject = ['$scope'];
150
+
151
+
152
+ function LabelListCtrl($scope) {
153
+ var tag = $scope.res_tag
154
+ UseBlock.rsrcs[tag] // (?)
155
+ }
156
+ LabelListCtrl.$inject = ['$scope'];
157
+
@@ -0,0 +1,11 @@
1
+ // declare a module
2
+ var srAppModule = angular.module('srApp', []);
3
+
4
+ // Configure the module. Create some filters.
5
+ srAppModule.filter('style_geo', function() {
6
+ return angular.bind(TimePix, TimePix.style_geo);
7
+ });
8
+
9
+ srAppModule.filter('rowKind', function() {
10
+ return angular.bind(TimePix, TimePix.row_kind);
11
+ });
@@ -0,0 +1,70 @@
1
+ <!DOCTYPE html>
2
+ <html lang='en' ng-app='srApp'>
3
+ <head>
4
+ <title>Scheduled Resource Example <%= controller.action_name %></title>
5
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
6
+ <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+ <div class="container">
11
+
12
+ <%= yield %>
13
+
14
+ <!--Body content-->
15
+ <div class="row"> <!-- -fluid -->
16
+ <div id="schedule-container"
17
+ ng-controller="ResourceListCtrl">
18
+
19
+ <div id="labels-container">
20
+ <div id="resource-labels">
21
+ <div ng-controller="LabelListCtrl"
22
+ ng-repeat="rsrc in rsrcs"
23
+ class="rsrcRow {{ rsrc.tag | rowKind }}row">
24
+
25
+ <div class="rsrclabel">
26
+ <img ng-src="/assets/{{ rsrc.label }}.jpg" title="{{ rsrc.title }}" />
27
+ <div class="filter"> </div>
28
+ <div class="label-text">{{rsrc.label}}</div>
29
+ </div>
30
+
31
+ </div>
32
+ </div>
33
+ </div>
34
+
35
+ <div id="timespans-container">
36
+ <div id="scrolling-container">
37
+ <div id="positioned-container">
38
+ <div id="current-time-cursor"> </div>
39
+
40
+ <div ng-repeat="res_tag in res_tags"
41
+ ng-controller="UseBlockListCtrl"
42
+ class="rsrcRow {{ res_tag | rowKind }}row">
43
+
44
+ <div class="timespan">
45
+ <div ng-repeat="block in use_blocks"
46
+ ng-controller="UseBlockCtrl"
47
+ class="{{ block.css_classes }} blockdiv"
48
+ style="{{ block | style_geo }} ">
49
+
50
+ <div class="text_locator">
51
+ <a href="" ng-bind-html-unsafe="block.label"></a>
52
+ </div>
53
+
54
+ <!-- app/views/schedule/_block_internal.html.erb -->
55
+ </div>
56
+ </div>
57
+ </div>
58
+
59
+ </div>
60
+ </div>
61
+ </div>
62
+
63
+
64
+
65
+ </div> <!-- end ResourceListCtrl -->
66
+ </div>
67
+
68
+ </div>
69
+ </body>
70
+ </html>
@@ -0,0 +1,3 @@
1
+ <center><h2>
2
+ Angularjs-Rails Scheduled Resource Example <%= controller.controller_name %> <%= controller.action_name %>
3
+ </h2></center>
@@ -19,14 +19,14 @@
19
19
  // changes to the '.text_locator' with a little randomness thrown in.
20
20
 
21
21
  // ToDo: Convert this to an object w/ methods, for better encapsulation.
22
-
23
- // Sole exported function:
22
+
23
+ // Sole exported function:
24
24
  function filter_justify_tweaks(sc) {
25
25
  var scrollLeft = sc.scrollLeft()
26
26
 
27
27
  // Don't repeat the calculation unnecessarily....
28
28
  if ( filter_justify_tweaks.old_srcoll == scrollLeft ) return
29
- filter_justify_tweaks.old_srcoll = scrollLeft
29
+ filter_justify_tweaks.old_srcoll = scrollLeft
30
30
 
31
31
  do_justify_tweaks( sc, scrollLeft )
32
32
  }
@@ -8,7 +8,7 @@ class @TimePix # Ultimately, an angular $service
8
8
  @scroll_container().css( 'width', @pixWindow + 'px' )
9
9
  $('#scrollbar-hider').css('width', @pixWindow + 61 + 'px' )
10
10
 
11
-
11
+
12
12
  @baseTime: 0
13
13
  @timeWindow: (3 * 3600)
14
14
  @pixWindow: 750 # Matching width of #scrolling-container
@@ -42,7 +42,7 @@ class @TimePix # Ultimately, an angular $service
42
42
  @style_geo: (block) ->
43
43
  [s, e] = [block.starttime, block.endtime] # per margins V
44
44
  "left: #{@secs_to_pix_scale(s - @baseTime)}px; " +
45
- "width: #{@secs_to_pix_scale(e-s)-4}px;"
45
+ "width: #{@secs_to_pix_scale(e-s)-4}px;"
46
46
 
47
47
  @row_kind: (tag) -> # may/may not belong here.
48
48
  tag.split('_')[0]
@@ -67,7 +67,7 @@ class @TimePix # Ultimately, an angular $service
67
67
  @scroll_to_ux_time( @thi - @timeWindow )
68
68
 
69
69
  @ux_time_of_pix: (x) ->
70
- @pix_to_secs(x)
70
+ @pix_to_secs(x)
71
71
 
72
72
  @scroll_to_tlo: => # bound
73
73
  @scroll_to_ux_time @tlo
@@ -12,7 +12,7 @@ class @ZTimeHeaderDayUseBlock extends UseBlock
12
12
 
13
13
  @label: (block) ->
14
14
  block.label = block.title
15
-
15
+
16
16
  @css_classes: (block) ->
17
17
  # Could just as well come from server.
18
18
  classes = 'ZTimeHeaderDayRow '
@@ -30,7 +30,7 @@ class @ZTimeHeaderHourUseBlock extends UseBlock
30
30
 
31
31
  @label: (block) ->
32
32
  block.label = block.title
33
-
33
+
34
34
  @css_classes: (block) ->
35
35
  # Could just as well come from server.
36
36
  # classes = 'ZTimeHeaderHourRow '
@@ -42,7 +42,7 @@ class @ZTimeHeaderHourUseBlock extends UseBlock
42
42
 
43
43
 
44
44
 
45
- # Uses these fields of block: title, subtitle, category, category_type,
45
+ # Uses these fields of block: title, subtitle, category, category_type,
46
46
  # Sets these fields of block: label, css_classes
47
47
  class @StationUseBlock extends UseBlock
48
48
  constructor: -> nil
@@ -79,7 +79,7 @@ class @StationUseBlock extends UseBlock
79
79
  @css_class_search: (category) ->
80
80
  for key, regex of @categories
81
81
  return ('cat_' + key) if regex.test category
82
- 'cat_Unknown'
82
+ 'cat_Unknown'
83
83
 
84
84
 
85
85
  @memo: {}
@@ -20,7 +20,7 @@ require 'z_time_label_hour'
20
20
  # Example: A Room (resource) is scheduled for a meeting (resource use block)
21
21
  # titled "Weekly Staff Meeting" tomorrow from 9am to 11am.
22
22
  #
23
- # Class SchedResource manages class names, id's and labels for a
23
+ # Class ScheduledResource manages class names, id's and labels for a
24
24
  # schedule. An instance ties together:
25
25
  #
26
26
  # 1. A resource class (eg Room),
@@ -67,19 +67,19 @@ class ScheduledResource
67
67
 
68
68
  class_attribute :config
69
69
 
70
- # (SchedResource protocol) Returns a hash where each key is an
70
+ # (ScheduledResource protocol) Returns a hash where each key is an
71
71
  # <tt>rid</tt> and the value is an array of resource use
72
72
  # blocks in the interval <tt>t1...t2</tt>, ordered by
73
73
  # <tt>starttime</tt>.
74
74
  #
75
- # What <em>in</em> means depends on <em>inc</em>. If inc(remental) is
75
+ # What <em>in</em> means depends on <em>inc</em>. If inc(remental) is
76
76
  # false, the client is building the interval from scratch. If "hi", it is
77
77
  # an addition to an existing interval on the high side. Similarly
78
78
  # for "lo". This is to avoid re-transmitting blocks that span the
79
79
  # current time boundaries on the client.
80
80
  #
81
81
  # Here the resource is a channel and the use blocks are programs.
82
- #
82
+ #
83
83
  # ==== Parameters
84
84
  # * <tt>rids</tt> - A list of schedules resource ids (strings).
85
85
  # * <tt>t1</tt> - Start time.
@@ -102,19 +102,19 @@ class ScheduledResource
102
102
  blockss
103
103
  end
104
104
 
105
-
105
+
106
106
  # ==== Parameters
107
107
  # * <tt>name</tt> - The class name (string) of a schedule resource.
108
108
  #
109
109
  # ==== Returns
110
110
  # * <tt>Class</tt> - The class representing the <em>use</em> of that resource for an interval of time.
111
111
  def self.block_class_for_resource_name( name )
112
- config[:block_class_for_resource_kind][name]
112
+ config[:block_class_for_resource_kind][name].constantize
113
113
  end
114
114
 
115
115
 
116
116
  # ==== Returns
117
- # * <tt>Array[SchedResource]</tt> - List of all configured SchedResources .
117
+ # * <tt>Array[ScheduledResource]</tt> - List of configured ScheduledResources.
118
118
  def self.resource_list; config[:all_resources] end
119
119
 
120
120
  # ==== Returns
@@ -166,8 +166,8 @@ class ScheduledResource
166
166
  }
167
167
  yml = YAML.load_file CONFIG_FILE
168
168
 
169
- yml['ResourceKinds'].each do |key, val| # {"Channel" => <#Class Program>...}
170
- config[:block_class_for_resource_kind][key] = eval val
169
+ yml['ResourceKinds'].each do |key, val| # {"Channel" => "Program"...}
170
+ config[:block_class_for_resource_kind][key] = val # class name (string)
171
171
  end
172
172
 
173
173
  if (rkls = yml['Resources']) # Resource Kind Lists, eg
@@ -185,12 +185,12 @@ class ScheduledResource
185
185
  config[:time_range_min] = t0 ? (eval t0) : (Time.now - 1.week)
186
186
 
187
187
  tn = yml['timeRangeMax']
188
- config[:time_range_max] = tn ? (eval tn) : (Time.now - 1.week)
188
+ config[:time_range_max] = tn ? (eval tn) : (Time.now + 1.week)
189
189
 
190
190
  config
191
191
  end
192
192
 
193
-
193
+
194
194
  def self.add_resources(rsrcs)
195
195
  rs = config[:all_resources]
196
196
  rsrcs.each{ |rsrc| rs.include?( rsrc ) || rs << rsrc }
@@ -236,16 +236,16 @@ class ScheduledResource
236
236
  def kind() @tag.sub( /_.*/, '' ) end
237
237
 
238
238
  # ==== Returns
239
- # * <tt>String</tt> - The <tt>rid</tt> (abstract id) of the SchedResource.
239
+ # * <tt>String</tt> - The <tt>rid</tt> (abstract id) of the ScheduledResource.
240
240
  def sub_id() @tag.sub( /.*_/, '' ) end
241
241
 
242
242
  def to_s() # :nodoc:
243
243
  @tag
244
- end
244
+ end
245
245
 
246
246
  def inspect() # :nodoc:
247
- "<#SchedResource \"#{@tag}\">"
248
- end
247
+ "<#ScheduledResource \"#{@tag}\">"
248
+ end
249
249
 
250
250
  attr_accessor :label, :title
251
251
  def label(); @label || @tag end
@@ -1,3 +1,3 @@
1
1
  class ScheduledResource
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
8
8
  spec.version = ScheduledResource::VERSION
9
9
  spec.authors = ["Mike Cannon"]
10
10
  spec.email = ["michael.j.cannon@gmail.com"]
11
- spec.summary = %q{Help display how something is used over time.}
11
+ spec.summary = %q{Display how something is used over time.}
12
12
  spec.description = %Q{== README.md:\n#{IO.read 'README.md'}}
13
- spec.homepage = ""
13
+ spec.homepage = "http://github.com/emeyekayee/scheduled_resource"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -18,8 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "rails"
22
- spec.add_dependency "coffee-rails"
21
+ spec.add_dependency "rails", "~> 4.2"
22
+ spec.add_dependency "coffee-rails", "~> 4.1"
23
23
  spec.add_development_dependency "bundler", "~> 1.7"
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
25
  end