krant 0.1.0
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 +7 -0
- data/.gitignore +13 -0
- data/.rspec +1 -0
- data/.rubocop.yml +14 -0
- data/.travis.yml +16 -0
- data/Appraisals +14 -0
- data/CHANGELOG.md +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +192 -0
- data/Rakefile +4 -0
- data/admin/krant/broadcast_messages.rb +56 -0
- data/app/assets/stylesheets/krant/active_admin.scss +2 -0
- data/app/assets/stylesheets/krant/active_admin/broadcast_messages.scss +31 -0
- data/app/assets/stylesheets/krant/active_admin/news_list.scss +19 -0
- data/app/models/krant/broadcast_message.rb +10 -0
- data/app/models/krant/broadcast_message_translation.rb +6 -0
- data/app/models/krant/last_seen_state.rb +6 -0
- data/app/models/krant/news_item.rb +35 -0
- data/app/models/krant/translated_broadcast_message.rb +47 -0
- data/bin/console +14 -0
- data/bin/rails +12 -0
- data/bin/rspec +17 -0
- data/bin/setup +8 -0
- data/config/locales/de.yml +23 -0
- data/config/locales/en.yml +23 -0
- data/db/migrate/20171214095614_create_krant_broadcast_messages.rb +9 -0
- data/db/migrate/20171214095622_create_krant_broadcast_message_translations.rb +12 -0
- data/db/migrate/20171214175840_create_krant_news_items.rb +10 -0
- data/db/migrate/20171215080737_create_krant_last_seen_states.rb +10 -0
- data/gemfiles/rails_4.2_active_admin_1.0.0.pre4.gemfile +8 -0
- data/gemfiles/rails_4.2_active_admin_1.0.gemfile +8 -0
- data/gemfiles/rails_4.2_active_admin_1.1.gemfile +8 -0
- data/krant.gemspec +38 -0
- data/lib/krant.rb +57 -0
- data/lib/krant/engine.rb +14 -0
- data/lib/krant/news.rb +102 -0
- data/lib/krant/tasks.rb +26 -0
- data/lib/krant/version.rb +3 -0
- data/lib/krant/views/header_with_broadcast_messages.rb +20 -0
- data/lib/krant/views/news_list.rb +36 -0
- metadata +281 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
$krant-broadcast-message-bar-color: #f6efce !default;
|
2
|
+
$krant-broadcast-message-bar-border-color: #dedede !default;
|
3
|
+
|
4
|
+
.krant-broadcast-messages {
|
5
|
+
&-table-text {
|
6
|
+
white-space: nowrap;
|
7
|
+
|
8
|
+
&-locale,
|
9
|
+
&-translation {
|
10
|
+
display: inline-block;
|
11
|
+
}
|
12
|
+
|
13
|
+
&-locale {
|
14
|
+
font-weight: bold;
|
15
|
+
min-width: 2em;
|
16
|
+
}
|
17
|
+
|
18
|
+
&-translation {
|
19
|
+
vertical-align: top;
|
20
|
+
white-space: normal;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
&-bar {
|
25
|
+
background-color: $krant-broadcast-message-bar-color;
|
26
|
+
border-left: solid 1px $krant-broadcast-message-bar-border-color;
|
27
|
+
border-right: solid 1px $krant-broadcast-message-bar-border-color;
|
28
|
+
padding: 10px $horizontal-page-margin;
|
29
|
+
text-align: center;
|
30
|
+
}
|
31
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
$krant-news-list-item-marker-color: #eee !default;
|
2
|
+
$krant-unseen-news-list-item-marker-color: #63a0e8 !default;
|
3
|
+
$krant-unseen-news-list-item-marker-width: 2px !default;
|
4
|
+
$krant-unseen-news-list-item-padding: 1em !default;
|
5
|
+
$krant-unseen-news-list-item-background-color: #eee !default;
|
6
|
+
|
7
|
+
.krant-news-list {
|
8
|
+
margin-left: -$krant-unseen-news-list-item-marker-width;
|
9
|
+
}
|
10
|
+
|
11
|
+
.krant-news-list-item {
|
12
|
+
border-left: solid $krant-unseen-news-list-item-marker-width $krant-news-list-item-marker-color;
|
13
|
+
margin-left: -$krant-unseen-news-list-item-padding;
|
14
|
+
padding: 0 $krant-unseen-news-list-item-padding;
|
15
|
+
|
16
|
+
&-unseen {
|
17
|
+
border-left: solid $krant-unseen-news-list-item-marker-width $krant-unseen-news-list-item-marker-color;
|
18
|
+
}
|
19
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Krant
|
2
|
+
# @api private
|
3
|
+
class NewsItem < ActiveRecord::Base
|
4
|
+
attr_accessor :template
|
5
|
+
attr_accessor :seen
|
6
|
+
|
7
|
+
def title
|
8
|
+
translated_attribute('title')
|
9
|
+
end
|
10
|
+
|
11
|
+
def text
|
12
|
+
translated_attribute('text')
|
13
|
+
end
|
14
|
+
|
15
|
+
def unseen?
|
16
|
+
!seen
|
17
|
+
end
|
18
|
+
|
19
|
+
def seen?
|
20
|
+
seen
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def translated_attribute(name)
|
26
|
+
attribute_translations(name).fetch(I18n.locale.to_sym) do
|
27
|
+
attribute_translations(name).fetch(I18n.default_locale.to_sym, '')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def attribute_translations(name)
|
32
|
+
template.fetch(name.to_sym, {})
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Krant
|
2
|
+
# @api private
|
3
|
+
class TranslatedBroadcastMessage
|
4
|
+
attr_reader :text
|
5
|
+
|
6
|
+
def initialize(text)
|
7
|
+
@text = text
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.active
|
11
|
+
Query.new.active
|
12
|
+
end
|
13
|
+
|
14
|
+
# @api private
|
15
|
+
class Query
|
16
|
+
def active
|
17
|
+
scope = BroadcastMessage.active
|
18
|
+
|
19
|
+
scope = with_translation(scope, 'current_locale', I18n.locale)
|
20
|
+
scope = with_translation(scope, 'default_locale', I18n.default_locale)
|
21
|
+
|
22
|
+
scope.map do |broadcast_message|
|
23
|
+
TranslatedBroadcastMessage.new(broadcast_message.current_locale_text.presence ||
|
24
|
+
broadcast_message.default_locale_text)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def with_translation(scope, name, locale)
|
31
|
+
table_alias = "#{name}_translations"
|
32
|
+
|
33
|
+
scope
|
34
|
+
.select("#{table_alias}.text as #{name}_text")
|
35
|
+
.joins(sanitize_sql(<<-SQL, locale))
|
36
|
+
LEFT JOIN krant_broadcast_message_translations #{table_alias}
|
37
|
+
ON #{table_alias}.broadcast_message_id = krant_broadcast_messages.id AND
|
38
|
+
#{table_alias}.locale = ?
|
39
|
+
SQL
|
40
|
+
end
|
41
|
+
|
42
|
+
def sanitize_sql(sql, interpolations)
|
43
|
+
ActiveRecord::Base.send(:sanitize_sql_array, [sql, interpolations])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "krant"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/rails
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application.
|
3
|
+
|
4
|
+
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
5
|
+
ENGINE_PATH = File.expand_path('../../lib/krant/engine', __FILE__)
|
6
|
+
|
7
|
+
# Set up gems listed in the Gemfile.
|
8
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
|
9
|
+
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
10
|
+
|
11
|
+
require 'rails/all'
|
12
|
+
require 'rails/engine/commands'
|
data/bin/rspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
#
|
4
|
+
# This file was generated by Bundler.
|
5
|
+
#
|
6
|
+
# The application 'rspec' is installed as part of a gem, and
|
7
|
+
# this file is here to facilitate running it.
|
8
|
+
#
|
9
|
+
|
10
|
+
require "pathname"
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
+
Pathname.new(__FILE__).realpath)
|
13
|
+
|
14
|
+
require "rubygems"
|
15
|
+
require "bundler/setup"
|
16
|
+
|
17
|
+
load Gem.bin_path("rspec-core", "rspec")
|
data/bin/setup
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
de:
|
2
|
+
krant:
|
3
|
+
admin:
|
4
|
+
broadcast_messages:
|
5
|
+
text_translation_label: "Text (%{locale_name}):"
|
6
|
+
news_menu_item:
|
7
|
+
unseen: "Neuigkeiten*"
|
8
|
+
no_unseen: "Neuigkeiten"
|
9
|
+
activerecord:
|
10
|
+
models:
|
11
|
+
# Required for ActiveAdmin navigation
|
12
|
+
broadcast_message:
|
13
|
+
one: "Broadcast Nachricht"
|
14
|
+
other: "Broadcast Nachrichten"
|
15
|
+
"krant/broadcast_message":
|
16
|
+
one: "Broadcast Nachricht"
|
17
|
+
other: "Broadcast Nachrichten"
|
18
|
+
attributes:
|
19
|
+
"krant/broadcast_message":
|
20
|
+
text: "Text"
|
21
|
+
active: "Aktiv"
|
22
|
+
created_at: "Erstellt am"
|
23
|
+
updated_at: "Geändert am"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
en:
|
2
|
+
krant:
|
3
|
+
admin:
|
4
|
+
broadcast_messages:
|
5
|
+
text_translation_label: "Text (%{locale_name}):"
|
6
|
+
news_menu_item:
|
7
|
+
unseen: "What's new*"
|
8
|
+
no_unseen: "What's new"
|
9
|
+
activerecord:
|
10
|
+
models:
|
11
|
+
# Required for ActiveAdmin navigation
|
12
|
+
broadcast_message:
|
13
|
+
one: "Broadcast Message"
|
14
|
+
other: "Broadcast Messages"
|
15
|
+
"krant/broadcast_message":
|
16
|
+
one: "Broadcast Message"
|
17
|
+
other: "Broadcast Messages"
|
18
|
+
attributes:
|
19
|
+
"krant/broadcast_message":
|
20
|
+
text: "Text"
|
21
|
+
active: "Active"
|
22
|
+
created_at: "Created at"
|
23
|
+
updated_at: "Updated at"
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateKrantBroadcastMessageTranslations < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :krant_broadcast_message_translations do |t|
|
4
|
+
t.belongs_to(:broadcast_message,
|
5
|
+
index: { name: 'index_krant_broadcast_message_translations_on_message_id' })
|
6
|
+
t.string :locale
|
7
|
+
t.text :text
|
8
|
+
|
9
|
+
t.timestamps null: false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/krant.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'krant/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'krant'
|
8
|
+
spec.version = Krant::VERSION
|
9
|
+
spec.authors = ['Tim Fischbach']
|
10
|
+
spec.email = ['tfischbach@codevise.de']
|
11
|
+
|
12
|
+
spec.summary = 'Display app news and broadcast messages in Active Admin.'
|
13
|
+
spec.homepage = 'https://github.com/codevise/krant'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
|
+
f.match(%r{^(test|spec|features)/})
|
18
|
+
end
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.required_ruby_version = '~> 2.1'
|
22
|
+
|
23
|
+
spec.add_development_dependency 'appraisal', '~> 2.2'
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.14'
|
25
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
+
spec.add_development_dependency 'rspec-rails', '~> 3.6'
|
27
|
+
spec.add_development_dependency 'combustion', '~> 0.7.0'
|
28
|
+
spec.add_development_dependency 'sqlite3', '~> 1.3'
|
29
|
+
spec.add_development_dependency 'capybara', '~> 2.15'
|
30
|
+
spec.add_development_dependency 'factory_bot_rails', '~> 4.8'
|
31
|
+
spec.add_development_dependency 'domino', '~> 0.7.0'
|
32
|
+
spec.add_development_dependency 'semmy', '~> 1.0'
|
33
|
+
spec.add_development_dependency 'timecop', '~> 0.7.1'
|
34
|
+
|
35
|
+
spec.add_runtime_dependency 'activeadmin', '~> 1.x'
|
36
|
+
spec.add_runtime_dependency 'rails', '~> 4.2'
|
37
|
+
spec.add_runtime_dependency 'kramdown', '~> 1.5'
|
38
|
+
end
|
data/lib/krant.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'krant/engine'
|
2
|
+
require 'krant/news'
|
3
|
+
require 'krant/version'
|
4
|
+
require 'krant/views/header_with_broadcast_messages'
|
5
|
+
require 'krant/views/news_list'
|
6
|
+
|
7
|
+
# Global settings
|
8
|
+
module Krant
|
9
|
+
# Determines for which locales text boxes should be displayed in the
|
10
|
+
# broadcast message edit form.
|
11
|
+
mattr_accessor :broadcast_message_locales
|
12
|
+
self.broadcast_message_locales = [:en, :de]
|
13
|
+
|
14
|
+
# Unshift to Active Admin load path.
|
15
|
+
def self.active_admin_load_path
|
16
|
+
Dir[Krant::Engine.root.join('admin')].first
|
17
|
+
end
|
18
|
+
|
19
|
+
# Adds a menu item to open a news page. Displays an indicator if
|
20
|
+
# there are unseen news items. Supports all parameters supported by
|
21
|
+
# `ActiveAdmin::Menu#add`. Required options:
|
22
|
+
#
|
23
|
+
# @param menu [ActiveAdmin::Menu] The menu object yielded by
|
24
|
+
# `ActiveAdmin::Namespace#build_menu`.
|
25
|
+
#
|
26
|
+
# @param news [Krant::News] The news collection to take news item
|
27
|
+
# from.
|
28
|
+
#
|
29
|
+
# @param url [Proc|String] Url of the news page.
|
30
|
+
def self.add_active_admin_news_menu_item_to(menu, news:, **options)
|
31
|
+
menu.add(label: -> { I18n.t('krant.admin.news_menu_item.unseen') },
|
32
|
+
id: 'krant_news_menu_item_unseen',
|
33
|
+
if: -> { news.unseen_items?(for_user: current_active_admin_user) },
|
34
|
+
html_options: { class: 'krant-news-menu-item krant-news-menu-item-unseen' },
|
35
|
+
**options)
|
36
|
+
|
37
|
+
menu.add(label: -> { I18n.t('krant.admin.news_menu_item.no_unseen') },
|
38
|
+
id: 'krant_news_menu_item_no_unseen',
|
39
|
+
if: -> { !news.unseen_items?(for_user: current_active_admin_user) },
|
40
|
+
html_options: { class: 'krant-news-menu-item krant-news-menu-item-no-unseen' },
|
41
|
+
**options)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Apply default settings to news page.
|
45
|
+
#
|
46
|
+
# @param page [ActiveAdmin::PageDSL] The admin page.
|
47
|
+
#
|
48
|
+
# @param news [Proc] Proc returing the news collection.
|
49
|
+
def self.active_admin_news_page(page, news:)
|
50
|
+
page.menu(false)
|
51
|
+
|
52
|
+
page.page_action(:seen, method: [:post]) do
|
53
|
+
news.call.seen_by!(current_active_admin_user)
|
54
|
+
render text: ''
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|