model_updates 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 05326da852e8df75c3e5334f89cabc3f38177947
4
- data.tar.gz: 063a04512f41a1f72cde419c73f3584914fb562e
3
+ metadata.gz: b6e5c02e29a478245a15cbca2daf7238ef762f83
4
+ data.tar.gz: 0c4c00c9c6404c72a3ea21b3168ddc5a19be18b9
5
5
  SHA512:
6
- metadata.gz: '093382959d411617d46eec433757d6e2657c36be156f4dbf999f73810a08a6d0ba7bab3fc5b97a74045c5e5995eda1ec7551bda6349f2dc31a03852e5021c29a'
7
- data.tar.gz: 8a00157e300e125093f08fa5b4487a2f3af50f979e2a527c1b5e795e5ee5b49ab9d4b68731013b98a5ba4668629af858dd5ca1506c130b2c4aecbfac5c66e68e
6
+ metadata.gz: c686af4abd42d5f9a6ca9f895c6c08f62fa461c060b419d282625b38e7ee9597653fbe55dff27b5a841822c9733614936728d49a61d37d777e2decacdf10a158
7
+ data.tar.gz: ea03a51dd7f1468e0950af0ffe6fb5ea6b3eee76e816d49c9d58fb5e2ac6eea8e3fc7780e7fd96394401c87ebac960ec7b583e0c07cfc914e0e8dd3b710a084e
data/README.md CHANGED
@@ -34,6 +34,25 @@ class ApplicationRecord < ActiveRecord::Base
34
34
  end
35
35
  ```
36
36
 
37
+ Add required CanCan access methods to your `ApplicationCable::Channel`:
38
+ ```ruby
39
+ class ApplicationCable::Channel < ActionCable::Channel::Base
40
+ private
41
+
42
+ delegate :authorize!, :can?, to: :current_ability
43
+
44
+ def current_ability
45
+ @_current_ability ||= PeakFlowAbility.new(user: current_user)
46
+ end
47
+
48
+ def current_user
49
+ @_current_user ||= env["warden"].user
50
+ end
51
+ end
52
+ ```
53
+
54
+ You can define `authorize!(ability, model)` yourself, if you aren't using CanCan.
55
+
37
56
  Choose which attributes should be broadcasted automatically:
38
57
 
39
58
  ```ruby
@@ -50,6 +69,14 @@ class Model < ApplicationRecord
50
69
  end
51
70
  ```
52
71
 
72
+ Or destroys:
73
+ ```ruby
74
+ class Model < ApplicationRecord
75
+ model_updates_broadcast_attributes attributes: [:updated_at]
76
+ model_updates_broadcast_destroyed
77
+ end
78
+ ```
79
+
53
80
  ## Usage
54
81
 
55
82
 
@@ -109,6 +136,24 @@ ModelUpdates.Create.connect({model: "MyModel", onCreated: function(data) {
109
136
  })
110
137
  ```
111
138
 
139
+ If you want an element automatically removed on destroy:
140
+ ```erb
141
+ <div class="model-updates" data-model-updates-model="<%= model.class.name %>" data-model-updates-id="<%= model.id %>" data-model-updates-remove-on-destroy="true">
142
+ <%= model.updated_at %>
143
+ </div>
144
+ ```
145
+
146
+ You can also manually listen when a model gets destroyed:
147
+ ```js
148
+ ModelUpdates.Destroy.connect({
149
+ "id": data.id,
150
+ "model": "BuildCommandExecution",
151
+ "onDestroyed": function(data) {
152
+ console.log("Model destroyed: " + data.id)
153
+ }
154
+ })
155
+ ```
156
+
112
157
  ## Contributing
113
158
 
114
159
  Contribution directions go here.
