card 1.93.3 → 1.93.4
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/db/migrate/20170908114452_increase_text_size_for_delayed_jobs.rb +9 -0
- data/db/migrate_core_cards/data/cards/*header +2 -2
- data/lib/card/format/nest.rb +12 -5
- data/lib/card/format/nest/fetch.rb +1 -2
- data/lib/card/format/render.rb +2 -2
- data/lib/card/model/save_helper.rb +1 -1
- data/lib/card/set/format/haml_views.rb +7 -3
- data/lib/card/subcards.rb +27 -228
- data/lib/card/subcards/add.rb +121 -0
- data/lib/card/subcards/relate.rb +27 -0
- data/lib/card/subcards/remove.rb +42 -0
- data/lib/card/tasks/card/create.rake +35 -132
- data/lib/card/tasks/card/file_card_creator.rb +25 -0
- data/lib/card/tasks/card/file_card_creator/abstract_file_card.rb +44 -0
- data/lib/card/tasks/card/file_card_creator/abstract_file_card/migration_file.rb +49 -0
- data/lib/card/tasks/card/file_card_creator/abstract_file_card/ruby_file.rb +30 -0
- data/lib/card/tasks/card/file_card_creator/abstract_file_card/source_file.rb +36 -0
- data/lib/card/tasks/card/file_card_creator/haml_card.rb +42 -0
- data/lib/card/tasks/card/file_card_creator/output_helper.rb +50 -0
- data/lib/card/tasks/card/file_card_creator/script_card.rb +33 -0
- data/lib/card/tasks/card/file_card_creator/style_card.rb +25 -0
- data/lib/generators/card/template/template_generator.rb +1 -1
- data/mod/account/set/self/account_links.rb +1 -1
- data/mod/basic_formats/set/all/all_csv.rb +63 -0
- data/mod/basic_formats/set/all/json.rb +4 -1
- data/mod/bootstrap/db/migrate_cards/20170719163733_update_bootswatch_themes_to_4_beta.rb +5 -2
- data/mod/carrierwave/set/abstract/attachment.rb +1 -2
- data/mod/core/set/abstract/haml_file.rb +20 -0
- data/mod/core/set/all/chunk.rb +125 -0
- data/mod/core/set/all/collection.rb +2 -351
- data/mod/core/set/all/content.rb +26 -7
- data/mod/core/set/all/extended.rb +45 -0
- data/mod/core/set/all/haml.rb +3 -7
- data/mod/core/set/all/item.rb +92 -0
- data/mod/core/set/all/name.rb +36 -0
- data/mod/core/set/all/subcards.rb +21 -12
- data/mod/core/set/all/tabs.rb +50 -0
- data/mod/core/set/all/trash.rb +4 -0
- data/mod/core/spec/set/all/chunk_spec.rb +45 -0
- data/mod/core/spec/set/all/collection_spec.rb +6 -6
- data/mod/history/set/all/action_view.rb +1 -1
- data/mod/machines/lib/javascript/decko.js.coffee +3 -0
- data/mod/pointer/set/abstract/02_pointer/edit.rb +0 -2
- data/mod/search/set/abstract/search.rb +1 -1
- data/mod/search/set/all/filter.rb +0 -2
- data/mod/search/template/all/filter/_filter_input.haml +1 -1
- data/mod/search/template/all/filter/filter_form.haml +1 -1
- data/mod/standard/set/all/rich_html/editing.rb +1 -1
- data/mod/standard/set/all/rich_html/form.rb +6 -7
- data/mod/standard/set/all/rich_html/menu.rb +2 -3
- data/mod/standard/set/all/rich_html/toolbar.rb +3 -4
- data/mod/standard/set/type/cardtype.rb +1 -1
- data/mod/standard/spec/set/all/rich_html/editing_spec.rb +15 -4
- data/mod/tinymce_editor/db/migrate_cards/{20171113233150_update_tinymce_config.rb → 20171113233151_update_tinymce_config.rb} +1 -0
- metadata +25 -161
- data/.rspec +0 -4
- data/card.gemspec +0 -87
- data/db/seed/test/fixtures/.gitkeep +0 -0
- data/mod/bootstrap/vendor/bootstrap/.babelrc.js +0 -16
- data/mod/bootstrap/vendor/bootstrap/.editorconfig +0 -17
- data/mod/bootstrap/vendor/bootstrap/.eslintignore +0 -3
- data/mod/bootstrap/vendor/bootstrap/.gitattributes +0 -16
- data/mod/bootstrap/vendor/bootstrap/.github/CONTRIBUTING.md +0 -252
- data/mod/bootstrap/vendor/bootstrap/.github/ISSUE_TEMPLATE.md +0 -22
- data/mod/bootstrap/vendor/bootstrap/.gitignore +0 -46
- data/mod/bootstrap/vendor/bootstrap/.hound.yml +0 -19
- data/mod/bootstrap/vendor/bootstrap/.houndignore +0 -4
- data/mod/bootstrap/vendor/bootstrap/.travis.yml +0 -32
- data/mod/bootstrap/vendor/bootstrap/build/.htmllintrc +0 -19
- data/mod/bootstrap/vendor/bootstrap/build/.stylelintrc +0 -248
- data/mod/bootstrap/vendor/bootstrap/docs/4.0/examples/.stylelintrc +0 -12
- data/mod/bootstrap/vendor/bootstrap/js/.eslintrc.json +0 -240
- data/mod/bootstrap/vendor/bootstrap/js/tests/.eslintrc.json +0 -46
- data/mod/bootstrap/vendor/bootswatch/.gitignore +0 -7
- data/mod/bootstrap/vendor/bootswatch/.npmignore +0 -12
- data/mod/bootstrap/vendor/bootswatch/.travis.yml +0 -21
- data/mod/bootstrap/vendor/bootswatch/docs/.nojekyll +0 -0
- data/mod/bootstrap/vendor/bootswatch/docs/2/.travis.yml +0 -15
- data/mod/bootstrap/vendor/bootswatch/docs/2/bower_components/bootstrap/.bower.json +0 -20
- data/mod/bootstrap/vendor/bootswatch/docs/2/bower_components/bootstrap/.gitignore +0 -37
- data/mod/bootstrap/vendor/bootswatch/docs/2/bower_components/bootstrap/.travis.yml +0 -3
- data/mod/bootstrap/vendor/bootswatch/docs/2/bower_components/bootstrap/js/.jshintrc +0 -12
- data/mod/bootstrap/vendor/bootswatch/docs/2/bower_components/jquery/.bower.json +0 -20
- data/mod/bootstrap/vendor/bootswatch/docs/2/bower_components/jquery/.gitignore +0 -1
- data/mod/bootstrap/vendor/bootswatch/docs/2/swatchmaker/.gitignore +0 -1
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/bootstrap-sass-official/.bower.json +0 -45
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/bootstrap/.bower.json +0 -44
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/bootstrap/grunt/.jshintrc +0 -7
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/bootstrap/js/.jscsrc +0 -42
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/bootstrap/js/.jshintrc +0 -15
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/bootstrap/less/.csscomb.json +0 -304
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/bootstrap/less/.csslintrc +0 -19
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/font-awesome/.bower.json +0 -14
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/font-awesome/.gitignore +0 -32
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/html5shiv/.bower.json +0 -25
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/jquery/.bower.json +0 -38
- data/mod/bootstrap/vendor/bootswatch/docs/3/bower_components/respond/.bower.json +0 -20
- data/mod/bootstrap/vendor/select2/.editorconfig +0 -6
- data/mod/bootstrap/vendor/select2/.github/CONTRIBUTING.md +0 -204
- data/mod/bootstrap/vendor/select2/.github/ISSUE_TEMPLATE.md +0 -46
- data/mod/bootstrap/vendor/select2/.github/PULL_REQUEST_TEMPLATE.md +0 -13
- data/mod/bootstrap/vendor/select2/.gitignore +0 -3
- data/mod/bootstrap/vendor/select2/.jshintignore +0 -4
- data/mod/bootstrap/vendor/select2/.jshintrc +0 -25
- data/mod/bootstrap/vendor/select2/.travis.yml +0 -22
- data/script/fetch_bootswatch_themes.rb +0 -38
- data/spec/config/initializers/core_extensions_spec.rb +0 -47
- data/spec/config/initializers/patches/active_job_spec.rb +0 -7
- data/spec/lib/card/action_spec.rb +0 -15
- data/spec/lib/card/auth_spec.rb +0 -58
- data/spec/lib/card/cache_spec.rb +0 -116
- data/spec/lib/card/chunk_spec.rb +0 -18
- data/spec/lib/card/codename_spec.rb +0 -66
- data/spec/lib/card/content_spec.rb +0 -428
- data/spec/lib/card/diff_spec.rb +0 -208
- data/spec/lib/card/format/nest_spec.rb +0 -13
- data/spec/lib/card/format/render_spec.rb +0 -26
- data/spec/lib/card/format_spec.rb +0 -117
- data/spec/lib/card/i18n_spec.rb +0 -24
- data/spec/lib/card/loader/Modfile +0 -2
- data/spec/lib/card/loader_spec.rb +0 -98
- data/spec/lib/card/migration/import_spec.rb +0 -80
- data/spec/lib/card/mod/loader/mod_dirs.rb +0 -8
- data/spec/lib/card/mod/loader/set_loader_spec.rb +0 -19
- data/spec/lib/card/mod/loader/set_pattern_loader_spec.rb +0 -19
- data/spec/lib/card/name/fields_and_traits_spec.rb +0 -18
- data/spec/lib/card/name_spec.rb +0 -70
- data/spec/lib/card/query/sorting_spec.rb +0 -68
- data/spec/lib/card/query_spec.rb +0 -574
- data/spec/lib/card/reference_spec.rb +0 -212
- data/spec/lib/card/set/event_spec.rb +0 -22
- data/spec/lib/card/set/trait_spec.rb +0 -80
- data/spec/lib/card/set_pattern_spec.rb +0 -59
- data/spec/lib/card/set_spec.rb +0 -89
- data/spec/lib/card/stage_director_spec.rb +0 -482
- data/spec/lib/card/subcards_spec.rb +0 -177
- data/spec/lib/card/success_spec.rb +0 -148
- data/spec/lib/card/view_cache_spec.rb +0 -27
- data/spec/mailers/mailer_spec.rb +0 -62
- data/spec/models/card/create_spec.rb +0 -119
- data/spec/models/card/trash_spec.rb +0 -189
- data/spec/models/card_spec.rb +0 -136
- data/spec/spec_helper.rb +0 -45
- data/spec/support/card_spec_helper.rb +0 -74
- data/spec/support/card_spec_loader.rb +0 -112
- data/spec/support/helper/card_helper.rb +0 -58
- data/spec/support/helper/event_helper.rb +0 -94
- data/spec/support/helper/render_helper.rb +0 -44
- data/spec/support/helper/save_helper.rb +0 -30
- data/spec/support/helper/set_helper.rb +0 -80
- data/spec/support/matchers/card_matchers.rb +0 -160
- data/spec/support/matchers/expectations.rb +0 -5
- data/spec/support/matchers/file_matchers.rb +0 -71
- data/spec/support/matchers/html_matchers.rb +0 -29
- data/spec/support/matchers/negated_matchers.rb +0 -2
- data/spec/support/simplecov_helper.rb +0 -70
- data/spec/support/test_mods/mod1/set/all/test_set.rb +0 -3
- data/spec/support/test_mods/mod2/set_pattern/test_pattern.rb +0 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
class Card
|
2
|
+
class FileCardCreator
|
3
|
+
class AbstractFileCard
|
4
|
+
# Module that provides #create_migration_file method for classes that
|
5
|
+
# inherit from AbstractFileCard.
|
6
|
+
# It uses the decko generator to create the migration.
|
7
|
+
module MigrationFile
|
8
|
+
def create_migration_file
|
9
|
+
puts "creating migration file...".yellow
|
10
|
+
migration_out = `#{migrate_command}`
|
11
|
+
return if migration_out.include?("conflict")
|
12
|
+
migration_file_name = migration_out[/db.*/]
|
13
|
+
write_at migration_file_name, 5, indented_migration_content # 5 is line no.
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def migrate_command
|
19
|
+
cmd = "bundle exec decko generate card:migration add_#{@codename}"
|
20
|
+
cmd += " --force" if @force
|
21
|
+
cmd
|
22
|
+
end
|
23
|
+
|
24
|
+
def indented_migration_content
|
25
|
+
migration_file_content.lines.map do |line|
|
26
|
+
" " * 4 + line
|
27
|
+
end.join
|
28
|
+
end
|
29
|
+
|
30
|
+
def migration_file_content
|
31
|
+
indent = " " * category.to_s.size
|
32
|
+
<<-RUBY.strip_heredoc
|
33
|
+
add_#{category} "#{remove_prefix @name}",
|
34
|
+
#{indent} type_id: #{type_id},
|
35
|
+
#{indent} to: "#{rule_card_name}"
|
36
|
+
RUBY
|
37
|
+
end
|
38
|
+
|
39
|
+
def remove_prefix name
|
40
|
+
name.sub(/^(?:#{category}):?_?\s*/, "")
|
41
|
+
end
|
42
|
+
|
43
|
+
def type_id
|
44
|
+
"Card::#{type_codename.to_s.camelcase}ID"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Card
|
2
|
+
class FileCardCreator
|
3
|
+
class AbstractFileCard
|
4
|
+
# Module that provides #create_ruby_file method for a classes that
|
5
|
+
# inherit from AbstractFileCard.
|
6
|
+
# The default location for the ruby file is set/self.
|
7
|
+
module RubyFile
|
8
|
+
def create_ruby_file
|
9
|
+
write_to_mod(ruby_file_dir, ruby_file_name) do |f|
|
10
|
+
f.puts ruby_file_content
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def ruby_file_dir
|
17
|
+
File.join "set", "self"
|
18
|
+
end
|
19
|
+
|
20
|
+
def ruby_file_name
|
21
|
+
@codename + ".rb"
|
22
|
+
end
|
23
|
+
|
24
|
+
def ruby_file_content
|
25
|
+
"include_set Abstract::CodeFile"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Card
|
2
|
+
class FileCardCreator
|
3
|
+
class AbstractFileCard
|
4
|
+
# Module that provides #create_source_file method for a classes that
|
5
|
+
# inherit from AbstractFileCard
|
6
|
+
module SourceFile
|
7
|
+
def create_source_file
|
8
|
+
write_to_mod source_file_dir, source_file_name do |f|
|
9
|
+
f.puts source_file_content
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def source_file_content
|
16
|
+
card = Card.fetch(@name)
|
17
|
+
if card
|
18
|
+
card.content
|
19
|
+
else
|
20
|
+
color_puts "warning:", :yellow,
|
21
|
+
"Card '#{@name}' doesn't exist. Creating empty source file ..."
|
22
|
+
""
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def source_file_name
|
27
|
+
"#{@codename}.#{source_file_ext}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def source_file_ext
|
31
|
+
@type
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "html2haml"
|
2
|
+
|
3
|
+
class Card
|
4
|
+
class FileCardCreator
|
5
|
+
# Convert a card with html db content to a card with hard-coded haml.
|
6
|
+
# It generates three files:
|
7
|
+
# 1. a migration file that creates a card with codename
|
8
|
+
# 2. a haml file with the converted html
|
9
|
+
# 3. a ruby file (=code rule)that ties the haml file to the card
|
10
|
+
class HamlCard < AbstractFileCard
|
11
|
+
@supported_types = %i[haml]
|
12
|
+
@category = :haml
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def type_codename
|
17
|
+
@type_codename ||= :html
|
18
|
+
end
|
19
|
+
|
20
|
+
def source_file_dir
|
21
|
+
File.join "template", "self"
|
22
|
+
end
|
23
|
+
|
24
|
+
def source_file_content
|
25
|
+
html = super()
|
26
|
+
Html2haml::HTML.new(html).render
|
27
|
+
end
|
28
|
+
|
29
|
+
def migration_file_content
|
30
|
+
<<-RUBY.strip_heredoc
|
31
|
+
ensure_card "#{@name}",
|
32
|
+
type_id: #{type_id},
|
33
|
+
codename: "#{@codename}"
|
34
|
+
RUBY
|
35
|
+
end
|
36
|
+
|
37
|
+
def ruby_file_content
|
38
|
+
"include_set Abstract::HamlFile"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class Card
|
2
|
+
class FileCardCreator
|
3
|
+
# Helper methods to write to files and the console.
|
4
|
+
module OutputHelper
|
5
|
+
def write_to_mod rel_dir, filename
|
6
|
+
dir = File.join "mod", @mod, rel_dir
|
7
|
+
FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
|
8
|
+
|
9
|
+
path = File.join dir, filename
|
10
|
+
log_file_action path do
|
11
|
+
File.open(path, "w") do |opened_file|
|
12
|
+
yield(opened_file)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def log_file_action path
|
18
|
+
status, color =
|
19
|
+
if File.exist?(path) && !@force
|
20
|
+
["file exists (use 'force=true' to override)", :yellow]
|
21
|
+
else
|
22
|
+
status = File.exist?(path) ? "overridden" : "created"
|
23
|
+
yield
|
24
|
+
[status, :green]
|
25
|
+
end
|
26
|
+
|
27
|
+
color_puts status, color, path
|
28
|
+
end
|
29
|
+
|
30
|
+
# insert content into a file at a given line number
|
31
|
+
def write_at fname, at_line, sdat
|
32
|
+
open(fname, "r+") do |f|
|
33
|
+
(at_line - 1).times do # read up to the line you want to write after
|
34
|
+
f.readline
|
35
|
+
end
|
36
|
+
pos = f.pos # save your position in the file
|
37
|
+
rest = f.read # save the rest of the file
|
38
|
+
f.seek pos # go back to the old position
|
39
|
+
f.puts sdat # write new data & rest of file
|
40
|
+
f.puts rest
|
41
|
+
color_puts "created", :green, fname
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def color_puts colored_text, color, text=""
|
46
|
+
puts "#{colored_text.send(color.to_s)} #{text}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class Card
|
2
|
+
class FileCardCreator
|
3
|
+
# Move javascript or coffeescript from the card database to a file.
|
4
|
+
# It generates three files:
|
5
|
+
# 1. a migration file that ensures the card has a codename and adds it to the
|
6
|
+
# script rule card.
|
7
|
+
# 2. a script file with the source code
|
8
|
+
# 3. a ruby file (=code rule) that ties the script file to the card
|
9
|
+
class ScriptCard < AbstractFileCard
|
10
|
+
@supported_types = %i[js coffee]
|
11
|
+
@category = :script
|
12
|
+
@default_rule_name = "*all+*script"
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def source_file_ext
|
17
|
+
@type == :coffee ? "js.coffee" : @type
|
18
|
+
end
|
19
|
+
|
20
|
+
def type_codename
|
21
|
+
@type_codename ||=
|
22
|
+
case @type
|
23
|
+
when :js then :java_script
|
24
|
+
when :coffee then :coffee_script
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def source_file_dir
|
29
|
+
File.join "lib", "javascript"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Card
|
2
|
+
class FileCardCreator
|
3
|
+
# Move css or scss from the card database to a file.
|
4
|
+
# It generates three files:
|
5
|
+
# 1. a migration file that ensures the card has a codename and adds it to the
|
6
|
+
# style rule card.
|
7
|
+
# 2. a style file with the source code
|
8
|
+
# 3. a ruby file (=code rule) that ties the style file to the card
|
9
|
+
class StyleCard < AbstractFileCard
|
10
|
+
@supported_types = %i[css scss]
|
11
|
+
@category = :style
|
12
|
+
@default_rule_name = "*all+*style"
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def type_codename
|
17
|
+
@type_codename ||= @type.to_sym
|
18
|
+
end
|
19
|
+
|
20
|
+
def source_file_dir
|
21
|
+
File.join "lib", "stylesheets"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -27,7 +27,7 @@ class Card
|
|
27
27
|
if !Dir.exist? mod_path
|
28
28
|
warn "invalid mod name: #{file_name}. Directory #{mod_path} doesn't exist."
|
29
29
|
# Card.set_patterns not loaded at this point
|
30
|
-
elsif !%w[self type type_plus_right ltype_rtype rstar star
|
30
|
+
elsif !%w[self type right type_plus_right ltype_rtype rstar star
|
31
31
|
type all_plus all].include? set_pattern
|
32
32
|
warn "invalid set pattern: #{set_pattern}"
|
33
33
|
else
|
@@ -9,6 +9,14 @@ format :csv do
|
|
9
9
|
depth.zero? ? :csv_row : :name
|
10
10
|
end
|
11
11
|
|
12
|
+
view :core do
|
13
|
+
if (item_view_options[:view] == :name_with_fields) && focal?
|
14
|
+
title_row("item name") + name_with_field_rows
|
15
|
+
else
|
16
|
+
super()
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
12
20
|
view :csv_row do
|
13
21
|
array = _render_raw.scan(/\{\{[^\}]*\}\}/).map do |inc|
|
14
22
|
process_content(inc).strip
|
@@ -31,4 +39,59 @@ format :csv do
|
|
31
39
|
row << nest(field_name)
|
32
40
|
end
|
33
41
|
end
|
42
|
+
|
43
|
+
def name_with_field_rows
|
44
|
+
return [] unless row_card_names.present?
|
45
|
+
|
46
|
+
row_card_names.map do |item_name|
|
47
|
+
CSV.generate_line row_from_field_names(item_name, columns)
|
48
|
+
end.join
|
49
|
+
end
|
50
|
+
|
51
|
+
def row_card_names
|
52
|
+
@row_cards ||= card.item_names
|
53
|
+
end
|
54
|
+
|
55
|
+
def columns
|
56
|
+
columns = []
|
57
|
+
csv_structure_card.format.each_nested_field do |chunk|
|
58
|
+
columns << chunk.referee_name.tag
|
59
|
+
end
|
60
|
+
columns
|
61
|
+
end
|
62
|
+
|
63
|
+
def csv_structure_card
|
64
|
+
card.rule_card(:csv_structure) || Card.fetch(row_card_names.first)
|
65
|
+
end
|
66
|
+
|
67
|
+
def row_from_field_names parent_name, field_names, view=:core
|
68
|
+
field_names.each_with_object([parent_name]) do |field, row|
|
69
|
+
row << nest([parent_name, field], view: view)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def title_row extra_titles=nil
|
74
|
+
titles = column_titles extra_titles
|
75
|
+
return "" unless titles.present?
|
76
|
+
CSV.generate_line titles.map(&:upcase)
|
77
|
+
end
|
78
|
+
|
79
|
+
def column_titles extra_titles=nil
|
80
|
+
res = Array extra_titles
|
81
|
+
card1 = Card.fetch card.item_names(limit: 1).first
|
82
|
+
card1.each_nested_chunk do |chunk|
|
83
|
+
res << column_title(chunk.options)
|
84
|
+
end
|
85
|
+
res.compact
|
86
|
+
end
|
87
|
+
|
88
|
+
def column_title opts
|
89
|
+
if opts[:title]
|
90
|
+
opts[:title]
|
91
|
+
elsif %w[name link].member? opts[:view]
|
92
|
+
opts[:view]
|
93
|
+
else
|
94
|
+
opts[:nest_name].to_name.tag
|
95
|
+
end
|
96
|
+
end
|
34
97
|
end
|
@@ -39,7 +39,10 @@ format :json do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def name_search query_attribute: :complete, limit: AUTOCOMPLETE_LIMIT
|
42
|
-
card.search limit: limit,
|
42
|
+
card.search limit: limit,
|
43
|
+
sort: "name",
|
44
|
+
return: "name",
|
45
|
+
query_attribute => params[:term]
|
43
46
|
end
|
44
47
|
|
45
48
|
view :status, tags: :unknown_ok, perms: :none, cache: :never do
|
@@ -36,8 +36,11 @@ class UpdateBootswatchThemesTo4Beta < Card::Migration::Core
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def update_bootstrap_default
|
39
|
-
|
40
|
-
|
39
|
+
ensure_card "bootstrap default skin+bootswatch theme",
|
40
|
+
type_id: Card::ScssID,
|
41
|
+
content: "{{bootstrap: functions}}" \
|
42
|
+
"{{bootstrap: variables}}" \
|
43
|
+
"{{bootstrap: core}}"
|
41
44
|
end
|
42
45
|
|
43
46
|
def add_icon_cards
|
@@ -54,8 +54,7 @@ def original_filename
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def unfilled?
|
57
|
-
!attachment.present? && !save_preliminary_upload? && !subcards
|
58
|
-
!content.present?
|
57
|
+
!attachment.present? && !save_preliminary_upload? && !subcards? && blank_content?
|
59
58
|
end
|
60
59
|
|
61
60
|
def attachment_changed?
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
def self.included host_class
|
3
|
+
host_class.mattr_accessor :template_path
|
4
|
+
host_class.extend Card::Set::Format::HamlViews
|
5
|
+
host_class.template_path = host_class.haml_template_path
|
6
|
+
end
|
7
|
+
|
8
|
+
def content
|
9
|
+
File.read template_path
|
10
|
+
end
|
11
|
+
|
12
|
+
format :html do
|
13
|
+
def haml_locals
|
14
|
+
{}
|
15
|
+
end
|
16
|
+
|
17
|
+
view :core do
|
18
|
+
haml card.content, haml_locals
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
|
2
|
+
def chunks content, type
|
3
|
+
content ||= self.content
|
4
|
+
type ||= Card::Content::Chunk
|
5
|
+
Card::Content.new(content, self).find_chunks type
|
6
|
+
end
|
7
|
+
|
8
|
+
def each_chunk content, type
|
9
|
+
chunks(content, type).each do |chunk|
|
10
|
+
next unless chunk.referee_name # filter commented nests
|
11
|
+
yield chunk
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def each_reference_chunk content=nil
|
16
|
+
each_chunk content, Card::Content::Chunk::Reference do |chunk|
|
17
|
+
yield chunk
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def each_nested_chunk content=nil
|
22
|
+
each_chunk content, Card::Content::Chunk::Nest do |chunk|
|
23
|
+
yield chunk
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def each_item_name_with_options content=nil
|
28
|
+
each_reference_chunk content do |chunk|
|
29
|
+
options = chunk.respond_to?(:options) ? chunk.options : {}
|
30
|
+
yield chunk.referee_name, options
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
format do
|
35
|
+
def nested_fields content=nil
|
36
|
+
result = []
|
37
|
+
each_nested_card(content) do |chunk|
|
38
|
+
result << [chunk.referee_name, chunk.options]
|
39
|
+
end
|
40
|
+
result
|
41
|
+
end
|
42
|
+
|
43
|
+
def nested_cards_for_edit fields_only=false
|
44
|
+
return normalized_edit_fields if edit_fields.present?
|
45
|
+
result = []
|
46
|
+
each_nested_card nil, fields_only do |chunk|
|
47
|
+
result << [chunk.options[:nest_name], chunk.options]
|
48
|
+
end
|
49
|
+
result
|
50
|
+
end
|
51
|
+
|
52
|
+
def edit_fields
|
53
|
+
voo.edit_structure || []
|
54
|
+
end
|
55
|
+
|
56
|
+
def normalized_edit_fields
|
57
|
+
edit_fields.map do |cardish, options|
|
58
|
+
field_mark = normalized_edit_field_mark cardish, options
|
59
|
+
options = normalized_edit_field_options options, Card::Name[field_mark]
|
60
|
+
[field_mark, options]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def normalized_edit_field_options options, cardname
|
65
|
+
options ||= cardname
|
66
|
+
options.is_a?(String) ? { title: options } : options
|
67
|
+
end
|
68
|
+
|
69
|
+
def normalized_edit_field_mark cardish, options
|
70
|
+
return cardish if cardish.is_a?(Card) ||
|
71
|
+
(options.is_a?(Hash) && options.delete(:absolute))
|
72
|
+
card.name.field cardish
|
73
|
+
end
|
74
|
+
|
75
|
+
def process_field chunk, processed, &_block
|
76
|
+
return unless process_unique_field? chunk, processed
|
77
|
+
yield chunk
|
78
|
+
end
|
79
|
+
|
80
|
+
def each_nested_field content=nil, &block
|
81
|
+
each_nested_card content, true, &block
|
82
|
+
end
|
83
|
+
|
84
|
+
def each_nested_card content=nil, fields_only=true, &block
|
85
|
+
processed = process_tally
|
86
|
+
each_nested_chunk content do |chunk|
|
87
|
+
next if fields_only && !field_chunk?(chunk)
|
88
|
+
process_nested_chunk chunk, processed, &block
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def each_nested_chunk content, &block
|
93
|
+
content ||= _render_raw
|
94
|
+
card.each_nested_chunk content, &block
|
95
|
+
end
|
96
|
+
|
97
|
+
def process_tally
|
98
|
+
::Set.new [card.key]
|
99
|
+
end
|
100
|
+
|
101
|
+
def field_chunk? chunk
|
102
|
+
chunk.referee_name.to_name.field_of? card.name
|
103
|
+
end
|
104
|
+
|
105
|
+
def process_nested_chunk chunk, processed, &block
|
106
|
+
virtual = chunk.referee_card && chunk.referee_card.virtual?
|
107
|
+
# TODO: handle structures that are non-virtual
|
108
|
+
method = virtual ? :process_virtual_field : :process_field
|
109
|
+
send method, chunk, processed, &block
|
110
|
+
end
|
111
|
+
|
112
|
+
def process_virtual_field chunk, processed, &block
|
113
|
+
return unless process_unique_field? chunk, processed
|
114
|
+
subformat(chunk.referee_card).each_nested_field do |sub_chunk|
|
115
|
+
process_field sub_chunk, processed, &block
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def process_unique_field? chunk, processed
|
120
|
+
key = chunk.referee_name.key
|
121
|
+
return false if processed.include? key
|
122
|
+
processed << key
|
123
|
+
true
|
124
|
+
end
|
125
|
+
end
|