From a0ffdc5ee812f80e34430eda0756665eb9703e27 Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Tue, 20 Sep 2016 11:08:34 -0500 Subject: [PATCH 01/17] Create "Share" modal dialog Can only be opened by calling `$('#share-modal').openModal()` --- app/views/content/_share.html.erb | 23 +++++++++++++++++++ app/views/content/_show.html.erb | 2 ++ .../content/form/_privacy_toggle.html.erb | 15 ++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 app/views/content/_share.html.erb create mode 100644 app/views/content/form/_privacy_toggle.html.erb diff --git a/app/views/content/_share.html.erb b/app/views/content/_share.html.erb new file mode 100644 index 00000000..cf6d1b33 --- /dev/null +++ b/app/views/content/_share.html.erb @@ -0,0 +1,23 @@ + diff --git a/app/views/content/_show.html.erb b/app/views/content/_show.html.erb index 15d84723..0091caf2 100644 --- a/app/views/content/_show.html.erb +++ b/app/views/content/_show.html.erb @@ -67,3 +67,5 @@ + +<%= render partial: 'content/share', locals: { shared_content: @content} %> diff --git a/app/views/content/form/_privacy_toggle.html.erb b/app/views/content/form/_privacy_toggle.html.erb new file mode 100644 index 00000000..dd6c4940 --- /dev/null +++ b/app/views/content/form/_privacy_toggle.html.erb @@ -0,0 +1,15 @@ +<% disabled = false if local_assigns[:disabled].nil? %> + + + +<%= form_for(content, remote: true, html: {role: :form, 'data-model': content.class.model_name}) do |form|%> +
+ <%= content.name %>'s privacy setting: + +
+<%end%> From 9218e97441336687453c954b566675cd7c7c5cac Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Tue, 20 Sep 2016 13:08:41 -0500 Subject: [PATCH 02/17] Add privacy field to Character --- app/models/character.rb | 8 +++++++ ...0160920180129_add_privacy_to_characters.rb | 5 +++++ db/schema.rb | 3 ++- test/models/character_test.rb | 21 +++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20160920180129_add_privacy_to_characters.rb diff --git a/app/models/character.rb b/app/models/character.rb index 548cc813..b3aff2c6 100644 --- a/app/models/character.rb +++ b/app/models/character.rb @@ -45,6 +45,14 @@ class Character < ActiveRecord::Base 'group' end + def private? + !public? + end + + def public? + privacy == 'public' + end + def self.attribute_categories { general: { diff --git a/db/migrate/20160920180129_add_privacy_to_characters.rb b/db/migrate/20160920180129_add_privacy_to_characters.rb new file mode 100644 index 00000000..3cc4f120 --- /dev/null +++ b/db/migrate/20160920180129_add_privacy_to_characters.rb @@ -0,0 +1,5 @@ +class AddPrivacyToCharacters < ActiveRecord::Migration + def change + add_column :characters, :privacy, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 87797945..d1035297 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160903223957) do +ActiveRecord::Schema.define(version: 20160920180129) do create_table "archenemyships", force: :cascade do |t| t.integer "user_id" @@ -79,6 +79,7 @@ ActiveRecord::Schema.define(version: 20160903223957) do t.integer "universe_id" t.datetime "created_at" t.datetime "updated_at" + t.string "privacy" end create_table "childrenships", force: :cascade do |t| diff --git a/test/models/character_test.rb b/test/models/character_test.rb index 9766f4f5..ed8ce19b 100644 --- a/test/models/character_test.rb +++ b/test/models/character_test.rb @@ -7,4 +7,25 @@ class CharacterTest < ActiveSupport::TestCase refute character.valid?, 'Character name not being validated for presence' end + + test 'public character' do + character = build(:character, privacy: 'public') + + assert character.public? + refute character.private? + end + + test 'private character -- field contains "private"' do + character = build(:character, privacy: 'private') + + assert character.private? + refute character.public? + end + + test 'private character -- field is empty' do + character = build(:character, privacy: '') + + assert character.private? + refute character.public? + end end From d80f6f95965d0d1c1cf74ac080339c1d28f6f956 Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Tue, 20 Sep 2016 13:11:05 -0500 Subject: [PATCH 03/17] Improve character test descriptions --- test/models/character_test.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/models/character_test.rb b/test/models/character_test.rb index ed8ce19b..53c8659d 100644 --- a/test/models/character_test.rb +++ b/test/models/character_test.rb @@ -8,21 +8,21 @@ class CharacterTest < ActiveSupport::TestCase refute character.valid?, 'Character name not being validated for presence' end - test 'public character' do + test 'character is public when privacy field contains "public"' do character = build(:character, privacy: 'public') assert character.public? refute character.private? end - test 'private character -- field contains "private"' do + test 'character is private when privacy field contains "private"' do character = build(:character, privacy: 'private') assert character.private? refute character.public? end - test 'private character -- field is empty' do + test 'character is private when privacy field is empty' do character = build(:character, privacy: '') assert character.private? From 286d06c60e27f6a11fdfd6edb41d0adb6649e5dd Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Tue, 20 Sep 2016 17:09:43 -0500 Subject: [PATCH 04/17] Add share buttons and wire them up --- app/assets/javascripts/content.js.coffee | 3 +++ app/views/content/_show.html.erb | 1 + app/views/content/form/_actions_dropdown.html.erb | 4 ++-- app/views/universes/edit.html.erb | 4 +++- 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 app/assets/javascripts/content.js.coffee diff --git a/app/assets/javascripts/content.js.coffee b/app/assets/javascripts/content.js.coffee new file mode 100644 index 00000000..60cb2609 --- /dev/null +++ b/app/assets/javascripts/content.js.coffee @@ -0,0 +1,3 @@ +$(document).ready -> + $('.share').click -> + $('#share-modal').openModal() diff --git a/app/views/content/_show.html.erb b/app/views/content/_show.html.erb index 0091caf2..0bd976fd 100644 --- a/app/views/content/_show.html.erb +++ b/app/views/content/_show.html.erb @@ -10,6 +10,7 @@
<%= content.class.icon %> + <%= content.name %>
    diff --git a/app/views/content/form/_actions_dropdown.html.erb b/app/views/content/form/_actions_dropdown.html.erb index fed6c594..bc900a3d 100644 --- a/app/views/content/form/_actions_dropdown.html.erb +++ b/app/views/content/form/_actions_dropdown.html.erb @@ -6,7 +6,7 @@ \ No newline at end of file +
diff --git a/app/views/universes/edit.html.erb b/app/views/universes/edit.html.erb index 75ebd595..3206fe83 100644 --- a/app/views/universes/edit.html.erb +++ b/app/views/universes/edit.html.erb @@ -1,3 +1,5 @@ <%= form_for @content do |form| %> <%= render partial: 'content/form', locals: { f: form, content: @content } %> -<% end %> \ No newline at end of file +<% end %> + +<%= render partial: 'content/share', locals: { shared_content: @content} %> From ad178d7854f3c6737de07fa4301bad05a63e74c8 Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Thu, 22 Sep 2016 11:33:58 -0500 Subject: [PATCH 05/17] Make privacy toggle send "public" or "private" --- app/views/content/form/_privacy_toggle.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/content/form/_privacy_toggle.html.erb b/app/views/content/form/_privacy_toggle.html.erb index dd6c4940..429b5fb3 100644 --- a/app/views/content/form/_privacy_toggle.html.erb +++ b/app/views/content/form/_privacy_toggle.html.erb @@ -7,7 +7,7 @@ <%= content.name %>'s privacy setting: From bf3cf4a51e8b533afde331dd04a9626dc3f8606f Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Thu, 22 Sep 2016 13:02:03 -0500 Subject: [PATCH 06/17] Add HasPrivacy concern --- app/models/character.rb | 10 +--------- app/models/concerns/has_privacy.rb | 16 ++++++++++++++++ app/models/universe.rb | 2 ++ test/models/character_test.rb | 26 ++++++++++++++++++-------- test/models/universe_test.rb | 14 ++++++++++++++ 5 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 app/models/concerns/has_privacy.rb diff --git a/app/models/character.rb b/app/models/character.rb index b3aff2c6..1811034a 100644 --- a/app/models/character.rb +++ b/app/models/character.rb @@ -14,6 +14,7 @@ class Character < ActiveRecord::Base belongs_to :universe + include HasPrivacy include HasContentGroupers # Characters @@ -31,7 +32,6 @@ class Character < ActiveRecord::Base # Items relates :favorite_items, with: :ownerships, where: { favorite: true } - scope :is_public, -> { joins(:universe).where(universes: { privacy: "public" }) } def description role @@ -45,14 +45,6 @@ class Character < ActiveRecord::Base 'group' end - def private? - !public? - end - - def public? - privacy == 'public' - end - def self.attribute_categories { general: { diff --git a/app/models/concerns/has_privacy.rb b/app/models/concerns/has_privacy.rb new file mode 100644 index 00000000..06ed8ad7 --- /dev/null +++ b/app/models/concerns/has_privacy.rb @@ -0,0 +1,16 @@ +require 'active_support/concern' + +module HasPrivacy + extend ActiveSupport::Concern + + included do + def private_content? + !public_content? + end + + def public_content? + in_private_universe = respond_to?(:universe) && universe.present? && universe.private_content? + privacy == 'public' && !in_private_universe + end + end +end diff --git a/app/models/universe.rb b/app/models/universe.rb index d0c446fc..009c6305 100644 --- a/app/models/universe.rb +++ b/app/models/universe.rb @@ -6,6 +6,8 @@ # # contains all canonically-related content created by Users class Universe < ActiveRecord::Base + include HasPrivacy + validates :name, presence: true belongs_to :user diff --git a/test/models/character_test.rb b/test/models/character_test.rb index 53c8659d..bca603e9 100644 --- a/test/models/character_test.rb +++ b/test/models/character_test.rb @@ -9,23 +9,33 @@ class CharacterTest < ActiveSupport::TestCase end test 'character is public when privacy field contains "public"' do - character = build(:character, privacy: 'public') + universe = build(:universe, privacy: 'public') + character = build(:character, privacy: 'public', universe: universe) - assert character.public? - refute character.private? + assert character.public_content? + refute character.private_content? end test 'character is private when privacy field contains "private"' do - character = build(:character, privacy: 'private') + universe = build(:universe, privacy: 'public') + character = build(:character, privacy: 'private', universe: universe) - assert character.private? - refute character.public? + assert character.private_content? + refute character.public_content? end test 'character is private when privacy field is empty' do character = build(:character, privacy: '') - assert character.private? - refute character.public? + assert character.private_content? + refute character.public_content? + end + + test 'character is private when universe is private' do + universe = build(:universe, privacy: 'private') + character = build(:character, privacy: 'public', universe: universe) + + assert character.private_content? + refute character.public_content? end end diff --git a/test/models/universe_test.rb b/test/models/universe_test.rb index 2976b1cb..6da6a731 100644 --- a/test/models/universe_test.rb +++ b/test/models/universe_test.rb @@ -7,4 +7,18 @@ class UniverseTest < ActiveSupport::TestCase refute universe.valid?, 'Universe name is not being validated for presence' end + + test 'universe is private when privacy field contains "private"' do + universe = build(:universe, privacy: 'private') + + assert universe.private_content? + refute universe.public_content? + end + + test 'universe is private when privacy field is empty' do + universe = build(:universe, privacy: '') + + assert universe.private_content? + refute universe.public_content? + end end From 2809c3c60a6ffa18dc370498928a3912202af8d1 Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Thu, 22 Sep 2016 13:03:10 -0500 Subject: [PATCH 07/17] Add back is_public scope --- app/models/character.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/character.rb b/app/models/character.rb index 1811034a..161a2b97 100644 --- a/app/models/character.rb +++ b/app/models/character.rb @@ -32,6 +32,7 @@ class Character < ActiveRecord::Base # Items relates :favorite_items, with: :ownerships, where: { favorite: true } + scope :is_public, -> { where(privacy: 'public').joins(:universe).where(universes: { privacy: "public" }) } def description role From 3252962a9f879cc544bd177890ba676c52585f22 Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Thu, 22 Sep 2016 13:03:42 -0500 Subject: [PATCH 08/17] Clean up share box styles --- app/views/content/_share.html.erb | 26 ++++++++++++------- .../content/form/_privacy_toggle.html.erb | 6 +++-- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/app/views/content/_share.html.erb b/app/views/content/_share.html.erb index cf6d1b33..fdca8d89 100644 --- a/app/views/content/_share.html.erb +++ b/app/views/content/_share.html.erb @@ -1,21 +1,29 @@