brisk-bills 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +8 -0
- data/COPYING +674 -0
- data/COPYING.LESSER +165 -0
- data/INSTALL +5 -0
- data/README +22 -0
- data/Rakefile +11 -0
- data/TODO.txt +112 -0
- data/app/controllers/admin/activities_controller.rb +151 -0
- data/app/controllers/admin/activities_controller/adjustment.rb +16 -0
- data/app/controllers/admin/activities_controller/labor.rb +119 -0
- data/app/controllers/admin/activities_controller/labor/slimtimer.rb +28 -0
- data/app/controllers/admin/activities_controller/material.rb +20 -0
- data/app/controllers/admin/activities_controller/proposal.rb +15 -0
- data/app/controllers/admin/activities_with_prices_controller.rb +68 -0
- data/app/controllers/admin/adjustments_controller.rb +22 -0
- data/app/controllers/admin/client_accounting_controller.rb +49 -0
- data/app/controllers/admin/client_financial_transactions_controller.rb +24 -0
- data/app/controllers/admin/client_representatives_controller.rb +31 -0
- data/app/controllers/admin/clients_controller.rb +31 -0
- data/app/controllers/admin/employee_client_labor_rate_controller.rb +30 -0
- data/app/controllers/admin/employees_controller.rb +32 -0
- data/app/controllers/admin/employees_controller/slimtimer.rb +29 -0
- data/app/controllers/admin/invoices_controller.rb +165 -0
- data/app/controllers/admin/labors_controller.rb +103 -0
- data/app/controllers/admin/labors_controller/slimtimer.rb +31 -0
- data/app/controllers/admin/materials_controller.rb +24 -0
- data/app/controllers/admin/payments_controller.rb +75 -0
- data/app/controllers/admin/proposals_controller.rb +22 -0
- data/app/controllers/admin/settings_controller.rb +23 -0
- data/app/controllers/application_controller.rb +22 -0
- data/app/controllers/authentication_controller.rb +131 -0
- data/app/helpers/activity_type_model_helper.rb +194 -0
- data/app/helpers/admin/activities_helper.rb +110 -0
- data/app/helpers/admin/activities_helper/labor_helper.rb +28 -0
- data/app/helpers/admin/activities_helper/proposal_helper.rb +11 -0
- data/app/helpers/admin/activities_helper/slimtimer_helper.rb +13 -0
- data/app/helpers/admin/activities_with_prices_helper.rb +17 -0
- data/app/helpers/admin/activity_tax_controller_helper.rb +48 -0
- data/app/helpers/admin/activity_tax_field_helper.rb +33 -0
- data/app/helpers/admin/activity_type_controller_helper.rb +83 -0
- data/app/helpers/admin/activity_type_field_helper.rb +45 -0
- data/app/helpers/admin/adjustments_helper.rb +5 -0
- data/app/helpers/admin/client_accounting_helper.rb +13 -0
- data/app/helpers/admin/client_financial_transactions_helper.rb +9 -0
- data/app/helpers/admin/client_representatives_helper.rb +26 -0
- data/app/helpers/admin/clients_helper.rb +6 -0
- data/app/helpers/admin/employee_client_labor_rate_helper.rb +77 -0
- data/app/helpers/admin/employees_helper.rb +9 -0
- data/app/helpers/admin/employees_helper/slimtimer_helper.rb +2 -0
- data/app/helpers/admin/has_credential_column_helper.rb +60 -0
- data/app/helpers/admin/invoices_helper.rb +59 -0
- data/app/helpers/admin/is_active_column_helper.rb +46 -0
- data/app/helpers/admin/labors_helper.rb +20 -0
- data/app/helpers/admin/labors_helper/slimtimer_helper.rb +13 -0
- data/app/helpers/admin/materials_helper.rb +5 -0
- data/app/helpers/admin/payments_helper.rb +41 -0
- data/app/helpers/admin/proposals_helper.rb +3 -0
- data/app/helpers/admin/settings_helper.rb +8 -0
- data/app/helpers/admin_layout_helper.rb +91 -0
- data/app/helpers/application_helper.rb +27 -0
- data/app/helpers/authentication_helper.rb +61 -0
- data/app/helpers/extensible_object_helper.rb +28 -0
- data/app/helpers/has_credential_model_helper.rb +39 -0
- data/app/helpers/invoice_pdf_helper.rb +71 -0
- data/app/helpers/is_active_model_helper.rb +40 -0
- data/app/helpers/money_model_helper.rb +21 -0
- data/app/model_views/client_accounting.rb +5 -0
- data/app/model_views/client_financial_transaction.rb +15 -0
- data/app/model_views/invoices_with_total.rb +36 -0
- data/app/models/activity.rb +104 -0
- data/app/models/activity/adjustment.rb +34 -0
- data/app/models/activity/labor.rb +91 -0
- data/app/models/activity/labor/slimtimer.rb +28 -0
- data/app/models/activity/material.rb +16 -0
- data/app/models/activity/proposal.rb +17 -0
- data/app/models/activity_type.rb +2 -0
- data/app/models/client.rb +93 -0
- data/app/models/client_eventlog.rb +5 -0
- data/app/models/client_representative.rb +22 -0
- data/app/models/credential.rb +195 -0
- data/app/models/employee.rb +49 -0
- data/app/models/employee/labor.rb +13 -0
- data/app/models/employee/slimtimer.rb +43 -0
- data/app/models/employee_client_labor_rate.rb +20 -0
- data/app/models/invoice.rb +280 -0
- data/app/models/invoice_payment.rb +8 -0
- data/app/models/notifier.rb +85 -0
- data/app/models/payment.rb +108 -0
- data/app/models/payment_method.rb +7 -0
- data/app/models/setting.rb +39 -0
- data/app/models/slimtimer_task.rb +6 -0
- data/app/models/slimtimer_time_entry.rb +69 -0
- data/app/views/admin/activities/_adjustment_column.rhtml +23 -0
- data/app/views/admin/activities/_form.rhtml +20 -0
- data/app/views/admin/activities/_form_attribute.rhtml +12 -0
- data/app/views/admin/activities/_labor_column.rhtml +17 -0
- data/app/views/admin/activities/_material_column.rhtml +10 -0
- data/app/views/admin/activities/_proposal_column.rhtml +11 -0
- data/app/views/admin/activities_with_prices/move_to_invoice.rhtml +44 -0
- data/app/views/admin/activities_with_prices/move_to_invoice.rjs +9 -0
- data/app/views/admin/invoices/download.rpdf +224 -0
- data/app/views/authentication/email.rjs +9 -0
- data/app/views/authentication/login.rhtml +75 -0
- data/app/views/authentication/login.rjs +14 -0
- data/app/views/authentication/reset_password_via_token.rhtml +16 -0
- data/app/views/authentication/reset_password_via_token.rjs +6 -0
- data/app/views/authentication/sign_in_error.rjs +2 -0
- data/app/views/layouts/_navigation_tree.rhtml +15 -0
- data/app/views/layouts/admin.rhtml +26 -0
- data/app/views/layouts/public.rhtml +18 -0
- data/app/views/notifier/_email_footer.html.rhtml +12 -0
- data/app/views/notifier/_email_footer.plain.rhtml +3 -0
- data/app/views/notifier/_email_header.html.rhtml +53 -0
- data/app/views/notifier/invoice_available.html.rhtml +5 -0
- data/app/views/notifier/invoice_available.plain.rhtml +4 -0
- data/app/views/notifier/reset_password_requested.html.rhtml +15 -0
- data/app/views/notifier/reset_password_requested.plain.rhtml +9 -0
- data/bin/brisk-bills +51 -0
- data/config/boot.rb +164 -0
- data/config/environment.rb +39 -0
- data/config/environments/development.rb +17 -0
- data/config/environments/production.rb +18 -0
- data/config/environments/test.rb +19 -0
- data/config/locale/en.rb +26 -0
- data/config/routes.rb +20 -0
- data/config/secrets.yml +2 -0
- data/db/migrate/001_create_employees.rb +14 -0
- data/db/migrate/002_create_employee_slimtimers.rb +14 -0
- data/db/migrate/003_create_slimtimer_tasks.rb +21 -0
- data/db/migrate/004_create_slimtimer_time_entries.rb +25 -0
- data/db/migrate/005_create_clients.rb +12 -0
- data/db/migrate/006_create_client_representatives.rb +16 -0
- data/db/migrate/007_create_client_eventlogs.rb +13 -0
- data/db/migrate/008_create_activities.rb +17 -0
- data/db/migrate/009_create_activity_labors.rb +16 -0
- data/db/migrate/010_create_employee_client_labor_rates.rb +19 -0
- data/db/migrate/011_create_activity_adjustments.rb +16 -0
- data/db/migrate/012_create_activity_materials.rb +16 -0
- data/db/migrate/013_create_activity_proposals.rb +18 -0
- data/db/migrate/014_create_invoices.rb +16 -0
- data/db/migrate/015_create_payments.rb +18 -0
- data/db/migrate/016_create_payment_methods.rb +18 -0
- data/db/migrate/017_create_invoice_payments.rb +14 -0
- data/db/migrate/018_create_activity_types.rb +37 -0
- data/db/migrate/019_create_settings.rb +45 -0
- data/db/migrate/020_is_active_employees_clients.rb +11 -0
- data/db/migrate/021_create_views_and_indexes.rb +78 -0
- data/db/migrate/022_create_client_financial_transactions.rb +32 -0
- data/db/migrate/023_create_credentials_migrate_representatives.rb +133 -0
- data/db/migrate/024_updates_for_sales_tax.rb +91 -0
- data/db/migrate/025_alter_credentials_for_reset.rb +11 -0
- data/db/migrate/026_create_st_settings.rb +17 -0
- data/db/migrate/027_create_sessions.rb +16 -0
- data/db/migrate/028_money_to_cents.rb +136 -0
- data/db/schema.rb +301 -0
- data/lib/brisk-bills.rb +17 -0
- data/lib/brisk-bills/initializer.rb +100 -0
- data/lib/dti-navigation-menu/lib/dti-navigation-menu.rb +27 -0
- data/lib/generators/generator_base_extension.rb +16 -0
- data/lib/generators/instance/instance_generator.rb +117 -0
- data/lib/generators/instance/templates/databases/mysql.yml +47 -0
- data/lib/generators/instance/templates/instance_boot.rb +166 -0
- data/lib/generators/instance/templates/instance_environment.rb +65 -0
- data/lib/generators/instance/templates/instance_generate +18 -0
- data/lib/generators/instance/templates/instance_rakefile +3 -0
- data/lib/generators/instance/templates/instance_routes.rb +1 -0
- data/lib/tasks/create_last_months_invoices.rake +37 -0
- data/lib/tasks/credential_tasks.rake +47 -0
- data/lib/tasks/first_time_setup.rake +96 -0
- data/lib/tasks/instance.rake +27 -0
- data/lib/tasks/invoice_as_csv.rake +32 -0
- data/lib/tasks/package.rake +120 -0
- data/lib/tasks/slimtimer_import.rake +198 -0
- data/lib/utilities.rb +18 -0
- data/log/.keep +0 -0
- data/public/.htaccess +40 -0
- data/public/404.html +30 -0
- data/public/500.html +30 -0
- data/public/blank.html +33 -0
- data/public/blank_iframe.html +2 -0
- data/public/dispatch.cgi +10 -0
- data/public/dispatch.fcgi +24 -0
- data/public/dispatch.rb +10 -0
- data/public/favicon.ico +0 -0
- data/public/images/active_scaffold/DO_NOT_EDIT +2 -0
- data/public/images/active_scaffold/default/add.gif +0 -0
- data/public/images/active_scaffold/default/arrow_down.gif +0 -0
- data/public/images/active_scaffold/default/arrow_up.gif +0 -0
- data/public/images/active_scaffold/default/close.gif +0 -0
- data/public/images/active_scaffold/default/cross.png +0 -0
- data/public/images/active_scaffold/default/indicator-small.gif +0 -0
- data/public/images/active_scaffold/default/indicator.gif +0 -0
- data/public/images/active_scaffold/default/magnifier.png +0 -0
- data/public/images/background.gif +0 -0
- data/public/images/brisk-bills-logo.gif +0 -0
- data/public/images/calendar_date_select/calendar.gif +0 -0
- data/public/images/dti-logo.gif +0 -0
- data/public/images/dti-logo.jpg +0 -0
- data/public/images/favicon.ico +0 -0
- data/public/images/invoice-background.jpg +0 -0
- data/public/images/login-form-spinner.gif +0 -0
- data/public/images/nav-arrow.gif +0 -0
- data/public/images/notice-error.gif +0 -0
- data/public/images/notice-info.gif +0 -0
- data/public/images/rails.png +0 -0
- data/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
- data/public/javascripts/active_scaffold/default/active_scaffold.js +430 -0
- data/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
- data/public/javascripts/active_scaffold/default/form_enhancements.js +114 -0
- data/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
- data/public/javascripts/application.js +2 -0
- data/public/javascripts/briskbills-quick-helpers.js +9 -0
- data/public/javascripts/builder.js +136 -0
- data/public/javascripts/controls.js +963 -0
- data/public/javascripts/dragdrop.js +973 -0
- data/public/javascripts/effects.js +1128 -0
- data/public/javascripts/modalbox.js +573 -0
- data/public/javascripts/prototype.js +4320 -0
- data/public/javascripts/scriptaculous.js +58 -0
- data/public/javascripts/shadedborder.js +249 -0
- data/public/javascripts/slider.js +275 -0
- data/public/javascripts/sound.js +55 -0
- data/public/javascripts/unittest.js +568 -0
- data/public/robots.txt +1 -0
- data/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
- data/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
- data/public/stylesheets/active_scaffold/default/stylesheet.css +809 -0
- data/public/stylesheets/admin/global.css +152 -0
- data/public/stylesheets/admin/pages.css +137 -0
- data/public/stylesheets/admin/screen.css +3 -0
- data/public/stylesheets/admin/structure.css +88 -0
- data/public/stylesheets/modalbox.css +95 -0
- data/public/stylesheets/public/global.css +36 -0
- data/public/stylesheets/public/pages.css +105 -0
- data/public/stylesheets/public/screen.css +3 -0
- data/public/stylesheets/public/structure.css +0 -0
- data/public/stylesheets/spinner.gif +0 -0
- data/script/about +3 -0
- data/script/breakpointer +3 -0
- data/script/console +3 -0
- data/script/dbconsole +3 -0
- data/script/destroy +3 -0
- data/script/generate +3 -0
- data/script/performance/benchmarker +3 -0
- data/script/performance/profiler +3 -0
- data/script/performance/request +3 -0
- data/script/plugin +3 -0
- data/script/process/inspector +3 -0
- data/script/process/reaper +3 -0
- data/script/process/spawner +3 -0
- data/script/runner +3 -0
- data/script/server +3 -0
- data/test/fixtures/activities.yml +28 -0
- data/test/fixtures/activity_adjustments.yml +7 -0
- data/test/fixtures/activity_labors.yml +25 -0
- data/test/fixtures/activity_materials.yml +7 -0
- data/test/fixtures/activity_proposals.yml +7 -0
- data/test/fixtures/activity_types.yml +23 -0
- data/test/fixtures/client_eventlogs.yml +5 -0
- data/test/fixtures/client_financial_transactions.yml +7 -0
- data/test/fixtures/client_representatives.yml +56 -0
- data/test/fixtures/clients.yml +172 -0
- data/test/fixtures/credentials.yml +34 -0
- data/test/fixtures/employee_client_labor_rates.yml +365 -0
- data/test/fixtures/employee_slimtimers.yml +19 -0
- data/test/fixtures/employees.yml +22 -0
- data/test/fixtures/invoice_payments.yml +7 -0
- data/test/fixtures/invoices.yml +7 -0
- data/test/fixtures/payment_methods.yml +7 -0
- data/test/fixtures/payments.yml +7 -0
- data/test/fixtures/settings.yml +7 -0
- data/test/fixtures/slimtimer_tasks.yml +5 -0
- data/test/fixtures/slimtimer_time_entries.yml +5 -0
- data/test/functional/admin/activities_controller_test.rb +8 -0
- data/test/functional/admin/adjustments_controller_test.rb +8 -0
- data/test/functional/admin/client_accounting_controller_test.rb +8 -0
- data/test/functional/admin/client_financial_transactions_controller_test.rb +8 -0
- data/test/functional/admin/client_representatives_controller_test.rb +8 -0
- data/test/functional/admin/clients_controller_test.rb +8 -0
- data/test/functional/admin/employee_client_labor_rate_controller_test.rb +8 -0
- data/test/functional/admin/employees/slimtimer_controller_test.rb +8 -0
- data/test/functional/admin/employees_controller_test.rb +8 -0
- data/test/functional/admin/invoices_controller_test.rb +8 -0
- data/test/functional/admin/labors_controller_test.rb +8 -0
- data/test/functional/admin/materials_controller_test.rb +8 -0
- data/test/functional/admin/payments_controller_test.rb +8 -0
- data/test/functional/admin/proposals_controller_test.rb +8 -0
- data/test/functional/admin/settings_controller_test.rb +8 -0
- data/test/functional/authentication_controller_test.rb +8 -0
- data/test/test_helper.rb +30 -0
- data/test/test_unit_factory_helper.rb +154 -0
- data/test/unit/activity/adjustment_test.rb +8 -0
- data/test/unit/activity/labor_test.rb +279 -0
- data/test/unit/activity/material_test.rb +8 -0
- data/test/unit/activity/proposal_test.rb +8 -0
- data/test/unit/activity_test.rb +83 -0
- data/test/unit/activity_type_test.rb +8 -0
- data/test/unit/client_eventlog_test.rb +10 -0
- data/test/unit/client_financial_transaction_test.rb +8 -0
- data/test/unit/client_representative_test.rb +10 -0
- data/test/unit/client_test.rb +24 -0
- data/test/unit/credential_test.rb +217 -0
- data/test/unit/employee/slimtimer_test.rb +10 -0
- data/test/unit/employee_client_labor_rate_test.rb +8 -0
- data/test/unit/employee_test.rb +25 -0
- data/test/unit/invoice_payment_test.rb +8 -0
- data/test/unit/invoice_test.rb +459 -0
- data/test/unit/notifier_test.rb +9 -0
- data/test/unit/payment_method_test.rb +8 -0
- data/test/unit/payment_test.rb +155 -0
- data/test/unit/setting_test.rb +8 -0
- data/test/unit/slimtimer_task_test.rb +10 -0
- data/test/unit/slimtimer_time_entry_test.rb +132 -0
- data/vendor/plugins/InlineAttachment-0.3.0-modified/README +79 -0
- data/vendor/plugins/InlineAttachment-0.3.0-modified/init.rb +2 -0
- data/vendor/plugins/InlineAttachment-0.3.0-modified/lib/inline_attachment.rb +136 -0
- data/vendor/plugins/InlineAttachment-0.3.0-modified/lib/tmail_content_id.rb +40 -0
- data/vendor/plugins/active_scaffold/CHANGELOG +152 -0
- data/vendor/plugins/active_scaffold/MIT-LICENSE +20 -0
- data/vendor/plugins/active_scaffold/README +28 -0
- data/vendor/plugins/active_scaffold/Rakefile +24 -0
- data/vendor/plugins/active_scaffold/environment.rb +17 -0
- data/vendor/plugins/active_scaffold/frontends/default/images/add.gif +0 -0
- data/vendor/plugins/active_scaffold/frontends/default/images/arrow_down.gif +0 -0
- data/vendor/plugins/active_scaffold/frontends/default/images/arrow_up.gif +0 -0
- data/vendor/plugins/active_scaffold/frontends/default/images/close.gif +0 -0
- data/vendor/plugins/active_scaffold/frontends/default/images/cross.png +0 -0
- data/vendor/plugins/active_scaffold/frontends/default/images/indicator-small.gif +0 -0
- data/vendor/plugins/active_scaffold/frontends/default/images/indicator.gif +0 -0
- data/vendor/plugins/active_scaffold/frontends/default/images/magnifier.png +0 -0
- data/vendor/plugins/active_scaffold/frontends/default/javascripts/active_scaffold.js +430 -0
- data/vendor/plugins/active_scaffold/frontends/default/javascripts/dhtml_history.js +867 -0
- data/vendor/plugins/active_scaffold/frontends/default/javascripts/form_enhancements.js +114 -0
- data/vendor/plugins/active_scaffold/frontends/default/javascripts/rico_corner.js +370 -0
- data/vendor/plugins/active_scaffold/frontends/default/stylesheets/stylesheet-ie.css +35 -0
- data/vendor/plugins/active_scaffold/frontends/default/stylesheets/stylesheet.css +809 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_add_existing_form.html.erb +40 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_create_form.html.erb +49 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_create_form_on_list.html.erb +38 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_field_search.html.erb +45 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_form.html.erb +18 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_form_association.html.erb +20 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_form_association_footer.html.erb +42 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_form_association_header.html.erb +10 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_form_association_record.html.erb +27 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_form_attribute.html.erb +12 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_form_hidden_attribute.html.erb +1 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_form_messages.html.erb +5 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_horizontal_subform.html.erb +21 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_list.html.erb +37 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_list_actions.html.erb +13 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_list_calculations.html.erb +22 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_list_column_headings.html.erb +32 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_list_header.html.erb +14 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_list_inline_adapter.html.erb +9 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_list_pagination_links.html.erb +30 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_list_record.html.erb +35 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_live_search.html.erb +25 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_messages.html.erb +10 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_nested.html.erb +44 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_search.html.erb +21 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_show.html.erb +8 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_show_columns.html.erb +11 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_update_actions.html.erb +9 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/_update_form.html.erb +53 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/add_existing.js.rjs +16 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/add_existing_form.html.erb +5 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/create.html.erb +5 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/delete.html.erb +13 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/destroy.js.rjs +10 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/edit_associated.js.rjs +15 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/field_search.html.erb +5 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/form_messages.js.rjs +1 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/form_messages_on_create.js.rjs +2 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/form_messages_on_update.js.rjs +2 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/list.html.erb +44 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/on_create.js.rjs +25 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/on_update.js.rjs +11 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/search.html.erb +5 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/show.html.erb +5 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/update.html.erb +8 -0
- data/vendor/plugins/active_scaffold/frontends/default/views/update_column.js.rjs +12 -0
- data/vendor/plugins/active_scaffold/init.rb +18 -0
- data/vendor/plugins/active_scaffold/install.rb +40 -0
- data/vendor/plugins/active_scaffold/install_assets.rb +36 -0
- data/vendor/plugins/active_scaffold/lib/active_record_permissions.rb +123 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold.rb +144 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/core.rb +102 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/create.rb +120 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/delete.rb +46 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/field_search.rb +46 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/list.rb +77 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/live_search.rb +46 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/nested.rb +215 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/search.rb +40 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/show.rb +34 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/subform.rb +17 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/update.rb +114 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/attribute_params.rb +185 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/base.rb +37 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/core.rb +189 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/create.rb +43 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/delete.rb +25 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/field_search.rb +53 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/form.rb +49 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/list.rb +134 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/live_search.rb +52 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/nested.rb +31 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/search.rb +52 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/show.rb +39 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/subform.rb +33 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/config/update.rb +32 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/configurable.rb +29 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/constraints.rb +178 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/action_columns.rb +97 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/action_link.rb +136 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/action_links.rb +47 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/actions.rb +45 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/column.rb +297 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/columns.rb +75 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/error_message.rb +24 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/set.rb +62 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/sorting.rb +89 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/finder.rb +234 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/association_helpers.rb +40 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/controller_helpers.rb +25 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/country_helpers.rb +348 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/form_column_helpers.rb +267 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/id_helpers.rb +125 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/list_column_helpers.rb +178 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/pagination_helpers.rb +37 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/search_column_helpers.rb +172 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/show_column_helpers.rb +46 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/view_helpers.rb +196 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/locale/en.rb +66 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/locale/es.yml +64 -0
- data/vendor/plugins/active_scaffold/lib/active_scaffold/locale/hu.yml +62 -0
- data/vendor/plugins/active_scaffold/lib/bridges/bridge.rb +52 -0
- data/vendor/plugins/active_scaffold/lib/bridges/calendar_date_select/bridge.rb +11 -0
- data/vendor/plugins/active_scaffold/lib/bridges/calendar_date_select/lib/as_cds_bridge.rb +53 -0
- data/vendor/plugins/active_scaffold/lib/bridges/file_column/bridge.rb +12 -0
- data/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/as_file_column_bridge.rb +49 -0
- data/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/file_column_helpers.rb +51 -0
- data/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/form_ui.rb +32 -0
- data/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/list_ui.rb +26 -0
- data/vendor/plugins/active_scaffold/lib/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
- data/vendor/plugins/active_scaffold/lib/bridges/file_column/test/mock_model.rb +9 -0
- data/vendor/plugins/active_scaffold/lib/bridges/file_column/test/test_helper.rb +15 -0
- data/vendor/plugins/active_scaffold/lib/dhtml_confirm.rb +54 -0
- data/vendor/plugins/active_scaffold/lib/extensions/action_controller_rendering.rb +20 -0
- data/vendor/plugins/active_scaffold/lib/extensions/action_view_rendering.rb +87 -0
- data/vendor/plugins/active_scaffold/lib/extensions/array.rb +7 -0
- data/vendor/plugins/active_scaffold/lib/extensions/component_response_with_namespacing.rb +17 -0
- data/vendor/plugins/active_scaffold/lib/extensions/generic_view_paths.rb +33 -0
- data/vendor/plugins/active_scaffold/lib/extensions/localize.rb +10 -0
- data/vendor/plugins/active_scaffold/lib/extensions/name_option_for_datetime.rb +12 -0
- data/vendor/plugins/active_scaffold/lib/extensions/nil_id_in_url_params.rb +7 -0
- data/vendor/plugins/active_scaffold/lib/extensions/resources.rb +26 -0
- data/vendor/plugins/active_scaffold/lib/extensions/reverse_associations.rb +56 -0
- data/vendor/plugins/active_scaffold/lib/extensions/to_label.rb +8 -0
- data/vendor/plugins/active_scaffold/lib/extensions/unsaved_associated.rb +61 -0
- data/vendor/plugins/active_scaffold/lib/extensions/unsaved_record.rb +20 -0
- data/vendor/plugins/active_scaffold/lib/extensions/usa_state.rb +46 -0
- data/vendor/plugins/active_scaffold/lib/paginator.rb +136 -0
- data/vendor/plugins/active_scaffold/lib/responds_to_parent.rb +68 -0
- data/vendor/plugins/active_scaffold/public/blank.html +33 -0
- data/vendor/plugins/active_scaffold/test/bridges/bridge_test.rb +47 -0
- data/vendor/plugins/active_scaffold/test/config/create_test.rb +55 -0
- data/vendor/plugins/active_scaffold/test/config/list_test.rb +74 -0
- data/vendor/plugins/active_scaffold/test/config/update_test.rb +17 -0
- data/vendor/plugins/active_scaffold/test/const_mocker.rb +36 -0
- data/vendor/plugins/active_scaffold/test/data_structures/action_columns_test.rb +119 -0
- data/vendor/plugins/active_scaffold/test/data_structures/action_link_test.rb +78 -0
- data/vendor/plugins/active_scaffold/test/data_structures/action_links_test.rb +78 -0
- data/vendor/plugins/active_scaffold/test/data_structures/actions_test.rb +25 -0
- data/vendor/plugins/active_scaffold/test/data_structures/association_column_test.rb +41 -0
- data/vendor/plugins/active_scaffold/test/data_structures/column_test.rb +161 -0
- data/vendor/plugins/active_scaffold/test/data_structures/columns_test.rb +69 -0
- data/vendor/plugins/active_scaffold/test/data_structures/error_message_test.rb +28 -0
- data/vendor/plugins/active_scaffold/test/data_structures/set_test.rb +86 -0
- data/vendor/plugins/active_scaffold/test/data_structures/sorting_test.rb +96 -0
- data/vendor/plugins/active_scaffold/test/data_structures/standard_column_test.rb +34 -0
- data/vendor/plugins/active_scaffold/test/data_structures/virtual_column_test.rb +34 -0
- data/vendor/plugins/active_scaffold/test/extensions/active_record_test.rb +45 -0
- data/vendor/plugins/active_scaffold/test/extensions/array.rb +12 -0
- data/vendor/plugins/active_scaffold/test/misc/active_record_permissions.rb +154 -0
- data/vendor/plugins/active_scaffold/test/misc/configurable_test.rb +96 -0
- data/vendor/plugins/active_scaffold/test/misc/constraints_test.rb +175 -0
- data/vendor/plugins/active_scaffold/test/misc/finder_test.rb +70 -0
- data/vendor/plugins/active_scaffold/test/misc/lang_test.rb +12 -0
- data/vendor/plugins/active_scaffold/test/model_stub.rb +39 -0
- data/vendor/plugins/active_scaffold/test/run_all.rb +8 -0
- data/vendor/plugins/active_scaffold/test/test_helper.rb +13 -0
- data/vendor/plugins/active_scaffold/uninstall.rb +12 -0
- data/vendor/plugins/active_scaffold_as_gem/init.rb +21 -0
- data/vendor/plugins/active_scaffold_form_observation/init.rb +4 -0
- data/vendor/plugins/active_scaffold_form_observation/lib/active_scaffold_form_observation.rb +99 -0
- data/vendor/plugins/active_scaffold_full_refresh/init.rb +7 -0
- data/vendor/plugins/active_scaffold_full_refresh/lib/active_scaffold_full_refresh.rb +46 -0
- data/vendor/plugins/active_scaffold_move_column_under/init.rb +17 -0
- data/vendor/plugins/acts_as_money/README +24 -0
- data/vendor/plugins/acts_as_money/Rakefile +22 -0
- data/vendor/plugins/acts_as_money/init.rb +3 -0
- data/vendor/plugins/acts_as_money/install.rb +1 -0
- data/vendor/plugins/acts_as_money/lib/acts_as_money.rb +27 -0
- data/vendor/plugins/acts_as_money/tasks/money_tasks.rake +4 -0
- data/vendor/plugins/acts_as_money/test/money_test.rb +8 -0
- data/vendor/plugins/association_hacks/init.rb +1 -0
- data/vendor/plugins/association_hacks/lib/association_hacks.rb +27 -0
- data/vendor/plugins/railspdf/CHANGELOG +5 -0
- data/vendor/plugins/railspdf/README +88 -0
- data/vendor/plugins/railspdf/Rakefile +22 -0
- data/vendor/plugins/railspdf/TODO +1 -0
- data/vendor/plugins/railspdf/init.rb +3 -0
- data/vendor/plugins/railspdf/lib/railspdf.rb +65 -0
- data/vendor/plugins/railspdf/test/railspdf_test.rb +14 -0
- data/vendor/plugins/railspdf/test/test_helper.rb +9 -0
- data/vendor/plugins/render_component/README +37 -0
- data/vendor/plugins/render_component/Rakefile +22 -0
- data/vendor/plugins/render_component/init.rb +2 -0
- data/vendor/plugins/render_component/lib/components.rb +142 -0
- data/vendor/plugins/render_component/test/abstract_unit.rb +8 -0
- data/vendor/plugins/render_component/test/components_test.rb +140 -0
- metadata +657 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
module ActiveScaffold::DataStructures
|
2
|
+
class ActionLinks
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@set = []
|
7
|
+
end
|
8
|
+
|
9
|
+
# adds an ActionLink, creating one from the arguments if need be
|
10
|
+
def add(action, options = {})
|
11
|
+
link = action.is_a?(ActiveScaffold::DataStructures::ActionLink) ? action : ActiveScaffold::DataStructures::ActionLink.new(action, options)
|
12
|
+
# NOTE: this duplicate check should be done by defining the comparison operator for an Action data structure
|
13
|
+
@set << link unless @set.any? {|a| a.action == link.action and a.controller == link.controller and a.parameters == link.parameters}
|
14
|
+
end
|
15
|
+
alias_method :<<, :add
|
16
|
+
|
17
|
+
# finds an ActionLink by matching the action
|
18
|
+
def [](val)
|
19
|
+
@set.find {|item| item.action == val.to_s}
|
20
|
+
end
|
21
|
+
|
22
|
+
def delete(val)
|
23
|
+
@set.delete_if{|item| item.action == val.to_s}
|
24
|
+
end
|
25
|
+
|
26
|
+
# iterates over the links, possibly by type
|
27
|
+
def each(type = nil)
|
28
|
+
type = type.to_sym if type
|
29
|
+
@set.each {|item|
|
30
|
+
next if type and item.type != type
|
31
|
+
yield item
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def empty?
|
36
|
+
@set.size == 0
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
# called during clone or dup. makes the clone/dup deeper.
|
42
|
+
def initialize_copy(from)
|
43
|
+
@set = []
|
44
|
+
from.instance_variable_get('@set').each { |link| @set << link.clone }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class ActiveScaffold::DataStructures::Actions
|
2
|
+
include Enumerable
|
3
|
+
|
4
|
+
def initialize(*args)
|
5
|
+
@set = []
|
6
|
+
self.add *args
|
7
|
+
end
|
8
|
+
|
9
|
+
def exclude(*args)
|
10
|
+
args.collect! { |a| a.to_sym } # symbolize the args
|
11
|
+
@set.reject! { |m| args.include? m } # reject all actions specified
|
12
|
+
end
|
13
|
+
|
14
|
+
def add(*args)
|
15
|
+
args.each { |arg| @set << arg.to_sym unless @set.include? arg.to_sym }
|
16
|
+
end
|
17
|
+
alias_method :<<, :add
|
18
|
+
|
19
|
+
def each
|
20
|
+
@set.each {|item| yield item}
|
21
|
+
end
|
22
|
+
|
23
|
+
def include?(val)
|
24
|
+
super val.to_sym
|
25
|
+
end
|
26
|
+
|
27
|
+
# swaps one element in the list with the other.
|
28
|
+
# accepts arguments in any order. it just figures out which one is in the list and which one is not.
|
29
|
+
def swap(one, two)
|
30
|
+
if include? one
|
31
|
+
exclude one
|
32
|
+
add two
|
33
|
+
else
|
34
|
+
exclude two
|
35
|
+
add one
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
# called during clone or dup. makes the clone/dup deeper.
|
42
|
+
def initialize_copy(from)
|
43
|
+
@set = from.instance_variable_get('@set').clone
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,297 @@
|
|
1
|
+
module ActiveScaffold::DataStructures
|
2
|
+
class Column
|
3
|
+
include ActiveScaffold::Configurable
|
4
|
+
|
5
|
+
attr_reader :active_record_class
|
6
|
+
|
7
|
+
# this is the name of the getter on the ActiveRecord model. it is the only absolutely required attribute ... all others will be inferred from this name.
|
8
|
+
attr_accessor :name
|
9
|
+
|
10
|
+
# Whether to enable inplace editing for this column. Currently works for text columns, in the List.
|
11
|
+
attr_accessor :inplace_edit
|
12
|
+
|
13
|
+
# Whether this column set is collapsed by default in contexts where collapsing is supported
|
14
|
+
attr_accessor :collapsed
|
15
|
+
|
16
|
+
# Any extra parameters this particular column uses. This is for create/update purposes.
|
17
|
+
def params
|
18
|
+
# lazy initialize
|
19
|
+
@params ||= Set.new
|
20
|
+
end
|
21
|
+
|
22
|
+
# the display-name of the column. this will be used, for instance, as the column title in the table and as the field name in the form.
|
23
|
+
# if left alone it will utilize human_attribute_name which includes localization
|
24
|
+
attr_writer :label
|
25
|
+
def label
|
26
|
+
as_(@label) || active_record_class.human_attribute_name(name.to_s)
|
27
|
+
end
|
28
|
+
|
29
|
+
# a textual description of the column and its contents. this will be displayed with any associated form input widget, so you may want to consider adding a content example.
|
30
|
+
attr_writer :description
|
31
|
+
def description
|
32
|
+
@description.is_a?(Symbol) ? as_(@description, {:scope => [:activerecord, :attributes, active_record_class.to_s.underscore.to_sym]}) : as_(@description) if @description
|
33
|
+
end
|
34
|
+
|
35
|
+
# this will be /joined/ to the :name for the td's class attribute. useful if you want to style columns on different ActiveScaffolds the same way, but the columns have different names.
|
36
|
+
attr_accessor :css_class
|
37
|
+
|
38
|
+
# whether the field is required or not. used on the form for visually indicating the fact to the user.
|
39
|
+
# TODO: move into predicate
|
40
|
+
attr_writer :required
|
41
|
+
def required?
|
42
|
+
@required
|
43
|
+
end
|
44
|
+
|
45
|
+
# sorting on a column can be configured four ways:
|
46
|
+
# sort = true default, uses intelligent sorting sql default
|
47
|
+
# sort = false sometimes sorting doesn't make sense
|
48
|
+
# sort = {:sql => ""} define your own sql for sorting. this should be result in a sortable value in SQL. ActiveScaffold will handle the ascending/descending.
|
49
|
+
# sort = {:method => ""} define ruby-side code for sorting. this is SLOW with large recordsets!
|
50
|
+
def sort=(value)
|
51
|
+
if value.is_a? Hash
|
52
|
+
value.assert_valid_keys(:sql, :method)
|
53
|
+
@sort = value
|
54
|
+
else
|
55
|
+
@sort = value ? true : false # force true or false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def sort
|
60
|
+
self.initialize_sort if @sort === true
|
61
|
+
@sort
|
62
|
+
end
|
63
|
+
|
64
|
+
def sortable?
|
65
|
+
sort != false && !sort.nil?
|
66
|
+
end
|
67
|
+
|
68
|
+
# a configuration helper for the self.sort property. simply provides a method syntax instead of setter syntax.
|
69
|
+
def sort_by(options)
|
70
|
+
self.sort = options
|
71
|
+
end
|
72
|
+
|
73
|
+
# supported options:
|
74
|
+
# * for association columns
|
75
|
+
# * :select - displays a simple <select> or a collection of checkboxes to (dis)associate records
|
76
|
+
attr_writer :form_ui
|
77
|
+
def form_ui
|
78
|
+
@form_ui
|
79
|
+
end
|
80
|
+
|
81
|
+
attr_writer :list_ui
|
82
|
+
def list_ui
|
83
|
+
@list_ui || @form_ui
|
84
|
+
end
|
85
|
+
|
86
|
+
attr_writer :search_ui
|
87
|
+
def search_ui
|
88
|
+
@search_ui || @form_ui
|
89
|
+
end
|
90
|
+
|
91
|
+
# DEPRECATED
|
92
|
+
alias :ui_type :form_ui
|
93
|
+
def ui_type=(val)
|
94
|
+
::ActiveSupport::Deprecation.warn("config.columns[:#{name}].ui_type will disappear in version 2.0. Please use config.columns[:#{name}].form_ui instead.", caller)
|
95
|
+
self.form_ui = val
|
96
|
+
end
|
97
|
+
|
98
|
+
# a place to store dev's column specific options
|
99
|
+
attr_accessor :options
|
100
|
+
def options
|
101
|
+
@options || {}
|
102
|
+
end
|
103
|
+
|
104
|
+
# associate an action_link with this column
|
105
|
+
attr_reader :link
|
106
|
+
|
107
|
+
# this should not only delete any existing link but also prevent column links from being automatically added by later routines
|
108
|
+
def clear_link
|
109
|
+
@link = false
|
110
|
+
end
|
111
|
+
|
112
|
+
def set_link(action, options = {})
|
113
|
+
if action.is_a? ActiveScaffold::DataStructures::ActionLink
|
114
|
+
@link = action
|
115
|
+
else
|
116
|
+
options[:label] ||= self.label
|
117
|
+
options[:position] ||= :after unless options.has_key?(:position)
|
118
|
+
options[:type] ||= :record
|
119
|
+
@link = ActiveScaffold::DataStructures::ActionLink.new(action, options)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# define a calculation for the column. anything that ActiveRecord::Calculations::ClassMethods#calculate accepts will do.
|
124
|
+
attr_accessor :calculate
|
125
|
+
|
126
|
+
# get whether to run a calculation on this column
|
127
|
+
def calculation?
|
128
|
+
!(@calculate == false or @calculate.nil?)
|
129
|
+
end
|
130
|
+
|
131
|
+
# a collection of associations to pre-load when finding the records on a page
|
132
|
+
attr_reader :includes
|
133
|
+
def includes=(value)
|
134
|
+
@includes = value.is_a?(Array) ? value : [value] # automatically convert to an array
|
135
|
+
end
|
136
|
+
|
137
|
+
# describes how to search on a column
|
138
|
+
# search = true default, uses intelligent search sql
|
139
|
+
# search = "CONCAT(a, b)" define your own sql for searching. this should be the "left-side" of a WHERE condition. the operator and value will be supplied by ActiveScaffold.
|
140
|
+
attr_writer :search_sql
|
141
|
+
def search_sql
|
142
|
+
self.initialize_search_sql if @search_sql === true
|
143
|
+
@search_sql
|
144
|
+
end
|
145
|
+
def searchable?
|
146
|
+
search_sql != false && search_sql != nil
|
147
|
+
end
|
148
|
+
|
149
|
+
# to modify the default order of columns
|
150
|
+
attr_accessor :weight
|
151
|
+
|
152
|
+
# to set how many associated records a column with plural association must show in list
|
153
|
+
cattr_accessor :associated_limit
|
154
|
+
@@associated_limit = 3
|
155
|
+
attr_accessor :associated_limit
|
156
|
+
|
157
|
+
# whether the number of associated records must be shown or not
|
158
|
+
cattr_accessor :associated_number
|
159
|
+
@@associated_number = true
|
160
|
+
attr_writer :associated_number
|
161
|
+
def associated_number?
|
162
|
+
@associated_number
|
163
|
+
end
|
164
|
+
|
165
|
+
# whether a blank row must be shown in the subform
|
166
|
+
cattr_accessor :show_blank_record
|
167
|
+
@@show_blank_record = true
|
168
|
+
attr_accessor :show_blank_record
|
169
|
+
|
170
|
+
# methods for automatic links in singular association columns
|
171
|
+
cattr_accessor :actions_for_association_links
|
172
|
+
@@actions_for_association_links = [:new, :edit, :show]
|
173
|
+
attr_accessor :actions_for_association_links
|
174
|
+
|
175
|
+
# ----------------------------------------------------------------- #
|
176
|
+
# the below functionality is intended for internal consumption only #
|
177
|
+
# ----------------------------------------------------------------- #
|
178
|
+
|
179
|
+
# the ConnectionAdapter::*Column object from the ActiveRecord class
|
180
|
+
attr_reader :column
|
181
|
+
|
182
|
+
# the association from the ActiveRecord class
|
183
|
+
attr_reader :association
|
184
|
+
def singular_association?
|
185
|
+
self.association and [:has_one, :belongs_to].include? self.association.macro
|
186
|
+
end
|
187
|
+
def plural_association?
|
188
|
+
self.association and [:has_many, :has_and_belongs_to_many].include? self.association.macro
|
189
|
+
end
|
190
|
+
def through_association?
|
191
|
+
self.association and self.association.options[:through]
|
192
|
+
end
|
193
|
+
def polymorphic_association?
|
194
|
+
self.association and self.association.options.has_key? :polymorphic and self.association.options[:polymorphic]
|
195
|
+
end
|
196
|
+
|
197
|
+
# an interpreted property. the column is virtual if it isn't from the active record model or any associated models
|
198
|
+
def virtual?
|
199
|
+
column.nil? && association.nil?
|
200
|
+
end
|
201
|
+
|
202
|
+
# this is so that array.delete and array.include?, etc., will work by column name
|
203
|
+
def ==(other) #:nodoc:
|
204
|
+
# another column
|
205
|
+
if other.respond_to? :name and other.class == self.class
|
206
|
+
self.name == other.name.to_sym
|
207
|
+
# a string or symbol
|
208
|
+
elsif other.respond_to? :to_sym
|
209
|
+
self.name == other.to_sym rescue false # catch "interning empty string"
|
210
|
+
# unknown
|
211
|
+
else
|
212
|
+
self.eql? other
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
# instantiation is handled internally through the DataStructures::Columns object
|
217
|
+
def initialize(name, active_record_class) #:nodoc:
|
218
|
+
self.name = name.to_sym
|
219
|
+
@column = active_record_class.columns_hash[self.name.to_s]
|
220
|
+
@association = active_record_class.reflect_on_association(self.name)
|
221
|
+
@active_record_class = active_record_class
|
222
|
+
@table = active_record_class.table_name
|
223
|
+
@weight = 0
|
224
|
+
@associated_limit = self.class.associated_limit
|
225
|
+
@associated_number = self.class.associated_number
|
226
|
+
@show_blank_record = self.class.show_blank_record
|
227
|
+
@actions_for_association_links = self.class.actions_for_association_links if @association
|
228
|
+
|
229
|
+
# default all the configurable variables
|
230
|
+
self.css_class = ''
|
231
|
+
if active_record_class.respond_to? :reflect_on_validations_for
|
232
|
+
column_names = [name]
|
233
|
+
column_names << @association.primary_key_name if @association
|
234
|
+
self.required = column_names.any? do |column_name|
|
235
|
+
active_record_class.reflect_on_validations_for(column_name.to_sym).any? do |val|
|
236
|
+
val.macro == :validates_presence_of or (val.macro == :validates_inclusion_of and not val.options[:allow_nil] and not val.options[:allow_blank])
|
237
|
+
end
|
238
|
+
end
|
239
|
+
else
|
240
|
+
self.required = false
|
241
|
+
end
|
242
|
+
self.sort = true
|
243
|
+
self.search_sql = true
|
244
|
+
|
245
|
+
self.includes = (association and not polymorphic_association?) ? [association.name] : []
|
246
|
+
end
|
247
|
+
|
248
|
+
# just the field (not table.field)
|
249
|
+
def field_name
|
250
|
+
return nil if virtual?
|
251
|
+
column ? @active_record_class.connection.quote_column_name(column.name) : association.primary_key_name
|
252
|
+
end
|
253
|
+
|
254
|
+
def <=>(other_column)
|
255
|
+
order_weight = self.weight <=> other_column.weight
|
256
|
+
order_weight != 0 ? order_weight : self.name.to_s <=> other_column.name.to_s
|
257
|
+
end
|
258
|
+
|
259
|
+
protected
|
260
|
+
|
261
|
+
def initialize_sort
|
262
|
+
if self.virtual?
|
263
|
+
# we don't automatically enable method sorting for virtual columns because it's slow, and we expect fewer complaints this way.
|
264
|
+
self.sort = false
|
265
|
+
else
|
266
|
+
if self.singular_association?
|
267
|
+
self.sort = {:method => "#{self.name}.to_s"}
|
268
|
+
elsif self.plural_association?
|
269
|
+
self.sort = {:method => "#{self.name}.join(',')"}
|
270
|
+
else
|
271
|
+
self.sort = {:sql => self.field}
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
def initialize_search_sql
|
277
|
+
if self.virtual?
|
278
|
+
self.search_sql = nil
|
279
|
+
else
|
280
|
+
if association.nil?
|
281
|
+
self.search_sql = self.field.to_s
|
282
|
+
else
|
283
|
+
# with associations we really don't know what to sort by without developer intervention. we could sort on the primary key ('id'), but that's hardly useful. previously ActiveScaffold would try and search using the same sql as from :sort, but we decided to just punt.
|
284
|
+
self.search_sql = nil
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
# the table name from the ActiveRecord class
|
290
|
+
attr_reader :table
|
291
|
+
|
292
|
+
# the table.field name for this column, if applicable
|
293
|
+
def field
|
294
|
+
@field ||= [@table, field_name].join('.')
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module ActiveScaffold::DataStructures
|
2
|
+
class Columns
|
3
|
+
include Enumerable
|
4
|
+
include ActiveScaffold::Configurable
|
5
|
+
|
6
|
+
# The motivation for this collection is that this Columns data structure fills two roles: it provides
|
7
|
+
# the master list of all known columns, and it provides an inheritable list for all other actions (e.g.
|
8
|
+
# Create and Update and List). Well we actually want to *know* about as many columns as possible, so
|
9
|
+
# we don't want people actually removing columns from @set. But at the same time, we want to be able to
|
10
|
+
# manage which columns get inherited. Tada!
|
11
|
+
#
|
12
|
+
# This collection is referenced by other parts of ActiveScaffold and by methods within this DataStructure.
|
13
|
+
# IT IS NOT MEANT FOR PUBLIC USE (but if you know what you're doing, go ahead)
|
14
|
+
def _inheritable=(value)
|
15
|
+
@sorted = true
|
16
|
+
@_inheritable = value
|
17
|
+
end
|
18
|
+
|
19
|
+
# This accessor is used by ActionColumns to create new Column objects without adding them to this set
|
20
|
+
attr_reader :active_record_class
|
21
|
+
|
22
|
+
def initialize(active_record_class, *args)
|
23
|
+
@active_record_class = active_record_class
|
24
|
+
@_inheritable = []
|
25
|
+
@set = []
|
26
|
+
|
27
|
+
self.add *args
|
28
|
+
end
|
29
|
+
|
30
|
+
# the way to add columns to the set. this is primarily useful for virtual columns.
|
31
|
+
# note that this also makes columns inheritable
|
32
|
+
def add(*args)
|
33
|
+
args.flatten! # allow [] as a param
|
34
|
+
args = args.collect{ |a| a.to_sym }
|
35
|
+
|
36
|
+
# make the columns inheritable
|
37
|
+
@_inheritable.concat(args)
|
38
|
+
# then add columns to @set (unless they already exist)
|
39
|
+
args.each { |a| @set << ActiveScaffold::DataStructures::Column.new(a.to_sym, @active_record_class) unless find_by_name(a) }
|
40
|
+
end
|
41
|
+
alias_method :<<, :add
|
42
|
+
|
43
|
+
def exclude(*args)
|
44
|
+
# only remove columns from _inheritable. we never want to completely forget about a column.
|
45
|
+
args.each { |a| @_inheritable.delete a }
|
46
|
+
end
|
47
|
+
|
48
|
+
# returns an array of columns with the provided names
|
49
|
+
def find_by_names(*names)
|
50
|
+
@set.find_all { |column| names.include? column.name }
|
51
|
+
end
|
52
|
+
|
53
|
+
# returns the column of the given name.
|
54
|
+
def find_by_name(name)
|
55
|
+
# this works because of `def column.=='
|
56
|
+
column = @set.find { |c| c == name }
|
57
|
+
column
|
58
|
+
end
|
59
|
+
alias_method :[], :find_by_name
|
60
|
+
|
61
|
+
def each
|
62
|
+
@set.each {|i| yield i }
|
63
|
+
end
|
64
|
+
|
65
|
+
def _inheritable
|
66
|
+
if @sorted
|
67
|
+
@_inheritable
|
68
|
+
else
|
69
|
+
@_inheritable.sort do |a, b|
|
70
|
+
self[a] <=> self[b]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|