breeze_cms 0.9.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +24 -0
- data/Rakefile +6 -0
- data/app/assets/config/breeze_manifest.js +2 -0
- data/app/assets/images/breeze/breeze_logo.png +0 -0
- data/app/assets/images/breeze/card_preview/card_feature_box.png +0 -0
- data/app/assets/images/breeze/card_preview/card_feature_normal.png +0 -0
- data/app/assets/images/breeze/card_preview/card_full_image.png +0 -0
- data/app/assets/images/breeze/card_preview/card_gap_square.png +0 -0
- data/app/assets/images/breeze/card_preview/card_large_image.png +0 -0
- data/app/assets/images/breeze/card_preview/card_normal_round.png +0 -0
- data/app/assets/images/breeze/card_preview/card_normal_square.png +0 -0
- data/app/assets/images/breeze/card_preview/card_wide_square.png +0 -0
- data/app/assets/images/breeze/card_preview/form_field.png +0 -0
- data/app/assets/images/breeze/home.jpg +0 -0
- data/app/assets/images/breeze/section_preview/blog_header.png +0 -0
- data/app/assets/images/breeze/section_preview/form_section.png +0 -0
- data/app/assets/images/breeze/section_preview/section_cards.png +0 -0
- data/app/assets/images/breeze/section_preview/section_feature.png +0 -0
- data/app/assets/images/breeze/section_preview/section_full_image.png +0 -0
- data/app/assets/images/breeze/section_preview/section_full_up.png +0 -0
- data/app/assets/images/breeze/section_preview/section_half_image.png +0 -0
- data/app/assets/images/breeze/section_preview/section_large_image.png +0 -0
- data/app/assets/images/breeze/section_preview/section_news.png +0 -0
- data/app/assets/images/breeze/section_preview/section_slider.png +0 -0
- data/app/assets/images/breeze/section_preview/section_small_image.png +0 -0
- data/app/assets/images/breeze/section_preview/section_spacer.png +0 -0
- data/app/assets/images/breeze/section_preview/section_text.png +0 -0
- data/app/assets/javascript/breeze_application.js.rb +101 -0
- data/app/assets/javascript/marked.js +6 -0
- data/app/assets/stylesheets/breeze/breeze.css +3633 -0
- data/app/assets/stylesheets/breeze/breeze.email.css +1344 -0
- data/app/assets/stylesheets/breeze.tailwind.css +2 -0
- data/app/assets/stylesheets/breeze_tailwind_styles.css +21 -0
- data/app/assets/stylesheets/tailwind_base.css +3 -0
- data/app/controllers/breeze/application_controller.rb +4 -0
- data/app/controllers/breeze/breeze_controller.rb +16 -0
- data/app/controllers/breeze/cards_controller.rb +58 -0
- data/app/controllers/breeze/changes_controller.rb +45 -0
- data/app/controllers/breeze/form_controller.rb +67 -0
- data/app/controllers/breeze/images_controller.rb +100 -0
- data/app/controllers/breeze/pages_controller.rb +66 -0
- data/app/controllers/breeze/sections_controller.rb +96 -0
- data/app/controllers/breeze/styles_controller.rb +11 -0
- data/app/controllers/breeze/translations_controller.rb +56 -0
- data/app/controllers/breeze/view_controller.rb +10 -0
- data/app/helpers/breeze/breeze_helper.rb +54 -0
- data/app/helpers/breeze/cards_helper.rb +11 -0
- data/app/helpers/breeze/changes_helper.rb +29 -0
- data/app/helpers/breeze/form_helper.rb +5 -0
- data/app/helpers/breeze/images_helper.rb +57 -0
- data/app/helpers/breeze/options_helper.rb +120 -0
- data/app/helpers/breeze/pages_helper.rb +5 -0
- data/app/helpers/breeze/sections_helper.rb +14 -0
- data/app/helpers/breeze/styles_helper.rb +4 -0
- data/app/helpers/breeze/translations_helper.rb +14 -0
- data/app/helpers/breeze/view_helper.rb +74 -0
- data/app/jobs/breeze/application_job.rb +4 -0
- data/app/mailers/breeze/application_mailer.rb +6 -0
- data/app/models/breeze/active_base.rb +34 -0
- data/app/models/breeze/active_yaml.rb +143 -0
- data/app/models/breeze/card.rb +90 -0
- data/app/models/breeze/card_style.rb +12 -0
- data/app/models/breeze/change_set.rb +58 -0
- data/app/models/breeze/image.rb +104 -0
- data/app/models/breeze/option_definition.rb +43 -0
- data/app/models/breeze/page.rb +97 -0
- data/app/models/breeze/page_style.rb +12 -0
- data/app/models/breeze/section.rb +137 -0
- data/app/models/breeze/section_style.rb +17 -0
- data/app/models/breeze/shared_base.rb +20 -0
- data/app/models/breeze/style.rb +17 -0
- data/app/models/breeze/translation.rb +83 -0
- data/app/models/breeze/view_base.rb +134 -0
- data/app/views/breeze/cards/index.haml +84 -0
- data/app/views/breeze/changes/index.haml +52 -0
- data/app/views/breeze/form/_editor.haml +33 -0
- data/app/views/breeze/form/form.haml +8 -0
- data/app/views/breeze/images/_editor.haml +144 -0
- data/app/views/breeze/images/index.haml +83 -0
- data/app/views/breeze/images/new.haml +12 -0
- data/app/views/breeze/images/show.haml +60 -0
- data/app/views/breeze/pages/_sections.rabl +4 -0
- data/app/views/breeze/pages/index.haml +49 -0
- data/app/views/breeze/pages/show.haml +85 -0
- data/app/views/breeze/sections/_option_form_date.haml +4 -0
- data/app/views/breeze/sections/_option_form_select.haml +4 -0
- data/app/views/breeze/sections/_option_form_text.haml +4 -0
- data/app/views/breeze/sections/_overlay.haml +33 -0
- data/app/views/breeze/sections/_section.rabl +5 -0
- data/app/views/breeze/sections/_sections_pagination.haml +29 -0
- data/app/views/breeze/sections/index.haml +88 -0
- data/app/views/breeze/sections/new.haml +12 -0
- data/app/views/breeze/sections/select_card_template.haml +13 -0
- data/app/views/breeze/sections/select_template.haml +15 -0
- data/app/views/breeze/sections/show.haml +91 -0
- data/app/views/breeze/styles/_options.haml +9 -0
- data/app/views/breeze/styles/index.haml +84 -0
- data/app/views/breeze/translations/_row.haml +29 -0
- data/app/views/breeze/translations/show.haml +79 -0
- data/app/views/breeze/view/_blog_header.haml +13 -0
- data/app/views/breeze/view/_form_section.haml +21 -0
- data/app/views/breeze/view/_section_cards.haml +17 -0
- data/app/views/breeze/view/_section_feature.haml +13 -0
- data/app/views/breeze/view/_section_full_image.haml +10 -0
- data/app/views/breeze/view/_section_full_up.haml +11 -0
- data/app/views/breeze/view/_section_half_image.haml +13 -0
- data/app/views/breeze/view/_section_large_image.haml +13 -0
- data/app/views/breeze/view/_section_news.haml +16 -0
- data/app/views/breeze/view/_section_slider.haml +51 -0
- data/app/views/breeze/view/_section_small_image.haml +11 -0
- data/app/views/breeze/view/_section_spacer.haml +1 -0
- data/app/views/breeze/view/_section_text.haml +17 -0
- data/app/views/breeze/view/cards/_card_feature_box.haml +13 -0
- data/app/views/breeze/view/cards/_card_feature_normal.haml +7 -0
- data/app/views/breeze/view/cards/_card_full_image.haml +10 -0
- data/app/views/breeze/view/cards/_card_gap_square.haml +11 -0
- data/app/views/breeze/view/cards/_card_large_image.haml +6 -0
- data/app/views/breeze/view/cards/_card_normal_round.haml +8 -0
- data/app/views/breeze/view/cards/_card_normal_square.haml +9 -0
- data/app/views/breeze/view/cards/_card_wide_square.haml +8 -0
- data/app/views/breeze/view/cards/_form_field.haml +8 -0
- data/app/views/breeze/view/elements/_button.haml +4 -0
- data/app/views/breeze/view/page.haml +2 -0
- data/app/views/layouts/breeze/_header.haml +37 -0
- data/app/views/layouts/breeze/_messages.haml +28 -0
- data/app/views/layouts/breeze/application.haml +20 -0
- data/app/views/layouts/mailer.html.haml +8 -0
- data/app/views/layouts/mailer.text.erb +1 -0
- data/config/breeze/card_styles.yml +129 -0
- data/config/breeze/option_definitions.yml +129 -0
- data/config/breeze/page_styles.yml +12 -0
- data/config/breeze/section_styles.yml +199 -0
- data/config/initializers/breeze.rb +13 -0
- data/config/initializers/rabl.rb +31 -0
- data/config/initializers/simple_form.rb +212 -0
- data/config/routes.rb +40 -0
- data/config/tailwind.config.js +17 -0
- data/config/tailwind.email.js +14 -0
- data/lib/breeze/engine.rb +97 -0
- data/lib/breeze/shared_helper.rb +44 -0
- data/lib/breeze/version.rb +3 -0
- data/lib/breeze.rb +104 -0
- data/lib/generators/breeze/install/install_generator.rb +19 -0
- data/lib/generators/breeze/install/templates/empty.yml +1 -0
- data/lib/generators/breeze/install/templates/initializer.rb +70 -0
- data/lib/generators/breeze/update/update_generator.rb +11 -0
- data/lib/tasks/condense.rake +60 -0
- data/lib/tasks/consistency.rake +84 -0
- metadata +371 -0
@@ -0,0 +1,104 @@
|
|
1
|
+
require "mini_magick"
|
2
|
+
require "fileutils"
|
3
|
+
|
4
|
+
module Breeze
|
5
|
+
class Image < ActiveBase
|
6
|
+
|
7
|
+
set_root_path Rails.root
|
8
|
+
|
9
|
+
fields :name , :tags , :type , :size , :height , :width
|
10
|
+
|
11
|
+
def change_name
|
12
|
+
name
|
13
|
+
end
|
14
|
+
|
15
|
+
def aspect_ratio
|
16
|
+
ratio = self.ratio
|
17
|
+
ratios = (1..9).collect{ |i| ((ratio * i) - (ratio * i).round(0)).abs }
|
18
|
+
min , min_index = ratios.each_with_index.min
|
19
|
+
[(ratio * (min_index + 1) ).round(0).to_i , (min_index + 1) ]
|
20
|
+
end
|
21
|
+
|
22
|
+
def ratio
|
23
|
+
return 0 unless self.height
|
24
|
+
self.width.to_f / self.height
|
25
|
+
end
|
26
|
+
|
27
|
+
def copy()
|
28
|
+
image = Image.new_image_for( name: "#{name}_copy" , type: type ,
|
29
|
+
tags: (tags || "") , width: width ,
|
30
|
+
height: height, size: size )
|
31
|
+
FileUtils.cp full_filename , image.full_filename
|
32
|
+
image
|
33
|
+
end
|
34
|
+
|
35
|
+
def scale( new_size )
|
36
|
+
mini = MiniMagick::Image.new( full_filename)
|
37
|
+
mini.resize( new_size.to_s + "%")
|
38
|
+
init_file_size
|
39
|
+
end
|
40
|
+
|
41
|
+
def crop( to_size )
|
42
|
+
mini = MiniMagick::Image.new(full_filename)
|
43
|
+
mini.crop( to_size )
|
44
|
+
init_file_size
|
45
|
+
end
|
46
|
+
#save an io as new image. The filename is the id, type taken from io
|
47
|
+
def self.create_new(name , tags, io)
|
48
|
+
original , end_ = io.original_filename.split("/").last.split(".")
|
49
|
+
magick_image = MiniMagick::Image.read(io).auto_orient
|
50
|
+
ending = magick_image.type.downcase
|
51
|
+
ending = "jpg" if ending == "jpeg"
|
52
|
+
name = original if( name.blank? )
|
53
|
+
image = self.new_image_for( name: name , type: ending , tags: (tags || "") ,
|
54
|
+
width: magick_image.width, height: magick_image.height ,
|
55
|
+
size: (magick_image.size/1024).to_i )
|
56
|
+
magick_image.write(image.full_filename)
|
57
|
+
image
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.new_image_for( image_data )
|
61
|
+
new_id = Image.append(image_data)
|
62
|
+
Image.new(image_data)
|
63
|
+
end
|
64
|
+
def destroy(editor)
|
65
|
+
File.delete self.full_filename
|
66
|
+
delete_save!(editor)
|
67
|
+
end
|
68
|
+
|
69
|
+
def asset_name
|
70
|
+
Breeze.images_dir + "/" + self.id.to_s + "." + self.type
|
71
|
+
end
|
72
|
+
|
73
|
+
def full_filename
|
74
|
+
full_filename = self.id.to_s + "." + self.type
|
75
|
+
Rails.root.join(Image.asset_root, full_filename)
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.transform
|
79
|
+
Image.all.each do |image|
|
80
|
+
last = image.name.split.last
|
81
|
+
image.tags = ""
|
82
|
+
["wide", "small" , "big" , "room"].each do |tag|
|
83
|
+
if(last == tag)
|
84
|
+
image.name = image.name.gsub(last,"").strip
|
85
|
+
image.tags = last
|
86
|
+
end
|
87
|
+
end
|
88
|
+
image.save
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def init_file_size
|
93
|
+
magick_image = MiniMagick::Image.open(full_filename)
|
94
|
+
self.width = magick_image.width
|
95
|
+
self.height = magick_image.height
|
96
|
+
self.size = (magick_image.size/1024).to_i
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.asset_root
|
100
|
+
"app/assets/images/" + Breeze.images_dir
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Breeze
|
2
|
+
|
3
|
+
# Quite simple mapping from name to usually a selection of values.
|
4
|
+
# Options have type that can be set but usually is inferred from
|
5
|
+
# wether there is one values (select) other wise text.
|
6
|
+
# date is also supported.
|
7
|
+
#
|
8
|
+
# a corresponding ./app/views/breeze/sections/_option_form_TYPE.haml
|
9
|
+
# nust exist to render the type.
|
10
|
+
#
|
11
|
+
# Also values may be provided by a module function/attribute on Breeze.
|
12
|
+
# eg option text_color (also shade_color) have a Breeze.text_color that return a
|
13
|
+
# hash. In this case so it is easy to customize the colors of the app.
|
14
|
+
#
|
15
|
+
class OptionDefinition < SharedBase
|
16
|
+
|
17
|
+
set_root_path Rails.root.join(Breeze.data_dir)
|
18
|
+
|
19
|
+
fields :name , :default , :description , :values , :type
|
20
|
+
|
21
|
+
def type
|
22
|
+
return data[:type] unless data[:type].blank?
|
23
|
+
if has_values?
|
24
|
+
"select"
|
25
|
+
else
|
26
|
+
"text"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def has_values?
|
31
|
+
return true if Breeze.respond_to?( name.to_sym )
|
32
|
+
return false if data[:values].nil?
|
33
|
+
! data[:values].empty?
|
34
|
+
end
|
35
|
+
|
36
|
+
def values
|
37
|
+
return Breeze.send(name.to_sym).keys if Breeze.respond_to?( name.to_sym )
|
38
|
+
return [] unless has_values?
|
39
|
+
data[:values].split(" ")
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Breeze
|
2
|
+
class Page < ViewBase
|
3
|
+
set_root_path Rails.root.join(Breeze.data_dir)
|
4
|
+
|
5
|
+
fields :name , :type , :options, :redirects , :section_template
|
6
|
+
|
7
|
+
alias :template :section_template
|
8
|
+
|
9
|
+
def change_name
|
10
|
+
self.name
|
11
|
+
end
|
12
|
+
|
13
|
+
def set_name new_name
|
14
|
+
new_name = Page.fix_name(new_name)
|
15
|
+
olds = self.redirects.to_s.split(" ")
|
16
|
+
olds << self.name unless olds.include?(self.name)
|
17
|
+
self.redirects = olds.join(" ")
|
18
|
+
self.name = new_name
|
19
|
+
end
|
20
|
+
|
21
|
+
def missing_translations
|
22
|
+
sum = 0
|
23
|
+
sections.collect{ |s | sum += s.missing_translations }
|
24
|
+
sum
|
25
|
+
end
|
26
|
+
|
27
|
+
def sections
|
28
|
+
Section.find_all(:page_id, id).sort_by{|obj| obj.index }
|
29
|
+
end
|
30
|
+
|
31
|
+
def sections_update
|
32
|
+
last_update_for( sections )
|
33
|
+
end
|
34
|
+
|
35
|
+
def template_style
|
36
|
+
PageStyle.find_by_type( type )
|
37
|
+
end
|
38
|
+
|
39
|
+
def new_section(section_template = nil)
|
40
|
+
section_template = "section_spacer" if section_template.blank?
|
41
|
+
section = Section.new_section(section_template, self.id , sections.length + 1)
|
42
|
+
section
|
43
|
+
end
|
44
|
+
|
45
|
+
def remove_section(section)
|
46
|
+
from_index = section.index
|
47
|
+
@sections.delete_at(from_index)
|
48
|
+
@content.delete_at(from_index)
|
49
|
+
@sections.each_with_index do |section, index|
|
50
|
+
section.set_index(index)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def first_template
|
55
|
+
return "none" unless @content[0]
|
56
|
+
@content[0]["template"]
|
57
|
+
end
|
58
|
+
|
59
|
+
def reset_index
|
60
|
+
sections.each_with_index{|section, index| section.index = index + 1}
|
61
|
+
end
|
62
|
+
|
63
|
+
def delete(editor)
|
64
|
+
sections.each {|section| section.delete(editor) }
|
65
|
+
delete_save!(editor)
|
66
|
+
end
|
67
|
+
|
68
|
+
def save(editor)
|
69
|
+
olds = self.redirects.to_s.split(" ")
|
70
|
+
olds.delete( self.name.to_s )
|
71
|
+
self.redirects = olds.join(" ")
|
72
|
+
super
|
73
|
+
end
|
74
|
+
|
75
|
+
def previous_page
|
76
|
+
return Page.all.last if(self.id == 1)
|
77
|
+
Page.all[self.id - 2]
|
78
|
+
end
|
79
|
+
|
80
|
+
def next_page
|
81
|
+
all = Page.all
|
82
|
+
return all.first if(self.id == all.length)
|
83
|
+
all[self.id]
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.fix_name(name)
|
87
|
+
name.gsub(" ", "_").downcase
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.new_page(name , type)
|
91
|
+
data = { name: self.fix_name(name) , updated_at: Time.now , type: type}
|
92
|
+
new_id = Page.append(data)
|
93
|
+
Page.new(data)
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
module Breeze
|
2
|
+
class Section < ViewBase
|
3
|
+
|
4
|
+
set_root_path Rails.root.join(Breeze.data_dir)
|
5
|
+
|
6
|
+
fields :id , :page_id , :index
|
7
|
+
fields :template , :card_template
|
8
|
+
fields :header, :text , :image_name
|
9
|
+
|
10
|
+
def page_name
|
11
|
+
page ? page.name : "missing page"
|
12
|
+
end
|
13
|
+
|
14
|
+
def change_name
|
15
|
+
"#{page_name}:#{header}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def index_name
|
19
|
+
"#{self.index}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def object_type
|
23
|
+
"Section"
|
24
|
+
end
|
25
|
+
|
26
|
+
def missing_translations
|
27
|
+
sum = 0
|
28
|
+
cards.collect{ |s | sum += s.missing_translations }
|
29
|
+
Breeze.language_strings.each do |lang|
|
30
|
+
sum += 1 if get_translation(lang)&.is_old?
|
31
|
+
end
|
32
|
+
sum
|
33
|
+
end
|
34
|
+
|
35
|
+
def cards
|
36
|
+
Card.find_all(:section_id, id).sort_by{|obj| obj.index }
|
37
|
+
end
|
38
|
+
|
39
|
+
def cards_update
|
40
|
+
last_update_for( cards )
|
41
|
+
end
|
42
|
+
|
43
|
+
def template_style
|
44
|
+
SectionStyle.find_by_template( template )
|
45
|
+
end
|
46
|
+
|
47
|
+
def card_template_style
|
48
|
+
CardStyle.find_by_template( card_template )
|
49
|
+
end
|
50
|
+
|
51
|
+
def set_template(new_template)
|
52
|
+
self.template = new_template
|
53
|
+
new_style = template_style
|
54
|
+
if(new_style.has_cards?)
|
55
|
+
if card_template.blank?
|
56
|
+
self.card_template = CardStyle.first.template
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def allowed_fields
|
62
|
+
super + [:page_id]
|
63
|
+
end
|
64
|
+
|
65
|
+
def has_cards?
|
66
|
+
template_style.has_cards?
|
67
|
+
end
|
68
|
+
|
69
|
+
def move_up
|
70
|
+
swap_index_with(previous_section)
|
71
|
+
end
|
72
|
+
|
73
|
+
def move_down
|
74
|
+
swap_index_with(next_section)
|
75
|
+
end
|
76
|
+
|
77
|
+
def previous_section
|
78
|
+
page.sections.find{|s| s.index == index - 1 }
|
79
|
+
end
|
80
|
+
|
81
|
+
def next_section
|
82
|
+
page.sections.find{|s| s.index == index + 1 }
|
83
|
+
end
|
84
|
+
|
85
|
+
def new_card
|
86
|
+
card = Card.new_card(card_template, self.id , cards.length + 1)
|
87
|
+
card
|
88
|
+
end
|
89
|
+
|
90
|
+
def reset_index
|
91
|
+
cards.each_with_index{|card, index| card.index = index + 1}
|
92
|
+
end
|
93
|
+
|
94
|
+
def delete(editor)
|
95
|
+
cards.each {|card| card.delete(editor) }
|
96
|
+
delete_translations(editor)
|
97
|
+
delete_save!(editor)
|
98
|
+
end
|
99
|
+
|
100
|
+
def delete_and_reset_index(editor)
|
101
|
+
delete(editor)
|
102
|
+
Page.find(page_id).reset_index
|
103
|
+
Section.save_all
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.new_section(template , page_id , index)
|
107
|
+
data = { template: template , index: index , page_id: page_id}
|
108
|
+
style = SectionStyle.find_by_template( template)
|
109
|
+
style.fields.each do |key|
|
110
|
+
data[key.to_sym] = key.upcase
|
111
|
+
end unless style.fields.blank?
|
112
|
+
if(style.has_cards?)
|
113
|
+
data[:card_template] = CardStyle.first.template
|
114
|
+
end
|
115
|
+
new_id = Section.append(data)
|
116
|
+
s = Section.new(data)
|
117
|
+
s.add_default_options
|
118
|
+
s
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.fix_cards
|
122
|
+
Section.all.each do |section|
|
123
|
+
next if section.template_style.has_cards?
|
124
|
+
puts "#{section.id}: #{section.card_template}"
|
125
|
+
section.card_template = nil if section.card_template
|
126
|
+
end
|
127
|
+
Section.save_all
|
128
|
+
nil
|
129
|
+
end
|
130
|
+
|
131
|
+
def self.reload
|
132
|
+
res = super()
|
133
|
+
self.fix_translations
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Breeze
|
2
|
+
class SectionStyle < Style
|
3
|
+
|
4
|
+
set_root_path Rails.root.join(Breeze.data_dir)
|
5
|
+
|
6
|
+
fields :template , :text , :header, :fields , :cards
|
7
|
+
|
8
|
+
def has_cards?
|
9
|
+
cards
|
10
|
+
end
|
11
|
+
|
12
|
+
def section_preview
|
13
|
+
"breeze/section_preview/" + template
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Breeze
|
2
|
+
# shared data across engine and app
|
3
|
+
# takes a little footwork, as seen below
|
4
|
+
# and does not work with saving anymore.
|
5
|
+
|
6
|
+
class SharedBase < ActiveYaml
|
7
|
+
|
8
|
+
def self.load_file
|
9
|
+
# does super work ? Copied, wet wet wet
|
10
|
+
mod , filename = self.name.split("::").collect{|p| p.underscore}
|
11
|
+
fullname = mod + "/" + filename.tableize + ".yml"
|
12
|
+
res = YAML.load(File.read(File.join(self.path , fullname )))
|
13
|
+
|
14
|
+
breeze_path = Breeze::Engine.root.join("config")
|
15
|
+
breeze_res = YAML.load(File.read(File.join(breeze_path , fullname )))
|
16
|
+
|
17
|
+
res + breeze_res
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Breeze
|
2
|
+
class Style < SharedBase
|
3
|
+
|
4
|
+
fields :options
|
5
|
+
|
6
|
+
def options_definitions
|
7
|
+
option_defs = []
|
8
|
+
options.each do |name|
|
9
|
+
option = OptionDefinition.find_by_name(name)
|
10
|
+
raise "no option for #{name}:#{name.class}" if option.blank?
|
11
|
+
option_defs << option
|
12
|
+
end if options
|
13
|
+
option_defs
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Breeze
|
2
|
+
class Translation < ActiveBase
|
3
|
+
|
4
|
+
set_root_path Rails.root.join(Breeze.data_dir)
|
5
|
+
|
6
|
+
fields :id
|
7
|
+
fields :objectid , :object_type # poly: card or section (id without _, no association)
|
8
|
+
fields :language # the language for which the is a translation
|
9
|
+
fields :text , :header, :sub_header #actual text fields
|
10
|
+
|
11
|
+
def initialize(data)
|
12
|
+
super(data)
|
13
|
+
raise "no object type" unless self.object_type
|
14
|
+
raise "no object id" unless lang = self.objectid
|
15
|
+
raise "no language" unless lang = self.language
|
16
|
+
raise "not configured language #{lang}" unless Breeze.has_language(lang)
|
17
|
+
end
|
18
|
+
|
19
|
+
def object
|
20
|
+
clazz = "Breeze::#{object_type}".constantize
|
21
|
+
clazz.find( objectid )
|
22
|
+
end
|
23
|
+
|
24
|
+
def is_old?
|
25
|
+
return true unless self.updated_at
|
26
|
+
object.updated_at > self.updated_at
|
27
|
+
end
|
28
|
+
|
29
|
+
def change_name
|
30
|
+
"Translation: #{object.change_name}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def update(hash , user)
|
34
|
+
return unless hash
|
35
|
+
[:text , :header ].each do |key|
|
36
|
+
data[key] = hash[key] if hash.has_key?(key)
|
37
|
+
end
|
38
|
+
add_save(user)
|
39
|
+
end
|
40
|
+
|
41
|
+
class << self
|
42
|
+
|
43
|
+
def fill_data(object, data = {})
|
44
|
+
data[:text] = object.text
|
45
|
+
data[:header] = object.header
|
46
|
+
data[:objectid] = object.id
|
47
|
+
data[:object_type] = object.object_type
|
48
|
+
data
|
49
|
+
end
|
50
|
+
|
51
|
+
def find_translation(objectid , object_type, language)
|
52
|
+
find_all(:objectid, objectid).each do |o|
|
53
|
+
return o if (objectid == o.objectid ) &&
|
54
|
+
(object_type == o.object_type) &&
|
55
|
+
(language == o.language)
|
56
|
+
end
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
|
60
|
+
def ensure_translation(object , language)
|
61
|
+
found = self.find_translation(object.id , object.object_type , language)
|
62
|
+
return nil if found
|
63
|
+
data = fill_data(object)
|
64
|
+
data[:updated_at] = object.updated_at - 1.day
|
65
|
+
data[:language] = language
|
66
|
+
data[:id] = "#{object.object_type}_#{object.id}"
|
67
|
+
data
|
68
|
+
end
|
69
|
+
|
70
|
+
def new_object_translation(object, data)
|
71
|
+
self.fill_data(object,data)
|
72
|
+
self.new_translation(data)
|
73
|
+
end
|
74
|
+
|
75
|
+
# append data and create new object.
|
76
|
+
def new_translation( data )
|
77
|
+
new_id = Translation.append(data)
|
78
|
+
Translation.new(data)
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
module Breeze
|
2
|
+
|
3
|
+
# base class for viewable elements: ie page, section and casrd
|
4
|
+
# they share the template idea, options , change tracking,
|
5
|
+
# and the fact that they persist in ActiveYaml
|
6
|
+
|
7
|
+
class ViewBase < ActiveBase
|
8
|
+
|
9
|
+
fields :options , :image_id
|
10
|
+
|
11
|
+
def header_text(lang)
|
12
|
+
return self.header if lang.blank?
|
13
|
+
get_translation(lang).header
|
14
|
+
end
|
15
|
+
|
16
|
+
def text_text(lang)
|
17
|
+
return self.text if lang.blank?
|
18
|
+
get_translation(lang).text
|
19
|
+
end
|
20
|
+
|
21
|
+
def type_id
|
22
|
+
"#{object_type}_#{self.id}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def last_update_for(elements)
|
26
|
+
last = Time.now
|
27
|
+
last_section = nil
|
28
|
+
elements.each do |section|
|
29
|
+
if( section.updated_at < last )
|
30
|
+
last = section.updated_at
|
31
|
+
last_section = section
|
32
|
+
end
|
33
|
+
end
|
34
|
+
last_section
|
35
|
+
end
|
36
|
+
|
37
|
+
def has_option?(option)
|
38
|
+
safe_options.has_key?(option) and !safe_options[option].blank?
|
39
|
+
end
|
40
|
+
|
41
|
+
def option_definitions
|
42
|
+
template_style.options_definitions
|
43
|
+
end
|
44
|
+
|
45
|
+
def option(name)
|
46
|
+
opts = safe_options
|
47
|
+
opts[name]
|
48
|
+
end
|
49
|
+
|
50
|
+
def safe_options
|
51
|
+
return data[:options] unless data[:options].blank?
|
52
|
+
data[:options] = {}
|
53
|
+
end
|
54
|
+
|
55
|
+
def set_option( option , value)
|
56
|
+
if( option.ends_with?"_date" )
|
57
|
+
puts "date is #{value}"
|
58
|
+
year = value[:year] || Time.new.year
|
59
|
+
value = Time.new( year.to_i , value[:month] , value[:day]).to_date
|
60
|
+
end
|
61
|
+
safe_options[option] = value
|
62
|
+
end
|
63
|
+
|
64
|
+
def add_default_options( definitions = nil )
|
65
|
+
definitions = option_definitions if definitions.nil?
|
66
|
+
definitions.each do |option|
|
67
|
+
next unless option.default
|
68
|
+
set_option( option.name , option.default)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def update(hash)
|
73
|
+
return unless hash
|
74
|
+
hash.each do |key , value|
|
75
|
+
value = value.to_i if key.to_s.include?("_id")
|
76
|
+
key = key.to_sym
|
77
|
+
raise "unsuported field :#{key} for #{template}:#{allowed_fields}" unless allowed_fields.include?(key)
|
78
|
+
if(! data[key].nil? ) # first setting ok, types not (yet?) specified
|
79
|
+
if( data[key].class != value.class )
|
80
|
+
raise "Type mismatch #{key} #{data[key].class}!=#{value.class}"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
data[key] = value
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def update_options( options )
|
88
|
+
return unless options
|
89
|
+
option_definitions.each do |option|
|
90
|
+
set_option(option.name, options[option.name])
|
91
|
+
end
|
92
|
+
end
|
93
|
+
#other may be nil
|
94
|
+
def swap_index_with(other)
|
95
|
+
return unless other
|
96
|
+
old_index = self.index
|
97
|
+
self.index = other.index
|
98
|
+
other.index = old_index
|
99
|
+
end
|
100
|
+
|
101
|
+
def allowed_fields
|
102
|
+
template_style.fields.collect{|f| f.to_sym}
|
103
|
+
end
|
104
|
+
|
105
|
+
def image_old
|
106
|
+
Image.find_by_name(self.image_name)
|
107
|
+
end
|
108
|
+
|
109
|
+
def get_translation(lang)
|
110
|
+
Translation.find_translation(self.id , self.object_type , lang)
|
111
|
+
end
|
112
|
+
|
113
|
+
def delete_translations(editor)
|
114
|
+
Breeze.language_strings.each do |lang|
|
115
|
+
trans = Translation.find_translation(self.id, self.object_type , lang)
|
116
|
+
trans.delete_save!(editor) if trans
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.fix_translations
|
121
|
+
create = []
|
122
|
+
Breeze.language_strings.each do |lang|
|
123
|
+
self.all.each do |object|
|
124
|
+
data = Translation.ensure_translation(object , lang)
|
125
|
+
(create << data) unless data.nil?
|
126
|
+
end
|
127
|
+
end
|
128
|
+
#puts "#{self.name} create #{create.length} Translations"
|
129
|
+
create.each{ |data| Translation.new_translation(data) }
|
130
|
+
Translation.save_all
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
end
|