card 1.17.4 → 1.18.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 +24 -25
- data/config/initializers/01_init_ruby_extensions.rb +0 -4
- data/config/initializers/inflections.rb +1 -1
- data/config/initializers/notification.rb +2 -2
- data/db/migrate/20110511221913_require_earlier_migrations.rb +3 -3
- data/db/migrate/20120105203350_require_1_8_migrations.rb +3 -3
- data/db/migrate/20121111025347_require_1_10_migrations.rb +3 -3
- data/db/migrate/20130106052640_table_cleanup.rb +4 -4
- data/db/migrate/20130411210957_update_codenames.rb +2 -2
- data/db/migrate/20141001105348_move_revisions_to_actions.rb +4 -4
- data/db/migrate/20141121172918_rename_card_migration_table.rb +2 -2
- data/db/migrate/20141208132159_remove_present_from_reference_table.rb +2 -2
- data/db/migrate/20141216053032_better_index_names.rb +9 -9
- data/db/migrate_core_cards/20120611203506_rails_inflection_updates.rb +29 -32
- data/db/migrate_core_cards/20130411191151_renaming_for_menu.rb +3 -4
- data/db/migrate_core_cards/20130411211600_delete_old_related_tab_cards.rb +1 -1
- data/db/migrate_core_cards/20130419215612_import_help_text.rb +1 -2
- data/db/migrate_core_cards/20130823192433_add_style_cards.rb +3 -3
- data/db/migrate_core_cards/20130910183318_move_styles_to_content.rb +2 -3
- data/db/migrate_core_cards/20130920214038_jsonize_tinymce.rb +2 -2
- data/db/migrate_core_cards/20130920291703_update_stylesheets.rb +1 -2
- data/db/migrate_core_cards/20130927191728_account_events.rb +5 -6
- data/db/migrate_core_cards/20131016172445_common_css_patch.rb +2 -3
- data/db/migrate_core_cards/20140110193325_reset_account_request_type.rb +0 -1
- data/db/migrate_core_cards/20140307231621_user_data_to_cards.rb +23 -32
- data/db/migrate_core_cards/20140317035504_account_requests_to_signups.rb +1 -7
- data/db/migrate_core_cards/20140512155840_add_script_cards.rb +21 -24
- data/db/migrate_core_cards/20140629222005_add_email_cards.rb +17 -22
- data/db/migrate_core_cards/20140725180118_config_card_updates.rb +2 -2
- data/db/migrate_core_cards/20141111083921_delete_machine_output.rb +1 -3
- data/db/migrate_core_cards/20141115034214_config_descriptions_etc.rb +2 -2
- data/db/migrate_core_cards/20141119001955_make_symlinks_relative.rb +3 -3
- data/db/migrate_core_cards/20141120120605_fix_notification_html_message.rb +1 -1
- data/db/migrate_core_cards/20141204061304_watchers_to_following.rb +8 -12
- data/db/migrate_core_cards/20141208162106_add_ace_script.rb +2 -3
- data/db/migrate_core_cards/20141216155251_add_more_following_cards.rb +10 -10
- data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +10 -12
- data/db/migrate_core_cards/20150220134731_following_to_follow_rule.rb +4 -4
- data/db/migrate_core_cards/20150317162412_bootstrap_themes.rb +3 -3
- data/db/migrate_core_cards/20150326205655_bootswatch_themes.rb +7 -7
- data/db/migrate_core_cards/20150429090551_search_card_context.rb +18 -20
- data/db/migrate_core_cards/20150508212032_menu_compatibility.rb +3 -7
- data/db/migrate_core_cards/20150510031118_fix_skin_images.rb +2 -3
- data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +3 -3
- data/db/migrate_core_cards/20150601133433_add_recent_setting_session_card.rb +4 -4
- data/db/migrate_core_cards/20150610171702_add_debugger_session_card.rb +4 -4
- data/db/migrate_core_cards/20150610180019_add_recaptcha_key_and_admin_info_cards.rb +5 -11
- data/db/migrate_core_cards/20150724123438_update_file_and_image_cards.rb +29 -35
- data/db/migrate_core_cards/20150824135418_update_file_history.rb +10 -14
- data/db/migrate_core_cards/20150903130006_attachment_upload_cards.rb +1 -1
- data/db/schema.rb +92 -94
- data/db/seed/new/card_actions.yml +461 -469
- data/db/seed/new/card_acts.yml +154 -172
- data/db/seed/new/card_changes.yml +4076 -4031
- data/db/seed/new/card_references.yml +1584 -1927
- data/db/seed/new/cards.yml +2095 -2112
- data/db/seed/test/fixtures/card_actions.yml +1497 -1505
- data/db/seed/test/fixtures/card_acts.yml +454 -472
- data/db/seed/test/fixtures/card_changes.yml +7309 -7263
- data/db/seed/test/fixtures/card_references.yml +2263 -2613
- data/db/seed/test/fixtures/cards.yml +3298 -3316
- data/db/seed/test/seed.rb +3 -0
- data/lib/card.rb +17 -9
- data/lib/card/active_record_ext.rb +6 -8
- data/lib/card/active_record_helper.rb +42 -32
- data/lib/card/auth.rb +3 -3
- data/lib/card/cache.rb +4 -4
- data/lib/card/cache/persistent.rb +9 -5
- data/lib/card/cache/temporary.rb +5 -5
- data/lib/card/chunk.rb +1 -1
- data/lib/card/codename.rb +3 -2
- data/lib/card/content.rb +62 -57
- data/lib/card/core_ext.rb +20 -30
- data/lib/card/diff.rb +88 -76
- data/lib/card/director_register.rb +66 -0
- data/lib/card/env.rb +14 -17
- data/lib/card/exceptions.rb +7 -9
- data/lib/card/format.rb +18 -367
- data/lib/card/format/nest.rb +183 -0
- data/lib/card/format/permission.rb +63 -0
- data/lib/card/format/render.rb +140 -0
- data/lib/card/loader.rb +17 -26
- data/lib/card/location.rb +6 -6
- data/lib/card/mailer.rb +4 -7
- data/lib/card/migration.rb +1 -1
- data/lib/card/name.rb +3 -6
- data/lib/card/query.rb +8 -8
- data/lib/card/query/attributes.rb +6 -6
- data/lib/card/query/clause.rb +10 -10
- data/lib/card/query/join.rb +7 -9
- data/lib/card/query/reference.rb +17 -19
- data/lib/card/query/sql_statement.rb +2 -2
- data/lib/card/query/value.rb +15 -16
- data/lib/card/set.rb +106 -209
- data/lib/card/set/event.rb +126 -0
- data/lib/card/set_pattern.rb +42 -29
- data/lib/card/simplecov_helper.rb +19 -19
- data/lib/card/spec_helper.rb +40 -16
- data/lib/card/stage.rb +72 -0
- data/lib/card/stage_director.rb +231 -0
- data/lib/card/subcards.rb +56 -24
- data/lib/card/subdirector_array.rb +31 -0
- data/lib/card/success.rb +15 -18
- data/lib/card/version.rb +1 -2
- data/lib/card/view_cache.rb +4 -4
- data/lib/card/view_name.rb +10 -8
- data/lib/cardio.rb +1 -1
- data/lib/generators/card.rb +2 -4
- data/lib/generators/card/format/format_generator.rb +4 -4
- data/lib/generators/card/migration/migration_generator.rb +6 -6
- data/lib/generators/card/set/set_generator.rb +5 -6
- data/mod/01_core/chunk/include.rb +2 -1
- data/mod/01_core/chunk/link.rb +2 -2
- data/mod/01_core/chunk/literal.rb +6 -9
- data/mod/01_core/chunk/query_reference.rb +1 -1
- data/mod/01_core/chunk/reference.rb +2 -2
- data/mod/01_core/chunk/uri.rb +52 -63
- data/mod/01_core/format/html_format.rb +8 -12
- data/mod/01_core/format/text_format.rb +1 -1
- data/mod/01_core/set/all/actify.rb +96 -0
- data/mod/01_core/set/all/active_card.rb +7 -7
- data/mod/01_core/set/all/collection.rb +19 -20
- data/mod/01_core/set/all/content.rb +9 -7
- data/mod/01_core/set/all/erb.rb +5 -5
- data/mod/01_core/set/all/event.rb +60 -0
- data/mod/01_core/set/all/fetch.rb +13 -19
- data/mod/01_core/set/all/haml.rb +1 -1
- data/mod/01_core/set/all/initialize.rb +35 -41
- data/mod/01_core/set/all/location_history.rb +3 -5
- data/mod/01_core/set/all/name.rb +19 -68
- data/mod/01_core/set/all/name_validations.rb +56 -0
- data/mod/01_core/set/all/pattern.rb +2 -2
- data/mod/01_core/set/all/permissions.rb +14 -20
- data/mod/01_core/set/all/phases.rb +9 -200
- data/mod/01_core/set/all/references.rb +10 -10
- data/mod/01_core/set/all/rules.rb +3 -4
- data/mod/01_core/set/all/stages.rb +24 -0
- data/mod/01_core/set/all/states.rb +4 -4
- data/mod/01_core/set/all/subcards.rb +16 -26
- data/mod/01_core/set/all/templating.rb +1 -3
- data/mod/01_core/set/all/tracked_attributes.rb +47 -48
- data/mod/01_core/set/all/trash.rb +10 -10
- data/mod/01_core/set/all/type.rb +9 -8
- data/mod/01_core/set/all/utils.rb +10 -14
- data/mod/01_core/set/all/view_cache.rb +2 -2
- data/mod/01_core/set_pattern/01_all.rb +3 -3
- data/mod/01_core/set_pattern/02_all_plus.rb +3 -3
- data/mod/01_core/set_pattern/03_type.rb +2 -2
- data/mod/01_core/set_pattern/04_star.rb +3 -3
- data/mod/01_core/set_pattern/05_rstar.rb +3 -3
- data/mod/01_core/set_pattern/06_right.rb +2 -2
- data/mod/01_core/set_pattern/07_type_plus_right.rb +2 -2
- data/mod/01_core/set_pattern/08_self.rb +1 -1
- data/mod/01_core/spec/chunk/literal_spec.rb +7 -8
- data/mod/01_core/spec/chunk/uri_spec.rb +140 -142
- data/mod/01_core/spec/format/html_format_spec.rb +72 -57
- data/mod/01_core/spec/set/all/collection_spec.rb +63 -43
- data/mod/01_core/spec/set/all/content_spec.rb +4 -4
- data/mod/01_core/spec/set/all/fetch_spec.rb +12 -3
- data/mod/01_core/spec/set/all/name_spec.rb +3 -4
- data/mod/01_core/spec/set/all/pattern_spec.rb +32 -35
- data/mod/01_core/spec/set/all/permissions_spec.rb +17 -5
- data/mod/01_core/spec/set/all/phases_spec.rb +0 -1
- data/mod/01_core/spec/set/all/references_spec.rb +1 -1
- data/mod/01_core/spec/set/all/rules2_spec.rb +79 -91
- data/mod/01_core/spec/set/all/rules_spec.rb +63 -56
- data/mod/01_core/spec/set/all/templating_spec.rb +0 -1
- data/mod/01_core/spec/set/all/tracked_attributes_spec.rb +4 -5
- data/mod/01_core/spec/set/all/trash_spec.rb +23 -1
- data/mod/01_core/spec/set/all/type_spec.rb +2 -5
- data/mod/01_history/lib/card/action.rb +8 -10
- data/mod/01_history/set/all/actions.rb +2 -4
- data/mod/01_history/set/all/content_history.rb +38 -32
- data/mod/01_history/set/all/history.rb +20 -17
- data/mod/02_basic_types/format/rss_format.rb +0 -1
- data/mod/02_basic_types/set/all/all_css.rb +9 -13
- data/mod/02_basic_types/set/all/all_csv.rb +14 -17
- data/mod/02_basic_types/set/all/all_js.rb +3 -4
- data/mod/02_basic_types/set/all/base.rb +2 -2
- data/mod/02_basic_types/set/all/file.rb +2 -5
- data/mod/02_basic_types/set/all/json.rb +19 -18
- data/mod/02_basic_types/set/all/rss.rb +3 -3
- data/mod/02_basic_types/set/all/text.rb +1 -3
- data/mod/02_basic_types/set/type/html.rb +4 -8
- data/mod/02_basic_types/set/type/plain_text.rb +2 -3
- data/mod/02_basic_types/set/type/pointer.rb +82 -92
- data/mod/02_basic_types/spec/set/all/all_css_spec.rb +2 -2
- data/mod/02_basic_types/spec/set/all/all_csv_spec.rb +6 -4
- data/mod/02_basic_types/spec/set/all/base_spec.rb +6 -6
- data/mod/02_basic_types/spec/set/all/json_spec.rb +8 -8
- data/mod/02_basic_types/spec/set/type/plain_text_spec.rb +3 -3
- data/mod/02_basic_types/spec/set/type/pointer_spec.rb +29 -32
- data/mod/03_machines/lib/card/machine.rb +95 -81
- data/mod/03_machines/lib/card/machine_input.rb +35 -34
- data/mod/03_machines/set/right/machine_input.rb +1 -1
- data/mod/03_machines/set/self/script_ace.rb +2 -3
- data/mod/03_machines/set/self/script_card_menu.rb +2 -3
- data/mod/03_machines/set/self/script_jquery_helper.rb +2 -2
- data/mod/03_machines/set/self/script_slot.rb +2 -2
- data/mod/03_machines/set/self/style_bootstrap_compatible.rb +1 -1
- data/mod/03_machines/set/self/style_cards.rb +1 -1
- data/mod/03_machines/set/self/style_jquery_ui_smoothness.rb +0 -1
- data/mod/03_machines/set/type/coffee_script.rb +9 -13
- data/mod/03_machines/set/type/css.rb +12 -13
- data/mod/03_machines/set/type/java_script.rb +6 -8
- data/mod/03_machines/set/type/scss.rb +4 -5
- data/mod/03_machines/set/type/skin.rb +3 -6
- data/mod/03_machines/spec/lib/shared_machine_examples.rb +31 -38
- data/mod/03_machines/spec/lib/shared_machine_input_examples.rb +7 -8
- data/mod/03_machines/spec/set/type/coffeescript_spec.rb +19 -13
- data/mod/03_machines/spec/set/type/css_spec.rb +22 -16
- data/mod/03_machines/spec/set/type/scss_spec.rb +28 -21
- data/mod/03_machines/spec/set/type/skin_spec.rb +28 -30
- data/mod/04_settings/lib/card/setting.rb +4 -4
- data/mod/04_settings/set/abstract/permission.rb +30 -37
- data/mod/04_settings/set/right/add_help.rb +3 -3
- data/mod/04_settings/set/right/script.rb +4 -5
- data/mod/04_settings/set/right/structure.rb +3 -4
- data/mod/04_settings/set/right/style.rb +3 -3
- data/mod/04_settings/set/self/add_help.rb +1 -1
- data/mod/04_settings/set/self/input.rb +1 -1
- data/mod/04_settings/set/self/on_create.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/type/setting.rb +29 -44
- data/mod/04_settings/spec/set/right/comment_spec.rb +9 -12
- data/mod/04_settings/spec/set/right/script_spec.rb +7 -7
- data/mod/04_settings/spec/set/right/structure_spec.rb +13 -12
- data/mod/04_settings/spec/set/right/style_spec.rb +13 -13
- data/mod/04_settings/spec/set/type/setting_spec.rb +1 -1
- data/mod/05_email/format/email_html_format.rb +1 -1
- data/mod/05_email/format/email_text_format.rb +2 -2
- data/mod/05_email/lib/card/follow_option.rb +12 -15
- data/mod/05_email/set/all/email_html.rb +2 -3
- data/mod/05_email/set/all/email_text.rb +3 -3
- data/mod/05_email/set/all/follow.rb +14 -22
- data/mod/05_email/set/all/notify.rb +11 -11
- data/mod/05_email/set/all/observer.rb +7 -8
- data/mod/05_email/set/right/bcc.rb +4 -9
- data/mod/05_email/set/right/follow.rb +26 -39
- data/mod/05_email/set/right/follow_fields.rb +2 -2
- data/mod/05_email/set/right/followers.rb +3 -1
- data/mod/05_email/set/right/following.rb +13 -16
- data/mod/05_email/set/self/always.rb +1 -2
- data/mod/05_email/set/self/created.rb +4 -6
- data/mod/05_email/set/self/edited.rb +3 -7
- data/mod/05_email/set/self/follow_defaults.rb +11 -12
- data/mod/05_email/set/self/never.rb +2 -4
- data/mod/05_email/set/type/email_template.rb +40 -27
- data/mod/05_email/set/type_plus_right/user/follow.rb +159 -157
- data/mod/05_email/spec/set/all/follow_spec.rb +28 -37
- data/mod/05_email/spec/set/all/notify_spec.rb +21 -26
- data/mod/05_email/spec/set/all/observer_spec.rb +58 -37
- data/mod/05_email/spec/set/right/followers_spec.rb +9 -14
- data/mod/05_email/spec/set/right/following_spec.rb +1 -1
- data/mod/05_email/spec/set/self/follow_defaults_spec.rb +1 -1
- data/mod/05_standard/lib/carrier_wave/cardmount.rb +9 -9
- data/mod/05_standard/lib/file_uploader.rb +8 -13
- data/mod/05_standard/lib/image_uploader.rb +8 -9
- data/mod/05_standard/set/abstract/attachment.rb +26 -43
- data/mod/05_standard/set/all/account.rb +2 -2
- data/mod/05_standard/set/all/comment.rb +11 -13
- data/mod/05_standard/set/all/error.rb +18 -18
- data/mod/05_standard/set/all/event_viz.rb +16 -29
- data/mod/05_standard/set/all/links.rb +35 -34
- data/mod/05_standard/set/all/list_changes.rb +10 -12
- data/mod/05_standard/set/all/rich_html/content.rb +13 -13
- data/mod/05_standard/set/all/rich_html/editing.rb +5 -5
- data/mod/05_standard/set/all/rich_html/form.rb +22 -26
- data/mod/05_standard/set/all/rich_html/header.rb +18 -25
- data/mod/05_standard/set/all/rich_html/menu.rb +20 -22
- data/mod/05_standard/set/all/rich_html/modal.rb +3 -3
- data/mod/05_standard/set/all/rich_html/toolbar.rb +49 -58
- data/mod/05_standard/set/all/rich_html/wrapper.rb +40 -41
- data/mod/05_standard/set/right/account.rb +26 -14
- data/mod/05_standard/set/right/email.rb +2 -2
- data/mod/05_standard/set/right/password.rb +6 -5
- data/mod/05_standard/set/right/salt.rb +2 -2
- data/mod/05_standard/set/right/stats.rb +17 -20
- data/mod/05_standard/set/right/token.rb +1 -1
- data/mod/05_standard/set/right/when_created.rb +1 -1
- data/mod/05_standard/set/right/when_last_edited.rb +1 -1
- data/mod/05_standard/set/rstar/rules.rb +3 -3
- data/mod/05_standard/set/rstar/rules_editor.rb +39 -39
- data/mod/05_standard/set/self/account_links.rb +21 -22
- data/mod/05_standard/set/self/admin_info.rb +5 -5
- data/mod/05_standard/set/self/alerts.rb +1 -1
- data/mod/05_standard/set/self/all.rb +1 -1
- data/mod/05_standard/set/self/foot.rb +1 -1
- data/mod/05_standard/set/self/head.rb +19 -22
- data/mod/05_standard/set/self/navbox.rb +3 -7
- data/mod/05_standard/set/self/now.rb +1 -1
- data/mod/05_standard/set/self/recent.rb +19 -25
- data/mod/05_standard/set/self/search.rb +2 -4
- data/mod/05_standard/set/self/signin.rb +6 -6
- data/mod/05_standard/set/self/stats.rb +31 -38
- data/mod/05_standard/set/self/version.rb +1 -2
- data/mod/05_standard/set/type/basic.rb +15 -17
- data/mod/05_standard/set/type/cardtype.rb +3 -3
- data/mod/05_standard/set/type/date.rb +1 -2
- data/mod/05_standard/set/type/file.rb +22 -33
- data/mod/05_standard/set/type/image.rb +30 -23
- data/mod/05_standard/set/type/layout_type.rb +4 -4
- data/mod/05_standard/set/type/list.rb +32 -38
- data/mod/05_standard/set/type/listed_by.rb +11 -13
- data/mod/05_standard/set/type/number.rb +5 -6
- data/mod/05_standard/set/type/phrase.rb +1 -1
- data/mod/05_standard/set/type/search_type.rb +25 -23
- data/mod/05_standard/set/type/session.rb +2 -3
- data/mod/05_standard/set/type/set.rb +46 -51
- data/mod/05_standard/set/type/signup.rb +18 -19
- data/mod/05_standard/set/type/toggle.rb +5 -5
- data/mod/05_standard/set/type/user.rb +6 -6
- data/mod/05_standard/spec/chunk/include_spec.rb +115 -98
- data/mod/05_standard/spec/chunk/link_spec.rb +58 -31
- data/mod/05_standard/spec/chunk/query_reference_spec.rb +12 -14
- data/mod/05_standard/spec/set/all/email_html_spec.rb +3 -3
- data/mod/05_standard/spec/set/all/error_spec.rb +3 -3
- data/mod/05_standard/spec/set/all/history_spec.rb +52 -38
- data/mod/05_standard/spec/set/all/links_spec.rb +2 -2
- data/mod/05_standard/spec/set/all/rich_html/editing_spec.rb +0 -1
- data/mod/05_standard/spec/set/all/rich_html/form_spec.rb +11 -11
- data/mod/05_standard/spec/set/all/rich_html/wrapper_spec.rb +4 -4
- data/mod/05_standard/spec/set/right/email_spec.rb +1 -4
- data/mod/05_standard/spec/set/right/password_spec.rb +4 -7
- data/mod/05_standard/spec/set/right/stats_spec.rb +2 -3
- data/mod/05_standard/spec/set/right/when_created_spec.rb +1 -1
- data/mod/05_standard/spec/set/right/when_last_edited_spec.rb +1 -1
- data/mod/05_standard/spec/set/rstar/rules_spec.rb +6 -6
- data/mod/05_standard/spec/set/self/all_spec.rb +11 -13
- data/mod/05_standard/spec/set/self/head_spec.rb +1 -3
- data/mod/05_standard/spec/set/self/navbox_spec.rb +1 -1
- data/mod/05_standard/spec/set/self/now_spec.rb +2 -2
- data/mod/05_standard/spec/set/self/signin_spec.rb +1 -1
- data/mod/05_standard/spec/set/self/stats_spec.rb +1 -1
- data/mod/05_standard/spec/set/self/version_spec.rb +2 -2
- data/mod/05_standard/spec/set/type/cardtype_spec.rb +3 -4
- data/mod/05_standard/spec/set/type/date_spec.rb +1 -1
- data/mod/05_standard/spec/set/type/email_template_spec.rb +5 -5
- data/mod/05_standard/spec/set/type/file_spec.rb +50 -28
- data/mod/05_standard/spec/set/type/html_spec.rb +12 -7
- data/mod/05_standard/spec/set/type/image_spec.rb +55 -45
- data/mod/05_standard/spec/set/type/layout_type_spec.rb +2 -2
- data/mod/05_standard/spec/set/type/listed_by_spec.rb +2 -2
- data/mod/05_standard/spec/set/type/number_spec.rb +1 -1
- data/mod/05_standard/spec/set/type/phrase_spec.rb +1 -1
- data/mod/05_standard/spec/set/type/search_type_spec.rb +15 -16
- data/mod/05_standard/spec/set/type/set_spec.rb +16 -17
- data/mod/05_standard/spec/set/type/signup_spec.rb +7 -5
- data/mod/05_standard/spec/set/type/toggle_spec.rb +4 -4
- data/mod/05_standard/spec/set/type/uri_spec.rb +11 -11
- data/mod/05_standard/spec/set/type/user_spec.rb +0 -1
- data/mod/06_bootstrap/set/all/bootstrap/form.rb +9 -10
- data/mod/06_bootstrap/set/all/bootstrap/helper.rb +22 -27
- data/mod/06_bootstrap/set/all/bootstrap/wrapper.rb +1 -2
- data/mod/06_bootstrap/set/all/rich_bootstrap.rb +1 -3
- data/mod/06_bootstrap/set/self/bootstrap_cards.rb +2 -2
- data/mod/06_bootstrap/set/self/bootstrap_js.rb +2 -2
- data/mod/06_bootstrap/set/self/bootswatch_shared.rb +19 -19
- data/mod/06_bootstrap/set/self/smartmenu_css.rb +2 -2
- data/mod/06_bootstrap/set/self/smartmenu_js.rb +3 -3
- data/mod/06_bootstrap/spec/set/all/bootstrap/form_spec.rb +5 -5
- data/spec/lib/card/action_spec.rb +4 -4
- data/spec/lib/card/cache_spec.rb +3 -5
- data/spec/lib/card/chunk_spec.rb +6 -8
- data/spec/lib/card/codename_spec.rb +4 -6
- data/spec/lib/card/content_spec.rb +12 -17
- data/spec/lib/card/diff_spec.rb +59 -61
- data/spec/lib/card/format_spec.rb +55 -34
- data/spec/lib/card/loader_spec.rb +35 -37
- data/spec/lib/card/name_spec.rb +159 -145
- data/spec/lib/card/query_spec.rb +4 -4
- data/spec/lib/card/reference_spec.rb +24 -24
- data/spec/lib/card/set_pattern_spec.rb +3 -3
- data/spec/lib/card/stage_director_spec.rb +218 -0
- data/spec/lib/card/subcards_spec.rb +12 -16
- data/spec/lib/card/success_spec.rb +16 -18
- data/spec/lib/card/view_cache_spec.rb +1 -1
- data/spec/mailers/mailer_spec.rb +3 -5
- data/spec/models/card/cardtype_spec.rb +40 -51
- data/spec/models/card/create_spec.rb +58 -39
- data/spec/models/card/trash_spec.rb +23 -32
- data/spec/models/card/type_transition_spec.rb +41 -32
- data/spec/models/card/validation_spec.rb +13 -15
- data/spec/models/card_spec.rb +48 -59
- data/spec/spec_helper.rb +26 -31
- metadata +16 -2
@@ -0,0 +1,66 @@
|
|
1
|
+
class Card
|
2
|
+
def act opts={}
|
3
|
+
if !DirectorRegister.act_card
|
4
|
+
DirectorRegister.clear
|
5
|
+
self.director = nil
|
6
|
+
DirectorRegister.act_card = self
|
7
|
+
main_act_block = true
|
8
|
+
if opts[:success]
|
9
|
+
Env[:success] = Success.new(cardname, Env.params[:success])
|
10
|
+
end
|
11
|
+
else
|
12
|
+
main_act_block = false
|
13
|
+
end
|
14
|
+
yield
|
15
|
+
ensure
|
16
|
+
DirectorRegister.clear if main_act_block
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.new_director card, opts={}
|
20
|
+
if opts[:parent]
|
21
|
+
StageSubdirector.new card, opts
|
22
|
+
elsif DirectorRegister.act_card &&
|
23
|
+
DirectorRegister.act_card != card &&
|
24
|
+
DirectorRegister.act_card.director.running?
|
25
|
+
DirectorRegister.act_card.director.subdirectors.add(card)
|
26
|
+
else
|
27
|
+
StageDirector.new card
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class DirectorRegister
|
32
|
+
cattr_accessor :act_card
|
33
|
+
|
34
|
+
class << self
|
35
|
+
def act_director
|
36
|
+
return unless DirectorRegister.act_card
|
37
|
+
DirectorRegister.act_card.director
|
38
|
+
end
|
39
|
+
|
40
|
+
def directors
|
41
|
+
@directors ||= {}
|
42
|
+
end
|
43
|
+
|
44
|
+
def clear
|
45
|
+
DirectorRegister.act_card = nil
|
46
|
+
directors.each_pair do |card, _dir|
|
47
|
+
card.director = nil
|
48
|
+
end
|
49
|
+
@directors = nil
|
50
|
+
end
|
51
|
+
|
52
|
+
def fetch card, opts={}
|
53
|
+
directors[card] ||= Card.new_director card, opts
|
54
|
+
end
|
55
|
+
|
56
|
+
def add director
|
57
|
+
directors[director.card] = director
|
58
|
+
end
|
59
|
+
|
60
|
+
def delete director
|
61
|
+
return unless @directors
|
62
|
+
@directors.delete director.card
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/card/env.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
class Card
|
4
2
|
require 'card/location'
|
5
3
|
|
@@ -16,8 +14,10 @@ class Card
|
|
16
14
|
self[:ip] = c.request.remote_ip
|
17
15
|
self[:ajax] = c.request.xhr? || c.request.params[:simulate_xhr]
|
18
16
|
self[:html] = [nil, 'html'].member?(c.params[:format])
|
19
|
-
self[:host] = Card.config.override_host
|
20
|
-
|
17
|
+
self[:host] = Card.config.override_host ||
|
18
|
+
c.request.env['HTTP_HOST']
|
19
|
+
self[:protocol] = Card.config.override_protocol ||
|
20
|
+
c.request.protocol
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -29,7 +29,6 @@ class Card
|
|
29
29
|
@@env[key.to_sym] = value
|
30
30
|
end
|
31
31
|
|
32
|
-
|
33
32
|
def params
|
34
33
|
self[:params] ||= {}
|
35
34
|
end
|
@@ -56,9 +55,9 @@ class Card
|
|
56
55
|
|
57
56
|
def method_missing method_id, *args
|
58
57
|
case args.length
|
59
|
-
when 0
|
60
|
-
when 1
|
61
|
-
else
|
58
|
+
when 0 then self[method_id]
|
59
|
+
when 1 then self[method_id] = args[0]
|
60
|
+
else super
|
62
61
|
end
|
63
62
|
end
|
64
63
|
end
|
@@ -66,8 +65,6 @@ class Card
|
|
66
65
|
# session history helpers: we keep a history stack so that in the case of
|
67
66
|
# card removal we can crawl back up to the last un-removed location
|
68
67
|
module LocationHistory
|
69
|
-
#include Card::Location
|
70
|
-
|
71
68
|
def location_history
|
72
69
|
session[:history] ||= [Card::Location.card_path('')]
|
73
70
|
session[:history].shift if session[:history].size > 5
|
@@ -75,14 +72,17 @@ class Card
|
|
75
72
|
end
|
76
73
|
|
77
74
|
def save_location card
|
78
|
-
return
|
79
|
-
(card.codename == 'signin')
|
75
|
+
return unless save_location?(card)
|
80
76
|
discard_locations_for card
|
81
77
|
session[:previous_location] =
|
82
78
|
Card::Location.card_path card.cardname.url_key
|
83
79
|
location_history.push previous_location
|
84
80
|
end
|
85
81
|
|
82
|
+
def save_location? card
|
83
|
+
!Env.ajax? && Env.html? && card.known? && (card.codename != 'signin')
|
84
|
+
end
|
85
|
+
|
86
86
|
def previous_location
|
87
87
|
return unless location_history
|
88
88
|
session[:previous_location] ||= location_history.last
|
@@ -106,16 +106,13 @@ class Card
|
|
106
106
|
session.delete :interrupted_action
|
107
107
|
end
|
108
108
|
|
109
|
-
def url_key_for_location
|
110
|
-
|
109
|
+
def url_key_for_location location
|
110
|
+
(%r{/([^/]*$)} =~ location) ? Regexp.last_match[1] : nil
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
114
|
extend LocationHistory
|
115
|
-
|
116
115
|
end
|
117
116
|
|
118
|
-
|
119
|
-
|
120
117
|
Env.reset
|
121
118
|
end
|
data/lib/card/exceptions.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
3
|
class Card
|
4
|
-
class Error < StandardError #code problem
|
4
|
+
class Error < StandardError # code problem
|
5
5
|
cattr_accessor :current
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
class Oops < Error # wagneer problem (rename!)
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
class BadQuery < Error
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
class NotFound < StandardError
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
class PermissionDenied < Error
|
18
18
|
attr_reader :card
|
19
|
-
|
19
|
+
|
20
20
|
def initialize card
|
21
21
|
@card = card
|
22
22
|
super build_message
|
@@ -30,7 +30,7 @@ class Card
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
class Abort < StandardError
|
35
35
|
attr_reader :status
|
36
36
|
|
@@ -38,7 +38,5 @@ class Card
|
|
38
38
|
@status = status
|
39
39
|
super msg
|
40
40
|
end
|
41
|
-
|
42
41
|
end
|
43
|
-
|
44
42
|
end
|
data/lib/card/format.rb
CHANGED
@@ -3,12 +3,15 @@
|
|
3
3
|
class Card
|
4
4
|
class Format
|
5
5
|
include Card::Location
|
6
|
+
include Nest
|
7
|
+
include Permission
|
8
|
+
include Render
|
6
9
|
|
7
10
|
DEPRECATED_VIEWS = { view: :open, card: :open, line: :closed,
|
8
|
-
bare: :core, naked: :core }
|
11
|
+
bare: :core, naked: :core }.freeze
|
9
12
|
INCLUSION_MODES = { closed: :closed, closed_content: :closed, edit: :edit,
|
10
13
|
layout: :layout, new: :edit, setup: :edit,
|
11
|
-
normal: :normal, template: :template }
|
14
|
+
normal: :normal, template: :template }.freeze
|
12
15
|
# FIXME: should be set in views
|
13
16
|
|
14
17
|
cattr_accessor :ajax_call, :registered
|
@@ -19,7 +22,7 @@ class Card
|
|
19
22
|
end
|
20
23
|
|
21
24
|
attr_reader :card, :root, :parent, :main_opts
|
22
|
-
attr_accessor :form, :error_status, :
|
25
|
+
attr_accessor :form, :error_status, :nest_opts
|
23
26
|
|
24
27
|
class << self
|
25
28
|
@@registered = []
|
@@ -70,9 +73,7 @@ class Card
|
|
70
73
|
|
71
74
|
def format_ancestry
|
72
75
|
ancestry = [self]
|
73
|
-
unless self == Card::Format
|
74
|
-
ancestry = ancestry + superclass.format_ancestry
|
75
|
-
end
|
76
|
+
ancestry += superclass.format_ancestry unless self == Card::Format
|
76
77
|
ancestry
|
77
78
|
end
|
78
79
|
|
@@ -84,9 +85,7 @@ class Card
|
|
84
85
|
# ~~~~~ INSTANCE METHODS
|
85
86
|
|
86
87
|
def initialize card, opts={}
|
87
|
-
unless (@card = card)
|
88
|
-
raise Card::Error, 'format initialized without card'
|
89
|
-
end
|
88
|
+
raise Card::Error, 'format initialized without card' unless (@card = card)
|
90
89
|
opts.each do |key, value|
|
91
90
|
instance_variable_set "@#{key}", value
|
92
91
|
end
|
@@ -103,11 +102,11 @@ class Card
|
|
103
102
|
def get_context_names
|
104
103
|
case
|
105
104
|
when @context_names
|
106
|
-
part_keys = @card.cardname.part_names.map
|
105
|
+
part_keys = @card.cardname.part_names.map(&:key)
|
107
106
|
@context_names.reject { |n| !part_keys.include? n.key }
|
108
107
|
when params[:slot]
|
109
108
|
context_name_list = params[:slot][:name_context].to_s
|
110
|
-
context_name_list.split(',').map
|
109
|
+
context_name_list.split(',').map(&:to_name)
|
111
110
|
else
|
112
111
|
[]
|
113
112
|
end
|
@@ -121,18 +120,6 @@ class Card
|
|
121
120
|
end
|
122
121
|
end
|
123
122
|
|
124
|
-
def inclusion_defaults nested_card
|
125
|
-
@inclusion_defaults ||= begin
|
126
|
-
defaults = get_inclusion_defaults(nested_card).clone
|
127
|
-
defaults.merge! @inclusion_opts if @inclusion_opts
|
128
|
-
defaults
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
def get_inclusion_defaults _nested_card
|
133
|
-
{ view: :name }
|
134
|
-
end
|
135
|
-
|
136
123
|
def params
|
137
124
|
Env.params
|
138
125
|
end
|
@@ -147,9 +134,9 @@ class Card
|
|
147
134
|
|
148
135
|
def showname title=nil
|
149
136
|
if title
|
150
|
-
title.to_name.to_absolute_name(card.cardname).to_show
|
137
|
+
title.to_name.to_absolute_name(card.cardname).to_show(*@context_names)
|
151
138
|
else
|
152
|
-
@showname ||= card.cardname.to_show
|
139
|
+
@showname ||= card.cardname.to_show(*@context_names)
|
153
140
|
end
|
154
141
|
end
|
155
142
|
|
@@ -184,10 +171,13 @@ class Card
|
|
184
171
|
|
185
172
|
def method_missing method, *opts, &proc
|
186
173
|
if method =~ /(_)?(optional_)?render(_(\w+))?/
|
187
|
-
view =
|
174
|
+
view = Regexp.last_match(3) ? Regexp.last_match(4) : opts.shift
|
188
175
|
args = opts[0] ? opts.shift.clone : {}
|
189
|
-
|
190
|
-
|
176
|
+
if Regexp.last_match(2)
|
177
|
+
args[:optional] = true
|
178
|
+
args[:default_visibility] = opts.shift
|
179
|
+
end
|
180
|
+
args[:skip_permissions] = true if Regexp.last_match(1)
|
191
181
|
render view, args
|
192
182
|
else
|
193
183
|
proc = proc { |*a| raw yield *a } if proc
|
@@ -196,135 +186,10 @@ class Card
|
|
196
186
|
end
|
197
187
|
end
|
198
188
|
|
199
|
-
#
|
200
|
-
# ---------- Rendering ------------
|
201
|
-
#
|
202
|
-
|
203
|
-
def render view, args={}
|
204
|
-
view = canonicalize_view view
|
205
|
-
return if hidden_view? view, args
|
206
|
-
view = ok_view view, args
|
207
|
-
current_view(view) do
|
208
|
-
args = default_render_args view, args
|
209
|
-
with_inclusion_mode view do
|
210
|
-
Card::ViewCache.fetch(self, view, args) do
|
211
|
-
method = view_method view, args
|
212
|
-
method.arity == 0 ? method.call : method.call(args)
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
rescue => e
|
217
|
-
rescue_view e, view
|
218
|
-
end
|
219
|
-
|
220
|
-
def view_method view, args
|
221
|
-
method "_view_#{view}"
|
222
|
-
rescue
|
223
|
-
args[:unsupported_view] = view
|
224
|
-
method '_view_unsupported_view'
|
225
|
-
end
|
226
|
-
|
227
|
-
def hidden_view? view, args
|
228
|
-
args.delete(:optional) && !show_view?(view, args)
|
229
|
-
end
|
230
|
-
|
231
|
-
def show_view? view, args
|
232
|
-
default = args.delete(:default_visibility) || :show # FIXME: - ugly
|
233
|
-
api_option = args["optional_#{view}".to_sym]
|
234
|
-
case
|
235
|
-
# permanent visibility specified in code
|
236
|
-
when api_option == :always then true
|
237
|
-
when api_option == :never then false
|
238
|
-
else
|
239
|
-
# wagneer can override code settings
|
240
|
-
contextual_setting = nest_arg_visibility(view, args) || api_option
|
241
|
-
case contextual_setting
|
242
|
-
when :show then true
|
243
|
-
when :hide then false
|
244
|
-
else default == :show
|
245
|
-
end
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
def nest_arg_visibility view, args
|
250
|
-
[:show, :hide].each do |setting|
|
251
|
-
return setting if parse_view_visibility(args[setting]).member?(view)
|
252
|
-
end
|
253
|
-
false
|
254
|
-
end
|
255
|
-
|
256
|
-
def parse_view_visibility val
|
257
|
-
case val
|
258
|
-
when NilClass then []
|
259
|
-
when Array then val
|
260
|
-
when String then val.split(/[\s,]+/)
|
261
|
-
else raise Card::Error, "bad show/hide argument: #{val}"
|
262
|
-
end.map { |view| canonicalize_view view }
|
263
|
-
end
|
264
|
-
|
265
|
-
def default_render_args view, a=nil
|
266
|
-
args =
|
267
|
-
case a
|
268
|
-
when nil then {}
|
269
|
-
when Hash then a.clone
|
270
|
-
when Array then a[0].merge a[1]
|
271
|
-
else raise Card::Error, "bad render args: #{a}"
|
272
|
-
end
|
273
|
-
|
274
|
-
default_method = "default_#{view}_args"
|
275
|
-
if respond_to? default_method
|
276
|
-
send default_method, args
|
277
|
-
end
|
278
|
-
args
|
279
|
-
end
|
280
|
-
|
281
|
-
def rescue_view e, view
|
282
|
-
if Rails.env =~ /^cucumber|test$/
|
283
|
-
raise e
|
284
|
-
else
|
285
|
-
Rails.logger.info "\nError rendering #{error_cardname} / #{view}: "\
|
286
|
-
"#{e.class} : #{e.message}"
|
287
|
-
Card::Error.current = e
|
288
|
-
card.notable_exception_raised
|
289
|
-
if (debug = Card[:debugger]) && debug.content == 'on'
|
290
|
-
raise e
|
291
|
-
else
|
292
|
-
rendering_error e, view
|
293
|
-
end
|
294
|
-
end
|
295
|
-
end
|
296
|
-
|
297
|
-
def current_view view
|
298
|
-
old_view = @current_view
|
299
|
-
@current_view = view
|
300
|
-
yield
|
301
|
-
ensure
|
302
|
-
@current_view = old_view
|
303
|
-
end
|
304
|
-
|
305
|
-
def error_cardname
|
306
|
-
card && card.name.present? ? card.name : 'unknown card'
|
307
|
-
end
|
308
|
-
|
309
|
-
def rendering_error _exception, view
|
310
|
-
"Error rendering: #{error_cardname} (#{view} view)"
|
311
|
-
end
|
312
|
-
|
313
189
|
#
|
314
190
|
# ------------- Sub Format and Inclusion Processing ------------
|
315
191
|
#
|
316
192
|
|
317
|
-
def subformat subcard
|
318
|
-
subcard = Card.fetch(subcard, new: {}) if subcard.is_a?(String)
|
319
|
-
self.class.new subcard,
|
320
|
-
parent: self, depth: @depth + 1, root: @root,
|
321
|
-
# FIXME: - the following four should not be hard-coded
|
322
|
-
# here. need a generalized mechanism
|
323
|
-
# for attribute inheritance
|
324
|
-
context_names: @context_names, mode: @mode,
|
325
|
-
mainline: @mainline, form: @form
|
326
|
-
end
|
327
|
-
|
328
193
|
def process_content override_content=nil, opts={}
|
329
194
|
process_content_object(override_content, opts).to_s
|
330
195
|
end
|
@@ -345,228 +210,14 @@ class Card
|
|
345
210
|
end
|
346
211
|
end
|
347
212
|
|
348
|
-
def ok_view view, args={}
|
349
|
-
return view if args.delete :skip_permissions
|
350
|
-
approved_view = approved_view view, args
|
351
|
-
args[:denied_view] = view if approved_view != view
|
352
|
-
if focal? && (error_code = @@error_code[approved_view])
|
353
|
-
root.error_status = error_code
|
354
|
-
end
|
355
|
-
approved_view
|
356
|
-
end
|
357
|
-
|
358
|
-
def approved_view view, args={}
|
359
|
-
case
|
360
|
-
when @depth >= Card.config.max_depth
|
361
|
-
# prevent recursion. @depth tracks subformats
|
362
|
-
:too_deep
|
363
|
-
when @@perms[view] == :none
|
364
|
-
# permission skipping specified in view definition
|
365
|
-
view
|
366
|
-
when args.delete(:skip_permissions)
|
367
|
-
# permission skipping specified in args
|
368
|
-
view
|
369
|
-
when !card.known? && !tagged(view, :unknown_ok)
|
370
|
-
# handle unknown cards (where view not exempt)
|
371
|
-
view_for_unknown view, args
|
372
|
-
else
|
373
|
-
# run explicit permission checks
|
374
|
-
permitted_view view, args
|
375
|
-
end
|
376
|
-
end
|
377
|
-
|
378
213
|
def tagged view, tag
|
379
214
|
self.class.tagged view, tag
|
380
215
|
end
|
381
216
|
|
382
|
-
def permitted_view view, args
|
383
|
-
perms_required = @@perms[view] || :read
|
384
|
-
args[:denied_task] =
|
385
|
-
if Proc === perms_required
|
386
|
-
:read if !(perms_required.call self) # read isn't quite right
|
387
|
-
else
|
388
|
-
[perms_required].flatten.find { |task| !ok? task }
|
389
|
-
end
|
390
|
-
|
391
|
-
if args[:denied_task]
|
392
|
-
@@denial[view] || :denial
|
393
|
-
else
|
394
|
-
view
|
395
|
-
end
|
396
|
-
end
|
397
|
-
|
398
|
-
def ok? task
|
399
|
-
task = :create if task == :update && card.new_card?
|
400
|
-
@ok ||= {}
|
401
|
-
@ok[task] = card.ok? task if @ok[task].nil?
|
402
|
-
@ok[task]
|
403
|
-
end
|
404
|
-
|
405
|
-
def view_for_unknown _view, _args
|
406
|
-
# note: overridden in HTML
|
407
|
-
focal? ? :not_found : :missing
|
408
|
-
end
|
409
|
-
|
410
|
-
def canonicalize_view view
|
411
|
-
return if view.blank?
|
412
|
-
view_key = view.to_viewname.key.to_sym
|
413
|
-
DEPRECATED_VIEWS[view_key] || view_key
|
414
|
-
end
|
415
|
-
|
416
|
-
def with_inclusion_mode mode
|
417
|
-
if (switch_mode = INCLUSION_MODES[mode]) && @mode != switch_mode
|
418
|
-
old_mode, @mode = @mode, switch_mode
|
419
|
-
@inclusion_defaults = nil
|
420
|
-
end
|
421
|
-
result = yield
|
422
|
-
if old_mode
|
423
|
-
@inclusion_defaults = nil
|
424
|
-
@mode = old_mode
|
425
|
-
end
|
426
|
-
result
|
427
|
-
end
|
428
|
-
|
429
|
-
def prepare_nest opts
|
430
|
-
@char_count ||= 0
|
431
|
-
opts ||= {}
|
432
|
-
|
433
|
-
case
|
434
|
-
when opts.has_key?(:comment)
|
435
|
-
# commented nest
|
436
|
-
opts[:comment]
|
437
|
-
when @mode == :closed && @char_count > Card.config.max_char_count
|
438
|
-
# move on; content out of view
|
439
|
-
''
|
440
|
-
when opts[:inc_name] == '_main' && show_layout? && @depth == 0
|
441
|
-
# the main card within a layout
|
442
|
-
expand_main opts
|
443
|
-
else
|
444
|
-
# standard nest
|
445
|
-
result = nest fetch_nested_card(opts), opts
|
446
|
-
@char_count += result.length if @mode == :closed && result
|
447
|
-
result
|
448
|
-
end
|
449
|
-
end
|
450
|
-
|
451
|
-
def expand_main opts
|
452
|
-
opts.merge! root.main_opts if root.main_opts
|
453
|
-
legacy_main_opts_tweaks! opts
|
454
|
-
|
455
|
-
with_inclusion_mode :normal do
|
456
|
-
@mainline = true
|
457
|
-
result = wrap_main nest(root.card, opts)
|
458
|
-
@mainline = false
|
459
|
-
result
|
460
|
-
end
|
461
|
-
end
|
462
|
-
|
463
|
-
def legacy_main_opts_tweaks! opts
|
464
|
-
if (val = params[:size]) && val.present?
|
465
|
-
opts[:size] = val.to_sym
|
466
|
-
end
|
467
|
-
|
468
|
-
if (val = params[:item]) && val.present?
|
469
|
-
opts[:items] = (opts[:items] || {}).reverse_merge view: val.to_sym
|
470
|
-
end
|
471
|
-
end
|
472
|
-
|
473
|
-
def wrap_main content
|
474
|
-
content # no wrapping in base format
|
475
|
-
end
|
476
|
-
|
477
|
-
def nest nested_card, opts={}
|
478
|
-
# ActiveSupport::Notifications.instrument('card', message:
|
479
|
-
# "nest: #{nested_card.name}, #{opts}") do
|
480
|
-
opts.delete_if { |_k, v| v.nil? }
|
481
|
-
opts.reverse_merge! inclusion_defaults(nested_card)
|
482
|
-
|
483
|
-
sub = nil
|
484
|
-
if opts[:inc_name] =~ /^_(self)?$/
|
485
|
-
sub = self
|
486
|
-
else
|
487
|
-
sub = subformat nested_card
|
488
|
-
sub.inclusion_opts = opts[:items] ? opts[:items].clone : {}
|
489
|
-
end
|
490
|
-
|
491
|
-
view = canonicalize_view opts.delete :view
|
492
|
-
opts[:home_view] = [:closed, :edit].member?(view) ? :open : view
|
493
|
-
# FIXME: special views should be represented in view definitions
|
494
|
-
|
495
|
-
view =
|
496
|
-
case @mode
|
497
|
-
when :edit then view_in_edit_mode(view, nested_card)
|
498
|
-
when :template then :template_rule
|
499
|
-
when :closed then view_in_closed_mode(view, nested_card)
|
500
|
-
else view
|
501
|
-
end
|
502
|
-
|
503
|
-
sub.optional_render view, opts
|
504
|
-
# end
|
505
|
-
end
|
506
|
-
|
507
|
-
def view_in_edit_mode homeview, nested_card
|
508
|
-
not_in_form =
|
509
|
-
@@perms[homeview] == :none || # view configured not to keep in form
|
510
|
-
nested_card.structure || # not yet nesting structures
|
511
|
-
nested_card.key.blank? # eg {{_self|type}} on new cards
|
512
|
-
|
513
|
-
not_in_form ? :blank : :edit_in_form
|
514
|
-
end
|
515
|
-
|
516
|
-
def view_in_closed_mode homeview, nested_card
|
517
|
-
approved_view = @@closed[homeview]
|
518
|
-
case
|
519
|
-
when approved_view == true then homeview
|
520
|
-
when @@error_code[homeview] then homeview
|
521
|
-
when approved_view then approved_view
|
522
|
-
when !nested_card.known? then :closed_missing
|
523
|
-
else :closed_content
|
524
|
-
end
|
525
|
-
end
|
526
|
-
|
527
|
-
def get_inclusion_content cardname
|
528
|
-
content = params[cardname.to_s.tr('+', '_')]
|
529
|
-
|
530
|
-
# CLEANME This is a hack so plus cards re-populate on failed signups
|
531
|
-
p = params['subcards']
|
532
|
-
if p && (card_params = p[cardname.to_s])
|
533
|
-
content = card_params['content']
|
534
|
-
end
|
535
|
-
content if content.present? # returns nil for empty string
|
536
|
-
end
|
537
|
-
|
538
|
-
def fetch_nested_card options
|
539
|
-
args = { name: options[:inc_name], type: options[:type], supercard: card }
|
540
|
-
args.delete(:supercard) if options[:inc_name].strip.blank?
|
541
|
-
# special case. gets absolutized incorrectly. fix in smartname?
|
542
|
-
if options[:inc_name] =~ /^_main\+/
|
543
|
-
# FIXME: this is a rather hacky (and untested) way to get @superleft
|
544
|
-
# to work on new cards named _main+whatever
|
545
|
-
args[:name] = args[:name].gsub /^_main\+/, '+'
|
546
|
-
args[:supercard] = root.card
|
547
|
-
end
|
548
|
-
if (content = get_inclusion_content options[:inc_name])
|
549
|
-
args[:content] = content
|
550
|
-
end
|
551
|
-
Card.fetch options[:inc_name], new: args
|
552
|
-
end
|
553
|
-
|
554
|
-
def default_item_view
|
555
|
-
:name
|
556
|
-
end
|
557
|
-
|
558
217
|
#
|
559
218
|
# ------------ LINKS ---------------
|
560
219
|
#
|
561
220
|
|
562
|
-
def add_class options, klass
|
563
|
-
options[:class] = [options[:class], klass].flatten.compact * ' '
|
564
|
-
end
|
565
|
-
|
566
|
-
def unique_id
|
567
|
-
"#{card.key}-#{Time.now.to_i}-#{rand(3)}"
|
568
|
-
end
|
569
|
-
|
570
221
|
def format_date date, include_time=true
|
571
222
|
# using DateTime because Time doesn't support %e on some platforms
|
572
223
|
if include_time
|