model_updates 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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