@@ -1,23 +1,43 @@
1
1
  $(document).ready(function() {
2
2
  // Find all models that should be subscribed to
3
- model_subscriptions = {}
3
+ modelSubscriptions = {}
4
+ modelDestroys = {}
4
5
 
5
6
  $(".model-updates").each(function() {
6
- model_type = $(this).data("model-updates-model")
7
- model_id = $(this).data("model-updates-id")
7
+ element = $(this)
8
8
 
9
- if (!model_subscriptions[model_type])
10
- model_subscriptions[model_type] = {}
9
+ model = element.data("model-updates-model")
10
+ id = element.data("model-updates-id")
11
11
 
12
- model_subscriptions[model_type][model_id] = {}
12
+ if (!modelSubscriptions[model])
13
+ modelSubscriptions[model] = {}
14
+
15
+ if (element.data("model-updates-key"))
16
+ modelSubscriptions[model][id] = true
17
+
18
+ if (element.data("model-updates-remove-on-destroy")) {
19
+ if (!modelDestroys[model])
20
+ modelDestroys[model] = {}
21
+
22
+ modelDestroys[model][id] = true
23
+ }
13
24
  })
14
25
 
15
26
  // Subscribe to the found models
16
- for(var model_type in model_subscriptions) {
17
- for(var model_id in model_subscriptions[model_type]) {
27
+ for(var model in modelSubscriptions) {
28
+ for(var id in modelSubscriptions[model]) {
18
29
  ModelUpdates.Update.connect({
19
- "id": model_id,
20
- "model": model_type
30
+ "id": id,
31
+ "model": model
32
+ })
33
+ }
34
+ }
35
+
36
+ for(var model in modelDestroys) {
37
+ for(var id in modelDestroys[model]) {
38
+ ModelUpdates.Destroy.connect({
39
+ "id": id,
40
+ "model": model
21
41
  })
22
42
  }
23
43
  }
@@ -0,0 +1,18 @@
1
+ ModelUpdates.Destroy = class Destroy {
2
+ static connect(args) {
3
+ ModelUpdates.debug("Connecting to destroy channel for " + args.model + "(" + args.id + ")")
4
+
5
+ App.cable.subscriptions.create(
6
+ {channel: "ModelUpdates::DestroyChannel", id: args.id, model: args.model},
7
+ {
8
+ received: function(json) {
9
+ var elements = $(".model-updates[data-model-updates-model='" + json.model + "'][data-model-updates-id='" + json.id + "'][data-model-updates-remove-on-destroy='true']")
10
+ elements.remove()
11
+
12
+ if (args.onDestroyed)
13
+ args.onDestroyed(json)
14
+ }
15
+ }
16
+ )
17
+ }
18
+ }
@@ -1,7 +1,7 @@
1
1
  class ModelUpdates {
2
2
  static debug(message) {
3
3
  if (ModelUpdates.configuration.debug) {
4
- console.log(message)
4
+ console.log("ModelUpdates: " + message)
5
5
  }
6
6
  }
7
7
  }
@@ -1,12 +1,12 @@
1
1
  ModelUpdates.Update = class Update {
2
2
  static connect(args) {
3
- ModelUpdates.debug("ModelUpdates: Connecting to " + args.model + "(" + args.id + ")")
3
+ ModelUpdates.debug("Connecting to update channel for " + args.model + "(" + args.id + ")")
4
4
 
5
5
  App.cable.subscriptions.create(
6
6
  {channel: "ModelUpdates::UpdateChannel", id: args.id, model: args.model},
7
7
  {
8
8
  received: function(json) {
9
- ModelUpdates.debug("ModelUpdates: Received update for " + json.model + "(" + json.id + ")")
9
+ ModelUpdates.debug("Received update for " + json.model + "(" + json.id + ")")
10
10
 
11
11
  for(var key in json.changes) {
12
12
  var elements = $(".model-updates[data-model-updates-model='" + json.model + "'][data-model-updates-id='" + json.id + "'][data-model-updates-key='" + key + "']")
@@ -1,5 +1,6 @@
1
1
  //= require model_updates/model_updates_class
2
2
  //= require model_updates/activate_elements
3
3
  //= require model_updates/create
4
+ //= require model_updates/destroy
4
5
  //= require model_updates/formatters
5
6
  //= require model_updates/update
@@ -0,0 +1,7 @@
1
+ class ModelUpdates::DestroyChannel < ApplicationCable::Channel
2
+ def subscribed
3
+ model = params[:model].safe_constantize.find(params[:id])
4
+ authorize! :read, model
5
+ stream_for model
6
+ end
7
+ end
@@ -11,7 +11,7 @@ module ModelUpdates::ModelExtensions
11
11
  def model_updates_broadcast_attributes(args)
12
12
  model_updates_data[:attributes] = args.fetch(:attributes)
13
13
 
14
- after_save do
14
+ after_commit on: :update do |model|
15
15
  changes = {}
16
16
 
17
17
  args.fetch(:attributes).each do |attribute_name|
@@ -27,9 +27,9 @@ module ModelUpdates::ModelExtensions
27
27
 
28
28
  if changes.any?
29
29
  ModelUpdates::UpdateChannel.broadcast_to(
30
- self,
30
+ model,
31
31
  id: id,
32
- model: self.class.name,
32
+ model: model.class.name,
33
33
  changes: changes
34
34
  )
35
35
  end
@@ -41,7 +41,7 @@ module ModelUpdates::ModelExtensions
41
41
  channel_name = "ModelUpdatesCreate#{model.class.name}"
42
42
 
43
43
  attributes = {}
44
- self.class.model_updates_data[:attributes].each do |attribute_name|
44
+ model.class.model_updates_data[:attributes].each do |attribute_name|
45
45
  attributes[attribute_name] = __send__(attribute_name)
46
46
  end
47
47
 
@@ -52,6 +52,22 @@ module ModelUpdates::ModelExtensions
52
52
  )
53
53
  end
54
54
  end
55
+
56
+ def model_updates_broadcast_destroyed
57
+ after_commit on: :destroy do |model|
58
+ attributes = {}
59
+ model.class.model_updates_data[:attributes].each do |attribute_name|
60
+ attributes[attribute_name] = __send__(attribute_name)
61
+ end
62
+
63
+ ModelUpdates::DestroyChannel.broadcast_to(
64
+ model,
65
+ id: id,
66
+ model: model.class.name,
67
+ attributes: attributes
68
+ )
69
+ end
70
+ end
55
71
  end
56
72
 
57
73
  def model_updates_attrs(key, more = {})
@@ -1,3 +1,3 @@
1
1
  module ModelUpdates
2
- VERSION = "0.0.6".freeze
2
+ VERSION = "0.0.7".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: model_updates
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - kaspernj
@@ -52,11 +52,13 @@ files:
52
52
  - app/assets/javascripts/model_updates.js
53
53
  - app/assets/javascripts/model_updates/activate_elements.js
54
54
  - app/assets/javascripts/model_updates/create.es6
55
+ - app/assets/javascripts/model_updates/destroy.es6
55
56
  - app/assets/javascripts/model_updates/formatters.js
56
57
  - app/assets/javascripts/model_updates/model_updates_class.es6
57
58
  - app/assets/javascripts/model_updates/update.es6
58
59
  - app/assets/stylesheets/model_updates/application.css
59
60
  - app/channels/model_updates/create_channel.rb
61
+ - app/channels/model_updates/destroy_channel.rb
60
62
  - app/channels/model_updates/update_channel.rb
61
63
  - app/controllers/model_updates/application_controller.rb
62
64
  - app/helpers/model_updates/application_helper.rb