card 1.15.7 → 1.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/card.gemspec +3 -2
- data/config/initializers/inflections.rb +1 -1
- data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +0 -1
- data/db/migrate_core_cards/20150601133433_add_recent_setting_session_card.rb +12 -0
- data/db/migrate_core_cards/20150610171702_add_debugger_session_card.rb +11 -0
- data/db/migrate_core_cards/20150611203506_rails_inflection_updates.rb +82 -0
- data/db/migrate_core_cards/20150627205133_fix_script_bootstrap_card_type.rb +7 -0
- data/db/migrate_core_cards/20150702130543_remove_edit_toolbar_pinned.rb +9 -0
- data/db/schema.rb +81 -81
- data/db/seed/new/card_actions.yml +12581 -1647
- data/db/seed/new/card_acts.yml +1 -1
- data/db/seed/new/card_changes.yml +39326 -7569
- data/db/seed/new/card_references.yml +518 -455
- data/db/seed/new/cards.yml +1547 -1291
- data/db/seed/test/fixtures/card_actions.yml +13700 -2717
- data/db/seed/test/fixtures/card_acts.yml +314 -272
- data/db/seed/test/fixtures/card_changes.yml +45409 -13573
- data/db/seed/test/fixtures/card_references.yml +1223 -1125
- data/db/seed/test/fixtures/cards.yml +2694 -2433
- data/db/seed/test/fixtures/file1.txt +1 -0
- data/db/seed/test/fixtures/file2.txt +1 -0
- data/db/version_core_cards.txt +1 -1
- data/lib/card.rb +23 -13
- data/lib/card/auth.rb +6 -6
- data/lib/card/cache.rb +24 -5
- data/lib/card/env.rb +10 -10
- data/lib/card/format.rb +29 -12
- data/lib/card/log.rb +5 -3
- data/lib/card/migration.rb +17 -41
- data/lib/card/name.rb +12 -0
- data/lib/card/reference.rb +11 -12
- data/lib/card/set.rb +59 -6
- data/lib/card/simplecov_helper.rb +6 -1
- data/lib/card/spec_helper.rb +3 -2
- data/lib/card/view_cache.rb +77 -0
- data/lib/cardio.rb +30 -22
- data/mod/01_core/format/html_format.rb +17 -9
- data/mod/01_core/layout/blank.html +1 -1
- data/mod/01_core/layout/default.html +6 -16
- data/mod/01_core/layout/modal.html +9 -0
- data/mod/01_core/layout/noside.html +5 -12
- data/mod/01_core/layout/simple.html +1 -1
- data/mod/01_core/set/all/collection.rb +57 -5
- data/mod/01_core/set/all/content.rb +5 -7
- data/mod/01_core/set/all/name.rb +8 -10
- data/mod/01_core/set/all/permissions.rb +1 -2
- data/mod/01_core/set/all/phases.rb +5 -13
- data/mod/01_core/set/all/references.rb +10 -10
- data/mod/01_core/set/all/rules.rb +2 -2
- data/mod/01_core/set/all/tracked_attributes.rb +5 -3
- data/mod/01_core/set/all/utils.rb +79 -9
- data/mod/01_core/set/all/view_cache.rb +9 -0
- data/mod/01_core/spec/format/html_format_spec.rb +2 -2
- data/mod/01_core/spec/set/all/collection_spec.rb +1 -1
- data/mod/01_history/lib/card/act.rb +3 -1
- data/mod/01_history/lib/card/action.rb +20 -12
- data/mod/01_history/lib/card/change.rb +12 -8
- data/mod/01_history/set/all/actions.rb +2 -2
- data/mod/01_history/set/all/content_history.rb +3 -2
- data/mod/01_history/set/all/history.rb +57 -19
- data/mod/02_basic_types/set/all/rss.rb +5 -6
- data/mod/{05_standard → 02_basic_types}/set/type/html.rb +4 -3
- data/mod/02_basic_types/set/type/plain_text.rb +1 -1
- data/mod/02_basic_types/set/type/pointer.rb +7 -4
- data/mod/02_basic_types/spec/set/type/pointer_spec.rb +21 -17
- data/mod/03_machines/lib/card/machine.rb +33 -31
- data/mod/03_machines/lib/javascript/script_card_menu.js.coffee +2 -10
- data/mod/03_machines/lib/javascript/wagn.js.coffee +10 -10
- data/mod/03_machines/lib/javascript/wagn_mod.js.coffee +87 -40
- data/mod/03_machines/lib/stylesheets/style_cards.scss +26 -28
- data/mod/03_machines/set/right/machine_output.rb +3 -3
- data/mod/03_machines/set/type/coffee_script.rb +6 -6
- data/mod/03_machines/set/type/css.rb +1 -1
- data/mod/03_machines/set/type/java_script.rb +5 -6
- data/mod/03_machines/spec/lib/shared_machine_examples.rb +3 -1
- data/mod/03_machines/spec/set/type/scss_spec.rb +9 -10
- data/mod/04_settings/lib/card/setting.rb +16 -14
- data/mod/04_settings/set/right/structure.rb +6 -0
- data/mod/04_settings/set/self/add_help.rb +1 -1
- data/mod/04_settings/set/self/autoname.rb +1 -1
- data/mod/04_settings/set/self/captcha.rb +1 -1
- data/mod/04_settings/set/self/default.rb +1 -1
- data/mod/04_settings/set/self/help.rb +1 -1
- data/mod/04_settings/set/self/input.rb +1 -1
- data/mod/04_settings/set/self/layout.rb +1 -1
- data/mod/04_settings/set/self/on_create.rb +1 -1
- data/mod/04_settings/set/self/on_delete.rb +1 -1
- data/mod/04_settings/set/self/on_update.rb +1 -1
- data/mod/04_settings/set/self/options.rb +1 -1
- data/mod/04_settings/set/self/options_label.rb +1 -1
- data/mod/04_settings/set/self/script.rb +1 -1
- data/mod/04_settings/set/self/structure.rb +1 -1
- data/mod/04_settings/set/self/style.rb +1 -1
- data/mod/04_settings/set/self/table_of_contents.rb +1 -1
- data/mod/04_settings/set/self/thanks.rb +1 -1
- data/mod/05_email/set/all/follow.rb +3 -21
- data/mod/05_email/set/all/notify.rb +20 -4
- data/mod/05_email/set/right/follow.rb +16 -18
- data/mod/05_email/set/self/follow.rb +1 -1
- data/mod/05_email/spec/set/all/follow_spec.rb +6 -13
- data/mod/05_standard/set/all/attach.rb +23 -9
- data/mod/05_standard/set/all/error.rb +5 -7
- data/mod/05_standard/set/all/event_viz.rb +10 -6
- data/mod/05_standard/set/all/links.rb +37 -13
- data/mod/05_standard/set/all/rich_html/content.rb +46 -18
- data/mod/05_standard/set/all/rich_html/editing.rb +29 -25
- data/mod/05_standard/set/all/rich_html/form.rb +17 -10
- data/mod/05_standard/set/all/rich_html/header.rb +26 -4
- data/mod/05_standard/set/all/rich_html/menu.rb +17 -34
- data/mod/05_standard/set/all/rich_html/modal.rb +50 -12
- data/mod/05_standard/set/all/rich_html/toolbar.rb +178 -186
- data/mod/05_standard/set/all/rich_html/wrapper.rb +44 -21
- data/mod/05_standard/set/rstar/rules.rb +43 -53
- data/mod/05_standard/set/self/all.rb +2 -1
- data/mod/05_standard/set/self/head.rb +2 -2
- data/mod/05_standard/set/self/signin.rb +18 -18
- data/mod/05_standard/set/self/stats.rb +14 -2
- data/mod/05_standard/set/type/search_type.rb +9 -4
- data/mod/05_standard/set/type/session.rb +12 -7
- data/mod/05_standard/set/type/set.rb +135 -18
- data/mod/05_standard/spec/chunk/include_spec.rb +15 -16
- data/mod/05_standard/spec/set/all/account_spec.rb +21 -21
- data/mod/05_standard/spec/set/all/event_viz_spec.rb +7 -7
- data/mod/05_standard/spec/set/all/history_spec.rb +54 -24
- data/mod/05_standard/spec/set/all/rich_html/editing_spec.rb +42 -40
- data/mod/05_standard/spec/set/rstar/rules_spec.rb +1 -1
- data/mod/05_standard/spec/set/type/search_type_spec.rb +9 -1
- data/mod/05_standard/spec/set/type/signup_spec.rb +42 -42
- data/mod/06_bootstrap/lib/stylesheets/bootstrap_cards.scss +6 -0
- data/mod/06_bootstrap/set/all/bootstrap/form.rb +4 -5
- data/mod/06_bootstrap/set/all/bootstrap/helper.rb +145 -0
- data/mod/06_bootstrap/set/all/rich_bootstrap.rb +0 -59
- data/spec/lib/card/action_spec.rb +1 -1
- data/spec/lib/card/log_spec.rb +7 -7
- data/spec/models/card/cardtype_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +31 -6
- data/mod/04_settings/set/self/comment.rb +0 -2
@@ -9,12 +9,12 @@ format do
|
|
9
9
|
super args
|
10
10
|
end
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def update_machine_output_live?
|
14
14
|
said = card.selected_action_id
|
15
15
|
card.left.kind_of? Machine and # must be a machine
|
16
|
-
!card.left.locked? and # machine must not already be running
|
16
|
+
!card.left.locked? and # machine must not already be running
|
17
17
|
( card.new_card? or !said or said == card.last_action_id ) # must want current output (won't re-output old stuff)
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
end
|
@@ -14,7 +14,7 @@ rescue =>e
|
|
14
14
|
e
|
15
15
|
end
|
16
16
|
|
17
|
-
machine_input do
|
17
|
+
machine_input do
|
18
18
|
Uglifier.compile( compile_coffee format(:js)._render_raw )
|
19
19
|
end
|
20
20
|
|
@@ -26,31 +26,31 @@ end
|
|
26
26
|
|
27
27
|
|
28
28
|
format do
|
29
|
-
def chunk_list #turn off autodetection of uri's
|
29
|
+
def chunk_list #turn off autodetection of uri's
|
30
30
|
:inclusion_only
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
|
35
35
|
format :html do
|
36
|
-
view :editor, :mod=>
|
36
|
+
view :editor, :mod=>Html::HtmlFormat
|
37
37
|
|
38
38
|
view :content_changes do |args|
|
39
39
|
%{
|
40
40
|
<pre>#{super(args)}</pre>
|
41
41
|
}
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
view :core do |args|
|
45
45
|
js = card.compile_coffee _render_raw
|
46
46
|
highlighted_js = ::CodeRay.scan( js, :js ).div
|
47
47
|
process_content highlighted_js
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
end
|
51
51
|
|
52
52
|
|
53
|
-
format do
|
53
|
+
format do
|
54
54
|
view :core do |args|
|
55
55
|
process_content card.compile_coffee(_render_raw)
|
56
56
|
end
|
@@ -33,7 +33,7 @@ format :html do
|
|
33
33
|
{ :view => :closed }
|
34
34
|
end
|
35
35
|
|
36
|
-
view :editor, :mod=>
|
36
|
+
view :editor, :mod=>Html::HtmlFormat
|
37
37
|
|
38
38
|
view :core do |args|
|
39
39
|
# FIXME: scan must happen before process for inclusion interactions to work, but this will likely cause
|
@@ -6,31 +6,30 @@ include MachineInput
|
|
6
6
|
|
7
7
|
store_machine_output :filetype => "js"
|
8
8
|
|
9
|
-
machine_input do
|
9
|
+
machine_input do
|
10
10
|
Uglifier.compile(format(:js)._render_core)
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
13
|
def clean_html?
|
15
14
|
false
|
16
15
|
end
|
17
16
|
|
18
17
|
|
19
18
|
format do
|
20
|
-
def chunk_list #turn off autodetection of uri's
|
19
|
+
def chunk_list #turn off autodetection of uri's
|
21
20
|
:inclusion_only
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
25
24
|
format :html do
|
26
|
-
view :editor, :mod=>
|
25
|
+
view :editor, :mod=>Html::HtmlFormat
|
27
26
|
view :content_changes, :mod=>CoffeeScript::HtmlFormat
|
28
|
-
|
27
|
+
|
29
28
|
view :core do |args|
|
30
29
|
highlighted_js = ::CodeRay.scan( _render_raw, :js ).div
|
31
30
|
process_content highlighted_js
|
32
31
|
end
|
33
|
-
|
32
|
+
|
34
33
|
end
|
35
34
|
|
36
35
|
def diff_args
|
@@ -33,12 +33,14 @@ shared_examples_for 'machine' do |filetype|
|
|
33
33
|
end
|
34
34
|
|
35
35
|
shared_examples_for 'content machine' do |filetype|
|
36
|
+
|
36
37
|
it_should_behave_like 'machine', that_produces(filetype) do
|
37
38
|
let(:machine) { machine_card }
|
38
39
|
end
|
39
40
|
|
40
|
-
|
41
41
|
context '+machine_input card' do
|
42
|
+
|
43
|
+
|
42
44
|
it "points to self" do
|
43
45
|
Card::Auth.as_bot do
|
44
46
|
machine_card.update_input_card
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
3
|
describe Card::Set::Type::Scss do
|
4
|
-
let(:scss) {
|
4
|
+
let(:scss) {
|
5
5
|
%{
|
6
6
|
$link_color: #abcdef;
|
7
|
-
a { color: $link_color; }
|
7
|
+
a { color: $link_color; }
|
8
8
|
}
|
9
9
|
}
|
10
10
|
let(:compressed_css) { "a{color:#abcdef}\n" }
|
11
|
-
let(:changed_scss) {
|
11
|
+
let(:changed_scss) {
|
12
12
|
%{
|
13
|
-
$link_color: #fedcba;
|
13
|
+
$link_color: #fedcba;
|
14
14
|
a { color: $link_color; }
|
15
15
|
}
|
16
16
|
}
|
@@ -18,22 +18,21 @@ describe Card::Set::Type::Scss do
|
|
18
18
|
before do
|
19
19
|
@scss_card = Card[:style_cards]
|
20
20
|
end
|
21
|
-
|
22
|
-
|
21
|
+
|
23
22
|
it 'should highlight code in html' do
|
24
23
|
assert_view_select @scss_card.format(:html).render_core, 'div[class=CodeRay]'
|
25
24
|
end
|
26
|
-
|
25
|
+
|
27
26
|
it 'should not highlight code in css' do
|
28
27
|
expect(@scss_card.format(:css).render_core).not_to match(/CodeRay/)
|
29
28
|
end
|
30
|
-
|
29
|
+
|
31
30
|
it_should_behave_like "machine input" do
|
32
31
|
let(:create_machine_input_card) { Card.gimme! "test scss", :type => :scss, :content => scss }
|
33
32
|
let(:create_another_machine_input_card) { Card.gimme! "more scss", :type => :scss, :content => scss }
|
34
33
|
let(:create_machine_card) { Card.gimme! "style with scss+*style", :type => :pointer }
|
35
34
|
let(:card_content) do
|
36
|
-
{ in: scss, out: compressed_css,
|
35
|
+
{ in: scss, out: compressed_css,
|
37
36
|
changed_in: changed_scss, changed_out: compressed_changed_css }
|
38
37
|
end
|
39
38
|
end
|
@@ -49,7 +48,7 @@ describe Card::Set::Type::Scss do
|
|
49
48
|
it_should_behave_like 'content machine', that_produces_css do
|
50
49
|
let(:machine_card) { Card.gimme! "test scss", :type => :scss, :content => scss }
|
51
50
|
let(:card_content) do
|
52
|
-
{ in: scss, out: compressed_css,
|
51
|
+
{ in: scss, out: compressed_css,
|
53
52
|
changed_in: changed_scss, changed_out: compressed_changed_css }
|
54
53
|
end
|
55
54
|
end
|
@@ -8,34 +8,36 @@ class Card
|
|
8
8
|
# E = Card::Set::Self::Create (module extended with M)
|
9
9
|
# O = Card["*create"] (object)
|
10
10
|
attr_accessor :codename # accessible in E
|
11
|
-
mattr_accessor :groups, :group_names, :user_specific # accessible in E and M
|
12
|
-
def self.extended(host_class)
|
11
|
+
mattr_accessor :groups, :group_names, :user_specific # accessible in E and M
|
12
|
+
def self.extended(host_class)
|
13
13
|
host_class.mattr_accessor :restricted_to_type, :rule_type_editable # accessible in E and O
|
14
14
|
end
|
15
|
-
|
16
|
-
@@groups = { :permission =>[], :look_and_feel=>[], :communication => [], :pointer=>[], :other =>[] }
|
15
|
+
|
17
16
|
@@group_names = {
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
17
|
+
:templating => "Templating",
|
18
|
+
:permission => "Permissions",
|
19
|
+
:webpage => "Webpage",
|
21
20
|
:pointer => "Pointer",
|
22
|
-
:
|
21
|
+
:editing_cue => "Editing cues",
|
22
|
+
:event => "Events",
|
23
|
+
:other => "Other"
|
23
24
|
}
|
25
|
+
@@groups = @@group_names.keys.each_with_object({}) { |key, groups| groups[key] = [] }
|
24
26
|
@@user_specific = ::Set.new
|
25
27
|
|
26
28
|
def self.user_specific? codename
|
27
29
|
@@user_specific.include? codename
|
28
30
|
end
|
29
|
-
|
31
|
+
|
30
32
|
def to_type_id type
|
31
33
|
type.is_a?(Fixnum) ? type : Card::Codename[type]
|
32
34
|
end
|
33
|
-
|
35
|
+
|
34
36
|
# usage:
|
35
|
-
# setting_opts :group => :permission | :
|
37
|
+
# setting_opts :group => :permission | :event | ...
|
36
38
|
# :position => <Fixnum> (starting at 1, default: add to end)
|
37
39
|
# :rule_type_editable => true | false (default: false)
|
38
|
-
# :restricted_to_type => <cardtype> | [ <cardtype>, ...]
|
40
|
+
# :restricted_to_type => <cardtype> | [ <cardtype>, ...]
|
39
41
|
def setting_opts opts
|
40
42
|
group = opts[:group] || :other
|
41
43
|
@@groups[group] ||= []
|
@@ -48,7 +50,7 @@ class Card
|
|
48
50
|
else
|
49
51
|
@@groups[group] << self
|
50
52
|
end
|
51
|
-
|
53
|
+
|
52
54
|
@codename = opts[:codename] || self.name.match(/::(\w+)$/)[1].underscore.to_sym
|
53
55
|
self.rule_type_editable = opts[:rule_type_editable]
|
54
56
|
self.restricted_to_type = opts[:restricted_to_type] ? ::Set.new([opts[:restricted_to_type]].flatten.map{ |cardtype| to_type_id(cardtype) }) : false
|
@@ -56,7 +58,7 @@ class Card
|
|
56
58
|
@@user_specific << @codename
|
57
59
|
end
|
58
60
|
end
|
59
|
-
|
61
|
+
|
60
62
|
def applies_to_cardtype type_id
|
61
63
|
!self.restricted_to_type or self.restricted_to_type.include? type_id
|
62
64
|
end
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:
|
2
|
+
setting_opts :group=>:editing_cue, :position=>2, :rule_type_editable => true
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:
|
2
|
+
setting_opts :group=>:templating, :position=>3
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:
|
2
|
+
setting_opts :group=>:permission, :position=>5
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=> :
|
2
|
+
setting_opts :group=> :templating, :position=>2, :rule_type_editable => true
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:
|
2
|
+
setting_opts :group=>:editing_cue, :position=>1, :rule_type_editable => true
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:pointer, :position=>3, :restricted_to_type => :pointer, :rule_type_editable => false
|
2
|
+
setting_opts :group=>:pointer, :position=>3, :restricted_to_type => [:pointer,:session], :rule_type_editable => false
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:
|
2
|
+
setting_opts :group=>:webpage, :position=>3, :rule_type_editable => false
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:
|
2
|
+
setting_opts :group=>:event, :position=>1 , :rule_type_editable => false
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:
|
2
|
+
setting_opts :group=>:event, :position=>3, :rule_type_editable => false
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:
|
2
|
+
setting_opts :group=>:event, :position=>2, :rule_type_editable => false
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:pointer, :position=>1, :restricted_to_type => :pointer, :rule_type_editable=>true
|
2
|
+
setting_opts :group=>:pointer, :position=>1, :restricted_to_type => [:pointer,:session], :rule_type_editable=>true
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:pointer, :position=>2, :restricted_to_type => :pointer, :rule_type_editable => false
|
2
|
+
setting_opts :group=>:pointer, :position=>2, :restricted_to_type => [:pointer,:session], :rule_type_editable => false
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group
|
2
|
+
setting_opts :group=>:webpage, :position=>5
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=> :
|
2
|
+
setting_opts :group=> :templating, :position=>2, :rule_type_editable => true
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:
|
2
|
+
setting_opts :group=>:webpage, :position=>4
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=> :
|
2
|
+
setting_opts :group=> :other, :position=>1, :rule_type_editable=>false
|
@@ -1,2 +1,2 @@
|
|
1
1
|
extend Card::Setting
|
2
|
-
setting_opts :group=>:
|
2
|
+
setting_opts :group=>:other, :position=>3, :rule_type_editable => false
|
@@ -35,7 +35,7 @@ format do
|
|
35
35
|
end
|
36
36
|
follow_rule_name = card.default_follow_set_card.follow_rule_name( Auth.current.name )
|
37
37
|
hash[:path] = path :name=>follow_rule_name, :action=>:update,
|
38
|
-
:success=>{ :view=>:
|
38
|
+
:success=>{ :layout=>:modal, :view=>:follow_status },
|
39
39
|
:card=>{ :content=>"[[#{hash[:content]}]]" }
|
40
40
|
hash
|
41
41
|
end
|
@@ -52,26 +52,8 @@ format :html do
|
|
52
52
|
|
53
53
|
view :follow_link, :tags=>:unknown_ok, :perms=>:none do |args|
|
54
54
|
hash = follow_link_hash args
|
55
|
-
text =
|
56
|
-
|
57
|
-
:title => hash[:title],
|
58
|
-
:class => "follow-toggle #{hash[:class]}",
|
59
|
-
'data-follow' => JSON(hash),
|
60
|
-
'data-rule_name' => card.default_follow_set_card.follow_rule_name( Auth.current.name ).to_name.url_key,
|
61
|
-
'data-card_key' => card.key
|
62
|
-
}
|
63
|
-
link_to text, '', opts
|
64
|
-
end
|
65
|
-
|
66
|
-
def default_follow_link_args args
|
67
|
-
args[:toggle] ||= card.followed? ? :off : :on
|
68
|
-
args[:label] ||= card.follow_label
|
69
|
-
end
|
70
|
-
|
71
|
-
|
72
|
-
view :follow_modal_link, :tags=>:unknown_ok, :perms=>:none do |args|
|
73
|
-
hash = follow_link_hash args
|
74
|
-
text = %[#{glyphicon 'flag'}<span class="follow-verb menu-item-label">#{hash[:verb]}</span>]
|
55
|
+
text = args[:icon] ? glyphicon('flag') : ''
|
56
|
+
text += %[<span class="follow-verb menu-item-label">#{hash[:verb]}</span>].html_safe
|
75
57
|
follow_rule_card = Card.fetch(card.default_follow_set_card.follow_rule_name( Auth.current.name ), :new=>{})
|
76
58
|
opts = ( args[:html_args] || {} ).clone
|
77
59
|
opts.merge!(
|
@@ -57,15 +57,31 @@ def act_card
|
|
57
57
|
@supercard || self
|
58
58
|
end
|
59
59
|
|
60
|
+
|
61
|
+
def followable?
|
62
|
+
true
|
63
|
+
end
|
64
|
+
|
65
|
+
def notable_change?
|
66
|
+
!supercard && current_act && Card::Auth.current_id != WagnBotID && followable?
|
67
|
+
end
|
68
|
+
|
69
|
+
event :notify_followers_after_save, :after=>:subsequent, :on=>:save, :when=>proc{ |ca| ca.notable_change? } do
|
70
|
+
notify_followers
|
71
|
+
end
|
72
|
+
|
73
|
+
# in the delete case we have to calculate the follower_stash beforehand
|
74
|
+
# but we can't pass the follower_stash through the ActiveJob queue.
|
75
|
+
# We have to deal with the notifications in the extend phase instead of the subsequent phase
|
60
76
|
event :stash_followers, :after=>:approve, :on=>:delete do
|
61
77
|
act_card.follower_stash ||= FollowerStash.new
|
62
78
|
act_card.follower_stash.add_affected_card self
|
63
79
|
end
|
80
|
+
event :notify_followers_after_delete, :after=>:extend, :on=>:delete, :when=>proc{ |ca| ca.notable_change? } do
|
81
|
+
notify_followers
|
82
|
+
end
|
64
83
|
|
65
|
-
|
66
|
-
!c.supercard and c.current_act and Card::Auth.current_id != WagnBotID
|
67
|
-
} do
|
68
|
-
|
84
|
+
def notify_followers
|
69
85
|
begin
|
70
86
|
@current_act.reload
|
71
87
|
@follower_stash ||= FollowerStash.new
|
@@ -44,33 +44,31 @@ format :html do
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
def
|
47
|
+
def default_follow_status_args args
|
48
48
|
args[:card_key] ||= card.set_prototype.key
|
49
49
|
end
|
50
50
|
|
51
|
-
view :
|
51
|
+
view :follow_status do |args|
|
52
|
+
# #{ link_to '×', '', 'aria-hidden'=>true, :class=>'close update-follow-link', 'data-dismiss'=>'modal', 'data-card_key'=>args[:card_key] }
|
52
53
|
%{
|
53
|
-
#{ link_to '×', '', 'aria-hidden'=>true, :class=>'close update-follow-link', 'data-dismiss'=>'modal', 'data-card_key'=>args[:card_key] }
|
54
|
-
<h4 class="modal-title">Get notified about changes</h4>
|
55
|
-
}
|
56
|
-
end
|
57
54
|
|
58
|
-
|
59
|
-
wrap_with :ul, :class=>'delete-list list-group' do
|
60
|
-
card.item_names.map do |option|
|
61
|
-
content_tag :li, :class=>'list-group-item' do
|
62
|
-
subformat(card).render_follow_item :condition=>(option == '*never' ? '*always' : option)
|
63
|
-
end
|
64
|
-
end.join "\n"
|
65
|
-
end
|
66
|
-
end
|
55
|
+
<h4>Get notified about changes</h4>
|
67
56
|
|
57
|
+
#{
|
58
|
+
wrap_with( :ul, :class=>'delete-list list-group') do
|
59
|
+
card.item_names.map do |option|
|
60
|
+
content_tag :li, :class=>'list-group-item' do
|
61
|
+
subformat(card).render_follow_item :condition=>(option == '*never' ? '*always' : option)
|
62
|
+
end
|
63
|
+
end.join "\n"
|
64
|
+
end
|
65
|
+
}
|
68
66
|
|
69
|
-
|
70
|
-
|
71
|
-
link_to('Close', '', :class=>'btn btn-default update-follow-link', 'data-dismiss'=>'modal', 'data-card_key'=>args[:card_key])
|
67
|
+
#{ card_link(args[:card_key], :text=>'more options', :path_opts=>{:view=>:related, :related=>{:name=>card.name,:view=>:related_edit_rule}}, :class=>'btn update-follow-link', 'data-card_key'=>args[:card_key]) }
|
68
|
+
}
|
72
69
|
end
|
73
70
|
|
71
|
+
|
74
72
|
view :delete_follow_rule_button do |args|
|
75
73
|
button_tag :type=>:submit, :class=>'btn-xs btn-item-delete btn-primary', 'aria-label'=>'Left Align' do
|
76
74
|
tag :span, :class=>"glyphicon glyphicon-ok", 'aria-hidden'=>"true"
|