brisk-bills 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,24 @@
|
|
|
1
|
+
module ActiveScaffold::DataStructures
|
|
2
|
+
# Wrapper for error strings so that they may be exported using to_xxx
|
|
3
|
+
class ErrorMessage
|
|
4
|
+
def initialize(error)
|
|
5
|
+
@error = error
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def public_attributes
|
|
9
|
+
{ :error => @error }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def to_xml
|
|
13
|
+
public_attributes.to_xml(:root => "errors")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def to_yaml
|
|
17
|
+
public_attributes.to_yaml
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_s
|
|
21
|
+
@error
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
module ActiveScaffold::DataStructures
|
|
2
|
+
class Set
|
|
3
|
+
include Enumerable
|
|
4
|
+
include ActiveScaffold::Configurable
|
|
5
|
+
|
|
6
|
+
attr_writer :label
|
|
7
|
+
def label
|
|
8
|
+
as_(@label)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def initialize(*args)
|
|
12
|
+
@set = []
|
|
13
|
+
self.add *args
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# the way to add items to the set.
|
|
17
|
+
def add(*args)
|
|
18
|
+
args.flatten! # allow [] as a param
|
|
19
|
+
args.each { |arg|
|
|
20
|
+
arg = arg.to_sym if arg.is_a? String
|
|
21
|
+
@set << arg unless @set.include? arg # avoid duplicates
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
alias_method :<<, :add
|
|
25
|
+
|
|
26
|
+
# the way to remove items from the set.
|
|
27
|
+
def exclude(*args)
|
|
28
|
+
args.flatten! # allow [] as a param
|
|
29
|
+
args.collect! { |a| a.to_sym } # symbolize the args
|
|
30
|
+
# check respond_to? :to_sym, ActionColumns doesn't respond to to_sym
|
|
31
|
+
@set.reject! { |c| c.respond_to? :to_sym and args.include? c.to_sym } # reject all items specified
|
|
32
|
+
end
|
|
33
|
+
alias_method :remove, :exclude
|
|
34
|
+
|
|
35
|
+
# returns an array of items with the provided names
|
|
36
|
+
def find_by_names(*names)
|
|
37
|
+
@set.find_all { |item| names.include? item }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# returns the item of the given name.
|
|
41
|
+
def find_by_name(name)
|
|
42
|
+
# this works because of `def item.=='
|
|
43
|
+
item = @set.find { |c| c == name }
|
|
44
|
+
item
|
|
45
|
+
end
|
|
46
|
+
alias_method :[], :find_by_name
|
|
47
|
+
|
|
48
|
+
def each
|
|
49
|
+
@set.each {|i| yield i }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# returns the number of items in the set
|
|
53
|
+
def length
|
|
54
|
+
@set.length
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def empty?
|
|
58
|
+
@set.empty?
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
module ActiveScaffold::DataStructures
|
|
2
|
+
# encapsulates the column sorting configuration for the List view
|
|
3
|
+
class Sorting
|
|
4
|
+
include Enumerable
|
|
5
|
+
|
|
6
|
+
def initialize(columns)
|
|
7
|
+
@columns = columns
|
|
8
|
+
@clauses = []
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# add a clause to the sorting, assuming the column is sortable
|
|
12
|
+
def add(column_name, direction = nil)
|
|
13
|
+
direction ||= 'ASC'
|
|
14
|
+
direction = direction.to_s.upcase
|
|
15
|
+
column = get_column(column_name)
|
|
16
|
+
raise ArgumentError, "Could not find column #{column_name}" if column.nil?
|
|
17
|
+
raise ArgumentError, "Sorting direction unknown" unless [:ASC, :DESC].include? direction.to_sym
|
|
18
|
+
@clauses << [column, direction] if column.sortable?
|
|
19
|
+
raise ArgumentError, "Can't mix :method- and :sql-based sorting" if mixed_sorting?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# an alias for +add+. must accept its arguments in a slightly different form, though.
|
|
23
|
+
def <<(arg)
|
|
24
|
+
add(*arg)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# clears the sorting before setting to the given column/direction
|
|
28
|
+
def set(*args)
|
|
29
|
+
clear
|
|
30
|
+
add(*args)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# clears the sorting
|
|
34
|
+
def clear
|
|
35
|
+
@clauses = []
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# checks whether the given column (a Column object or a column name) is in the sorting
|
|
39
|
+
def sorts_on?(column)
|
|
40
|
+
!get_clause(column).nil?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def direction_of(column)
|
|
44
|
+
clause = get_clause(column)
|
|
45
|
+
return if clause.nil?
|
|
46
|
+
clause[1]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# checks whether any column is configured to sort by method (using a proc)
|
|
50
|
+
def sorts_by_method?
|
|
51
|
+
@clauses.any? { |sorting| sorting[0].sort.is_a? Hash and sorting[0].sort.has_key? :method }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def sorts_by_sql?
|
|
55
|
+
@clauses.any? { |sorting| sorting[0].sort.is_a? Hash and sorting[0].sort.has_key? :sql }
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# iterate over the clauses
|
|
59
|
+
def each
|
|
60
|
+
@clauses.each { |clause| yield clause }
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# provides quick access to the first (and sometimes only) clause
|
|
64
|
+
def first
|
|
65
|
+
@clauses.first
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
protected
|
|
69
|
+
|
|
70
|
+
# retrieves the sorting clause for the given column
|
|
71
|
+
def get_clause(column)
|
|
72
|
+
column = get_column(column)
|
|
73
|
+
@clauses.find{ |clause| clause[0] == column}
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# possibly converts the given argument into a column object from @columns (if it's not already)
|
|
77
|
+
def get_column(name_or_column)
|
|
78
|
+
# it's a column
|
|
79
|
+
return name_or_column if name_or_column.is_a? ActiveScaffold::DataStructures::Column
|
|
80
|
+
# it's a name
|
|
81
|
+
name_or_column = name_or_column.to_s.split('.').last if name_or_column.to_s.include? '.'
|
|
82
|
+
return @columns[name_or_column]
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def mixed_sorting?
|
|
86
|
+
sorts_by_method? and sorts_by_sql?
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
module ActiveScaffold
|
|
2
|
+
module Finder
|
|
3
|
+
module ClassMethods
|
|
4
|
+
# Takes a collection of search terms (the tokens) and creates SQL that
|
|
5
|
+
# searches all specified ActiveScaffold columns. A row will match if each
|
|
6
|
+
# token is found in at least one of the columns.
|
|
7
|
+
def create_conditions_for_columns(tokens, columns, like_pattern = '%?%')
|
|
8
|
+
# if there aren't any columns, then just return a nil condition
|
|
9
|
+
return unless columns.length > 0
|
|
10
|
+
|
|
11
|
+
tokens = [tokens] if tokens.is_a? String
|
|
12
|
+
|
|
13
|
+
where_clauses = []
|
|
14
|
+
columns.each do |column|
|
|
15
|
+
where_clauses << ((column.column.nil? || column.column.text?) ? "LOWER(#{column.search_sql}) LIKE ?" : "#{column.search_sql} = ?")
|
|
16
|
+
end
|
|
17
|
+
phrase = "(#{where_clauses.join(' OR ')})"
|
|
18
|
+
|
|
19
|
+
sql = ([phrase] * tokens.length).join(' AND ')
|
|
20
|
+
tokens = tokens.collect do |value|
|
|
21
|
+
columns.collect {|column| (column.column.nil? || column.column.text?) ? like_pattern.sub('?', value.downcase) : column.column.type_cast(value)}
|
|
22
|
+
end.flatten
|
|
23
|
+
|
|
24
|
+
[sql, *tokens]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Generates an SQL condition for the given ActiveScaffold column based on
|
|
28
|
+
# that column's database type (or form_ui ... for virtual columns?).
|
|
29
|
+
# TODO: this should reside on the column, not the controller
|
|
30
|
+
def condition_for_column(column, value, like_pattern = '%?%')
|
|
31
|
+
# we must check false or not blank because we want to search for false but false is blank
|
|
32
|
+
return unless column and column.search_sql and not value.blank?
|
|
33
|
+
search_ui = column.search_ui || column.column.type
|
|
34
|
+
if self.respond_to?("condition_for_#{column.name}_column")
|
|
35
|
+
self.send("condition_for_#{column.name}_column", column, value, like_pattern)
|
|
36
|
+
elsif self.respond_to?("condition_for_#{search_ui}_type")
|
|
37
|
+
self.send("condition_for_#{search_ui}_type", column, value, like_pattern)
|
|
38
|
+
else
|
|
39
|
+
case search_ui
|
|
40
|
+
when :boolean, :checkbox
|
|
41
|
+
["#{column.search_sql} = ?", column.column.type_cast(value)]
|
|
42
|
+
when :select
|
|
43
|
+
["#{column.search_sql} = ?", value[:id]] unless value[:id].blank?
|
|
44
|
+
when :multi_select
|
|
45
|
+
["#{column.search_sql} in (?)", value.values.collect{|hash| hash[:id]}]
|
|
46
|
+
else
|
|
47
|
+
if column.column.nil? || column.column.text?
|
|
48
|
+
["LOWER(#{column.search_sql}) LIKE ?", like_pattern.sub('?', value.downcase)]
|
|
49
|
+
else
|
|
50
|
+
["#{column.search_sql} = ?", column.column.type_cast(value)]
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def condition_for_integer_type(column, value, like_pattern)
|
|
57
|
+
if value['from'].blank? or not ActiveScaffold::Finder::NumericComparators.include?(value['opt'])
|
|
58
|
+
nil
|
|
59
|
+
elsif value['opt'] == 'BETWEEN'
|
|
60
|
+
["#{column.search_sql} BETWEEN ? AND ?", value['from'].to_f, value['to'].to_f]
|
|
61
|
+
else
|
|
62
|
+
["#{column.search_sql} #{value['opt']} ?", value['from'].to_f]
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
alias_method :condition_for_decimal_type, :condition_for_integer_type
|
|
66
|
+
alias_method :condition_for_float_type, :condition_for_integer_type
|
|
67
|
+
|
|
68
|
+
def condition_for_datetime_type(column, value, like_pattern)
|
|
69
|
+
conversion = value['from']['hour'].blank? && value['to']['hour'].blank? ? 'to_date' : 'to_time'
|
|
70
|
+
from_value, to_value = ['from', 'to'].collect do |field|
|
|
71
|
+
Time.zone.local(*['year', 'month', 'day', 'hour', 'minutes', 'seconds'].collect {|part| value[field][part].to_i}) rescue nil
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
if from_value.nil? and to_value.nil?
|
|
75
|
+
nil
|
|
76
|
+
elsif !from_value
|
|
77
|
+
["#{column.search_sql} <= ?", to_value.send(conversion).to_s(:db)]
|
|
78
|
+
elsif !to_value
|
|
79
|
+
["#{column.search_sql} >= ?", from_value.send(conversion).to_s(:db)]
|
|
80
|
+
else
|
|
81
|
+
["#{column.search_sql} BETWEEN ? AND ?", from_value.send(conversion).to_s(:db), to_value.send(conversion).to_s(:db)]
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
alias_method :condition_for_date_type, :condition_for_datetime_type
|
|
85
|
+
alias_method :condition_for_time_type, :condition_for_datetime_type
|
|
86
|
+
alias_method :condition_for_timestamp_type, :condition_for_datetime_type
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
NumericComparators = [
|
|
90
|
+
'=',
|
|
91
|
+
'>=',
|
|
92
|
+
'<=',
|
|
93
|
+
'>',
|
|
94
|
+
'<',
|
|
95
|
+
'!=',
|
|
96
|
+
'BETWEEN'
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
def self.included(klass)
|
|
100
|
+
klass.extend ClassMethods
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
protected
|
|
104
|
+
|
|
105
|
+
attr_writer :active_scaffold_conditions
|
|
106
|
+
def active_scaffold_conditions
|
|
107
|
+
@active_scaffold_conditions ||= []
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
attr_writer :active_scaffold_joins
|
|
111
|
+
def active_scaffold_joins
|
|
112
|
+
@active_scaffold_joins ||= []
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
attr_writer :active_scaffold_habtm_joins
|
|
116
|
+
def active_scaffold_habtm_joins
|
|
117
|
+
@active_scaffold_habtm_joins ||= []
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def all_conditions
|
|
121
|
+
merge_conditions(
|
|
122
|
+
active_scaffold_conditions, # from the search modules
|
|
123
|
+
conditions_for_collection, # from the dev
|
|
124
|
+
conditions_from_params, # from the parameters (e.g. /users/list?first_name=Fred)
|
|
125
|
+
conditions_from_constraints, # from any constraints (embedded scaffolds)
|
|
126
|
+
active_scaffold_session_storage[:conditions] # embedding conditions (weaker constraints)
|
|
127
|
+
)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# returns a single record (the given id) but only if it's allowed for the specified action.
|
|
131
|
+
# accomplishes this by checking model.#{action}_authorized?
|
|
132
|
+
# TODO: this should reside on the model, not the controller
|
|
133
|
+
def find_if_allowed(id, action, klass = nil)
|
|
134
|
+
klass ||= active_scaffold_config.model
|
|
135
|
+
record = klass.find(id)
|
|
136
|
+
raise ActiveScaffold::RecordNotAllowed unless record.authorized_for?(:action => action.to_sym)
|
|
137
|
+
return record
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# returns a Paginator::Page (not from ActiveRecord::Paginator) for the given parameters
|
|
141
|
+
# options may include:
|
|
142
|
+
# * :sorting - a Sorting DataStructure (basically an array of hashes of field => direction, e.g. [{:field1 => 'asc'}, {:field2 => 'desc'}]). please note that multi-column sorting has some limitations: if any column in a multi-field sort uses method-based sorting, it will be ignored. method sorting only works for single-column sorting.
|
|
143
|
+
# * :per_page
|
|
144
|
+
# * :page
|
|
145
|
+
# TODO: this should reside on the model, not the controller
|
|
146
|
+
def find_page(options = {})
|
|
147
|
+
options.assert_valid_keys :sorting, :per_page, :page, :count_includes
|
|
148
|
+
|
|
149
|
+
full_includes = (active_scaffold_joins.empty? ? nil : active_scaffold_joins)
|
|
150
|
+
options[:per_page] ||= 999999999
|
|
151
|
+
options[:page] ||= 1
|
|
152
|
+
options[:count_includes] ||= full_includes
|
|
153
|
+
|
|
154
|
+
klass = active_scaffold_config.model
|
|
155
|
+
|
|
156
|
+
# create a general-use options array that's compatible with Rails finders
|
|
157
|
+
finder_options = { :order => build_order_clause(options[:sorting]),
|
|
158
|
+
:conditions => all_conditions,
|
|
159
|
+
:joins => joins_for_finder,
|
|
160
|
+
:include => options[:count_includes]}
|
|
161
|
+
|
|
162
|
+
finder_options.merge! custom_finder_options
|
|
163
|
+
|
|
164
|
+
# NOTE: we must use :include in the count query, because some conditions may reference other tables
|
|
165
|
+
count = klass.count(finder_options.reject{|k,v| [:order].include? k})
|
|
166
|
+
|
|
167
|
+
finder_options.merge! :include => full_includes
|
|
168
|
+
|
|
169
|
+
# we build the paginator differently for method- and sql-based sorting
|
|
170
|
+
if options[:sorting] and options[:sorting].sorts_by_method?
|
|
171
|
+
pager = ::Paginator.new(count, options[:per_page]) do |offset, per_page|
|
|
172
|
+
sorted_collection = sort_collection_by_column(klass.find(:all, finder_options), *options[:sorting].first)
|
|
173
|
+
sorted_collection.slice(offset, per_page)
|
|
174
|
+
end
|
|
175
|
+
else
|
|
176
|
+
pager = ::Paginator.new(count, options[:per_page]) do |offset, per_page|
|
|
177
|
+
klass.find(:all, finder_options.merge(:offset => offset, :limit => per_page))
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
pager.page(options[:page])
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def joins_for_finder
|
|
185
|
+
case joins_for_collection
|
|
186
|
+
when String
|
|
187
|
+
[ joins_for_collection ]
|
|
188
|
+
when Array
|
|
189
|
+
joins_for_collection
|
|
190
|
+
else
|
|
191
|
+
[]
|
|
192
|
+
end + active_scaffold_habtm_joins
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# TODO: this should reside on the model, not the controller
|
|
196
|
+
def merge_conditions(*conditions)
|
|
197
|
+
c = conditions.find_all {|c| not c.nil? and not c.empty? }
|
|
198
|
+
c.empty? ? nil : c.collect{|c| active_scaffold_config.model.send(:sanitize_sql, c)}.join(' AND ')
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# accepts a DataStructure::Sorting object and builds an order-by clause
|
|
202
|
+
# TODO: this should reside on the model, not the controller
|
|
203
|
+
def build_order_clause(sorting)
|
|
204
|
+
return nil if sorting.nil? or sorting.sorts_by_method?
|
|
205
|
+
|
|
206
|
+
# unless the sorting is by method, create the sql string
|
|
207
|
+
order = []
|
|
208
|
+
sorting.each do |clause|
|
|
209
|
+
sort_column, sort_direction = clause
|
|
210
|
+
sql = sort_column.sort[:sql]
|
|
211
|
+
next if sql.nil? or sql.empty?
|
|
212
|
+
|
|
213
|
+
order << "#{sql} #{sort_direction}"
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
order = order.join(', ')
|
|
217
|
+
order = nil if order.empty?
|
|
218
|
+
|
|
219
|
+
order
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# TODO: this should reside on the column, not the controller
|
|
223
|
+
def sort_collection_by_column(collection, column, order)
|
|
224
|
+
sorter = column.sort[:method]
|
|
225
|
+
collection = collection.sort_by { |record|
|
|
226
|
+
value = (sorter.is_a? Proc) ? record.instance_eval(&sorter) : record.instance_eval(sorter)
|
|
227
|
+
value = '' if value.nil?
|
|
228
|
+
value
|
|
229
|
+
}
|
|
230
|
+
collection.reverse! if order.downcase == 'desc'
|
|
231
|
+
collection
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module ActiveScaffold
|
|
2
|
+
module Helpers
|
|
3
|
+
module AssociationHelpers
|
|
4
|
+
# Provides a way to honor the :conditions on an association while searching the association's klass
|
|
5
|
+
def association_options_find(association, conditions = nil)
|
|
6
|
+
association.klass.find(:all, :conditions => controller.send(:merge_conditions, conditions, association.options[:conditions]))
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def association_options_count(association, conditions = nil)
|
|
10
|
+
association.klass.count(:all, :conditions => controller.send(:merge_conditions, conditions, association.options[:conditions]))
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# returns options for the given association as a collection of [id, label] pairs intended for the +options_for_select+ helper.
|
|
14
|
+
def options_for_association(association, include_all = false)
|
|
15
|
+
available_records = association_options_find(association, include_all ? nil : options_for_association_conditions(association))
|
|
16
|
+
available_records ||= []
|
|
17
|
+
available_records.sort{|a,b| a.to_label <=> b.to_label}.collect { |model| [ model.to_label, model.id ] }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def options_for_association_count(association)
|
|
21
|
+
association_options_count(association, options_for_association_conditions(association))
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# A useful override for customizing the records present in an association dropdown.
|
|
25
|
+
# Should work in both the subform and form_ui=>:select modes.
|
|
26
|
+
# Check association.name to specialize the conditions per-column.
|
|
27
|
+
def options_for_association_conditions(association)
|
|
28
|
+
return nil if association.options[:through]
|
|
29
|
+
case association.macro
|
|
30
|
+
when :has_one, :has_many
|
|
31
|
+
# Find only orphaned objects
|
|
32
|
+
"#{association.primary_key_name} IS NULL"
|
|
33
|
+
when :belongs_to, :has_and_belongs_to_many
|
|
34
|
+
# Find all
|
|
35
|
+
nil
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|