infold 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +33 -0
- data/Rakefile +8 -0
- data/app/assets/builds/infold.css +17147 -0
- data/app/assets/builds/infold.css.map +7 -0
- data/app/assets/builds/infold.js +17202 -0
- data/app/assets/builds/infold.js.map +7 -0
- data/app/assets/config/infold_manifest.js +0 -0
- data/app/assets/stylesheets/infold.custom.css +76 -0
- data/app/assets/stylesheets/infold.custom.css.map +1 -0
- data/app/components/infold/input_fieldset_component.html.haml +14 -0
- data/app/components/infold/input_fieldset_component.rb +22 -0
- data/app/components/infold/radio_fieldset_component.html.haml +11 -0
- data/app/components/infold/radio_fieldset_component.rb +14 -0
- data/app/components/infold/select_fieldset_component.html.haml +7 -0
- data/app/components/infold/select_fieldset_component.rb +15 -0
- data/app/controllers/infold/app_view_forms_controller.rb +64 -0
- data/app/controllers/infold/app_view_shows_controller.rb +60 -0
- data/app/controllers/infold/application_controller.rb +17 -0
- data/app/controllers/infold/apps_controller.rb +68 -0
- data/app/controllers/infold/attachment_fields_controller.rb +59 -0
- data/app/controllers/infold/builds_controller.rb +21 -0
- data/app/controllers/infold/columns_controller.rb +89 -0
- data/app/controllers/infold/csv_columns_controller.rb +43 -0
- data/app/controllers/infold/form_associations_controller.rb +57 -0
- data/app/controllers/infold/menu_directories_controller.rb +19 -0
- data/app/controllers/infold/menus_controller.rb +35 -0
- data/app/controllers/infold/models_controller.rb +28 -0
- data/app/controllers/infold/pages_controller.rb +8 -0
- data/app/controllers/infold/search_conditions_controller.rb +63 -0
- data/app/controllers/infold/search_result_fields_controller.rb +62 -0
- data/app/controllers/infold/show_associations_controller.rb +54 -0
- data/app/controllers/infold/sync_dbs_controller.rb +13 -0
- data/app/decorators/infold/app_view_form_decorator.rb +56 -0
- data/app/decorators/infold/app_view_index_decorator.rb +53 -0
- data/app/decorators/infold/app_view_modal_decorator.rb +13 -0
- data/app/decorators/infold/app_view_show_decorator.rb +26 -0
- data/app/decorators/infold/attachment_field_decorator.rb +40 -0
- data/app/decorators/infold/build_decorator.rb +15 -0
- data/app/decorators/infold/column_display_decorator.rb +59 -0
- data/app/decorators/infold/csv_column_decorator.rb +5 -0
- data/app/decorators/infold/form_association_column_decorator.rb +5 -0
- data/app/decorators/infold/form_column_decorator.rb +57 -0
- data/app/decorators/infold/model_association_decorator.rb +39 -0
- data/app/decorators/infold/model_column_decorator.rb +201 -0
- data/app/decorators/infold/model_decorator.rb +27 -0
- data/app/decorators/infold/search_condition_decorator.rb +101 -0
- data/app/decorators/infold/search_result_column_decorator.rb +5 -0
- data/app/decorators/infold/show_association_column_decorator.rb +5 -0
- data/app/decorators/infold/show_association_decorator.rb +13 -0
- data/app/decorators/infold/show_field_decorator.rb +5 -0
- data/app/helpers/infold/application_helper.rb +29 -0
- data/app/javascript/admin.scss +5 -0
- data/app/javascript/controllers/application.js +9 -0
- data/app/javascript/controllers/attachment_field_controller.js +19 -0
- data/app/javascript/controllers/column_controller.js +20 -0
- data/app/javascript/controllers/flash_controller.js +10 -0
- data/app/javascript/controllers/index.js +32 -0
- data/app/javascript/controllers/menu_controller.js +26 -0
- data/app/javascript/controllers/menu_directory_controller.js +16 -0
- data/app/javascript/controllers/modal_controller.js +15 -0
- data/app/javascript/controllers/nested_form_controller.js +32 -0
- data/app/javascript/controllers/search_condition_controller.js +41 -0
- data/app/javascript/controllers/sortable_controller.js +19 -0
- data/app/javascript/infold.js +22 -0
- data/app/javascript/infold.scss +68 -0
- data/app/javascript/stylesheets/admin/common.scss +112 -0
- data/app/javascript/stylesheets/admin/form.scss +52 -0
- data/app/javascript/stylesheets/admin/index.scss +93 -0
- data/app/javascript/stylesheets/admin/modal.scss +37 -0
- data/app/javascript/stylesheets/admin/show.scss +16 -0
- data/app/jobs/infold/application_job.rb +4 -0
- data/app/mailers/infold/application_mailer.rb +6 -0
- data/app/models/concerns/infold/app_view_search_concern.rb +72 -0
- data/app/models/concerns/infold/form_column_concern.rb +63 -0
- data/app/models/infold/app.rb +41 -0
- data/app/models/infold/app_view.rb +27 -0
- data/app/models/infold/app_view_form.rb +43 -0
- data/app/models/infold/app_view_index.rb +36 -0
- data/app/models/infold/app_view_modal.rb +21 -0
- data/app/models/infold/app_view_show.rb +47 -0
- data/app/models/infold/application_record.rb +7 -0
- data/app/models/infold/attachment_field.rb +35 -0
- data/app/models/infold/build.rb +35 -0
- data/app/models/infold/csv_column.rb +9 -0
- data/app/models/infold/enum.rb +12 -0
- data/app/models/infold/form_association.rb +41 -0
- data/app/models/infold/form_association_attachment_field.rb +5 -0
- data/app/models/infold/form_association_column.rb +5 -0
- data/app/models/infold/form_association_field.rb +7 -0
- data/app/models/infold/form_attachment_field.rb +5 -0
- data/app/models/infold/form_column.rb +5 -0
- data/app/models/infold/form_field.rb +7 -0
- data/app/models/infold/menu_item.rb +45 -0
- data/app/models/infold/model.rb +40 -0
- data/app/models/infold/model_association.rb +51 -0
- data/app/models/infold/model_column.rb +127 -0
- data/app/models/infold/project.rb +29 -0
- data/app/models/infold/schema_rb.rb +177 -0
- data/app/models/infold/search_condition.rb +62 -0
- data/app/models/infold/search_result_attachment_field.rb +5 -0
- data/app/models/infold/search_result_column.rb +6 -0
- data/app/models/infold/search_result_field.rb +12 -0
- data/app/models/infold/show_association.rb +42 -0
- data/app/models/infold/show_association_attachment_field.rb +5 -0
- data/app/models/infold/show_association_column.rb +5 -0
- data/app/models/infold/show_association_field.rb +8 -0
- data/app/models/infold/show_attachment_field.rb +7 -0
- data/app/models/infold/show_column.rb +7 -0
- data/app/models/infold/show_field.rb +11 -0
- data/app/validators/infold/ruby_code_validator.rb +9 -0
- data/app/views/infold/app_view_forms/_bulk_form.html.haml +16 -0
- data/app/views/infold/app_view_forms/_tab.html.haml +12 -0
- data/app/views/infold/app_view_forms/show.html.haml +7 -0
- data/app/views/infold/app_view_shows/_bulk_form.html.haml +15 -0
- data/app/views/infold/app_view_shows/_tab.html.haml +12 -0
- data/app/views/infold/app_view_shows/show.html.haml +7 -0
- data/app/views/infold/app_view_shows/update.turbo_stream.haml +1 -0
- data/app/views/infold/application/_flash.html.haml +6 -0
- data/app/views/infold/apps/_form.html.haml +30 -0
- data/app/views/infold/apps/_page_header.html.haml +5 -0
- data/app/views/infold/apps/_tab.html.haml +13 -0
- data/app/views/infold/apps/create.turbo_stream.haml +3 -0
- data/app/views/infold/apps/edit.html.haml +6 -0
- data/app/views/infold/apps/new.html.haml +8 -0
- data/app/views/infold/apps/update.turbo_stream.haml +3 -0
- data/app/views/infold/associations/_form.html.haml +18 -0
- data/app/views/infold/associations/edit.html.haml +5 -0
- data/app/views/infold/attachment_fields/_form.html.haml +51 -0
- data/app/views/infold/attachment_fields/edit.html.haml +7 -0
- data/app/views/infold/attachment_fields/form.turbo_stream.haml +4 -0
- data/app/views/infold/attachment_fields/index.html.haml +28 -0
- data/app/views/infold/attachment_fields/new.html.haml +7 -0
- data/app/views/infold/builds/create.turbo_stream.haml +8 -0
- data/app/views/infold/builds/new.html.haml +23 -0
- data/app/views/infold/columns/_bulk_form.html.haml +18 -0
- data/app/views/infold/columns/_row.html.haml +26 -0
- data/app/views/infold/columns/_setting.html.haml +42 -0
- data/app/views/infold/columns/bulk.turbo_stream.haml +3 -0
- data/app/views/infold/columns/edit.html.haml +5 -0
- data/app/views/infold/columns/index.html.haml +9 -0
- data/app/views/infold/columns/update.turbo_stream.haml +8 -0
- data/app/views/infold/csv_columns/_bulk_form.html.haml +14 -0
- data/app/views/infold/csv_columns/_row.html.haml +10 -0
- data/app/views/infold/csv_columns/bulk.turbo_stream.haml +3 -0
- data/app/views/infold/csv_columns/index.html.haml +7 -0
- data/app/views/infold/enums/_form.html.haml +13 -0
- data/app/views/infold/enums/_index.html.haml +27 -0
- data/app/views/infold/enums/index.html.haml +5 -0
- data/app/views/infold/form_association_attachment_fields/_form.html.haml +13 -0
- data/app/views/infold/form_association_columns/_form.html.haml +20 -0
- data/app/views/infold/form_associations/_bulk_form.html.haml +16 -0
- data/app/views/infold/form_associations/_form.html.haml +19 -0
- data/app/views/infold/form_associations/show.html.haml +7 -0
- data/app/views/infold/form_associations/update.turbo_stream.haml +1 -0
- data/app/views/infold/form_attachment_fields/_form.html.haml +14 -0
- data/app/views/infold/form_columns/_form.html.haml +21 -0
- data/app/views/infold/menu_directories/_item.html.haml +20 -0
- data/app/views/infold/menu_directories/create.turbo_stream.haml +2 -0
- data/app/views/infold/menu_directories/destroy.turbo_stream.haml +5 -0
- data/app/views/infold/menus/_app.html.haml +10 -0
- data/app/views/infold/menus/_items.html.haml +7 -0
- data/app/views/infold/menus/edit.html.haml +23 -0
- data/app/views/infold/menus/update.turbo_stream.haml +3 -0
- data/app/views/infold/models/_form.html.haml +12 -0
- data/app/views/infold/models/_tab.html.haml +7 -0
- data/app/views/infold/models/edit.html.haml +9 -0
- data/app/views/infold/models/update.turbo_stream.haml +3 -0
- data/app/views/infold/search_conditions/_bulk_form.html.haml +24 -0
- data/app/views/infold/search_conditions/_column_options.html.haml +3 -0
- data/app/views/infold/search_conditions/_form_kind_options.html.haml +3 -0
- data/app/views/infold/search_conditions/_row.html.haml +31 -0
- data/app/views/infold/search_conditions/_sign_options.html.haml +3 -0
- data/app/views/infold/search_conditions/_tab.html.haml +12 -0
- data/app/views/infold/search_conditions/bulk.turbo_stream.haml +3 -0
- data/app/views/infold/search_conditions/index.html.haml +7 -0
- data/app/views/infold/search_conditions/refresh_columns.turbo_stream.haml +6 -0
- data/app/views/infold/search_conditions/refresh_form_kinds.turbo_stream.haml +4 -0
- data/app/views/infold/search_conditions/refresh_signs.turbo_stream.haml +2 -0
- data/app/views/infold/search_result_attachment_fields/_form.html.haml +12 -0
- data/app/views/infold/search_result_columns/_form.html.haml +12 -0
- data/app/views/infold/search_result_fields/_bulk_form.html.haml +23 -0
- data/app/views/infold/search_result_fields/_row.html.haml +12 -0
- data/app/views/infold/search_result_fields/bulk.turbo_stream.haml +3 -0
- data/app/views/infold/search_result_fields/index.html.haml +7 -0
- data/app/views/infold/show_association_attachment_fields/_form.html.haml +12 -0
- data/app/views/infold/show_association_columns/_form.html.haml +12 -0
- data/app/views/infold/show_associations/_bulk_form.html.haml +15 -0
- data/app/views/infold/show_associations/_form.html.haml +14 -0
- data/app/views/infold/show_associations/show.html.haml +7 -0
- data/app/views/infold/show_associations/update.turbo_stream.haml +1 -0
- data/app/views/infold/show_attachment_fields/_form.html.haml +12 -0
- data/app/views/infold/show_columns/_form.html.haml +12 -0
- data/app/views/infold/sync_dbs/create.turbo_stream.haml +1 -0
- data/app/views/infold/sync_dbs/show.html.haml +11 -0
- data/app/views/layouts/infold/application.html.haml +112 -0
- data/config/database.yml +11 -0
- data/config/initializers/infold_assets.rb +12 -0
- data/config/initializers/infold_locale.rb +1 -0
- data/config/locales/infold/ar/app/en.yml +6 -0
- data/config/locales/infold/ar/app/ja.yml +6 -0
- data/config/locales/infold/ar/app_view/en.yml +4 -0
- data/config/locales/infold/ar/app_view/ja.yml +4 -0
- data/config/locales/infold/ar/app_view_form/en.yml +10 -0
- data/config/locales/infold/ar/app_view_form/ja.yml +10 -0
- data/config/locales/infold/ar/app_view_index/en.yml +12 -0
- data/config/locales/infold/ar/app_view_index/ja.yml +12 -0
- data/config/locales/infold/ar/app_view_modal/en.yml +6 -0
- data/config/locales/infold/ar/app_view_modal/ja.yml +6 -0
- data/config/locales/infold/ar/app_view_show/en.yml +9 -0
- data/config/locales/infold/ar/app_view_show/ja.yml +9 -0
- data/config/locales/infold/ar/csv_column/en.yml +8 -0
- data/config/locales/infold/ar/csv_column/ja.yml +8 -0
- data/config/locales/infold/ar/form_association_column/ja.yml +15 -0
- data/config/locales/infold/ar/form_column/ja.yml +15 -0
- data/config/locales/infold/ar/menu_item/ja.yml +6 -0
- data/config/locales/infold/ar/model/ja.yml +11 -0
- data/config/locales/infold/ar/model_association/en.yml +6 -0
- data/config/locales/infold/ar/model_association/ja.yml +10 -0
- data/config/locales/infold/ar/model_column/en.yml +34 -0
- data/config/locales/infold/ar/model_column/ja.yml +34 -0
- data/config/locales/infold/ar/search_condition/en.yml +30 -0
- data/config/locales/infold/ar/search_condition/ja.yml +30 -0
- data/config/locales/infold/ar/search_result_field/en.yml +9 -0
- data/config/locales/infold/ar/search_result_field/ja.yml +9 -0
- data/config/locales/infold/en.yml +40 -0
- data/config/locales/infold/ja.yml +41 -0
- data/config/routes.rb +40 -0
- data/db/infold_test.sqlite3 +0 -0
- data/db/migrate/20220419050641_create_infold_projects.rb +9 -0
- data/db/migrate/20220419051049_create_infold_models.rb +15 -0
- data/db/migrate/20220419051601_create_infold_columns.rb +23 -0
- data/db/migrate/20220419051718_create_infold_attachment_fields.rb +15 -0
- data/db/migrate/20220419052017_create_infold_model_associations.rb +16 -0
- data/db/migrate/20220419052154_create_infold_apps.rb +10 -0
- data/db/migrate/20220419052320_create_infold_app_views.rb +14 -0
- data/db/migrate/20220419052450_create_infold_search_conditions.rb +14 -0
- data/db/migrate/20220419052707_create_infold_search_result_fields.rb +18 -0
- data/db/migrate/20220419053338_create_infold_show_fields.rb +18 -0
- data/db/migrate/20220419053425_create_infold_show_association_fields.rb +15 -0
- data/db/migrate/20220419060937_create_infold_form_fields.rb +19 -0
- data/db/migrate/20220419061148_create_infold_form_association_fields.rb +16 -0
- data/db/migrate/20220419061725_create_infold_enums.rb +16 -0
- data/db/migrate/20220419062020_create_infold_menu_items.rb +16 -0
- data/db/migrate/20220419062119_create_infold_csv_columns.rb +12 -0
- data/db/schema.rb +260 -0
- data/lib/generators/infold/app/app_generator.rb +134 -0
- data/lib/generators/infold/app/templates/controller.rb.tt +100 -0
- data/lib/generators/infold/app/templates/search_form.rb.tt +31 -0
- data/lib/generators/infold/app/templates/views/_association_fields.haml.tt +16 -0
- data/lib/generators/infold/app/templates/views/_detail.haml.tt +100 -0
- data/lib/generators/infold/app/templates/views/_detail_modal_wrapper.haml.tt +9 -0
- data/lib/generators/infold/app/templates/views/_form.haml.tt +66 -0
- data/lib/generators/infold/app/templates/views/_index_row.haml.tt +17 -0
- data/lib/generators/infold/app/templates/views/_show_operation.haml.tt +5 -0
- data/lib/generators/infold/app/templates/views/edit+turbo_frame.haml.tt +13 -0
- data/lib/generators/infold/app/templates/views/edit.haml.tt +10 -0
- data/lib/generators/infold/app/templates/views/form.turbo_stream.haml.tt +17 -0
- data/lib/generators/infold/app/templates/views/index+turbo_frame.haml.tt +43 -0
- data/lib/generators/infold/app/templates/views/index.csv.ruby.tt +18 -0
- data/lib/generators/infold/app/templates/views/index.haml.tt +49 -0
- data/lib/generators/infold/app/templates/views/new+turbo_frame.haml.tt +14 -0
- data/lib/generators/infold/app/templates/views/new.haml.tt +12 -0
- data/lib/generators/infold/app/templates/views/show+turbo_frame.haml.tt +4 -0
- data/lib/generators/infold/app/templates/views/show.haml.tt +9 -0
- data/lib/generators/infold/install/install_generator.rb +151 -0
- data/lib/generators/infold/install/templates/app/components/admin/enum_badge_component.html.haml +4 -0
- data/lib/generators/infold/install/templates/app/components/admin/enum_badge_component.rb +11 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/checkbox_fieldset_component.html.haml +11 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/checkbox_fieldset_component.rb +15 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/datetime_fieldset_component.html.haml +20 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/datetime_fieldset_component.rb +13 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/file_upload_component.html.haml +12 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/file_upload_component.rb +12 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/input_fieldset_component.html.haml +14 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/input_fieldset_component.rb +24 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/radio_fieldset_component.html.haml +11 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/radio_fieldset_component.rb +15 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/relation_fieldset_component.html.haml +17 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/relation_fieldset_component.rb +21 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/select_fieldset_component.html.haml +7 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/select_fieldset_component.rb +16 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/switch_element_component.html.haml +4 -0
- data/lib/generators/infold/install/templates/app/components/admin/form/switch_element_component.rb +12 -0
- data/lib/generators/infold/install/templates/app/components/admin/remote_modal_component.html.haml +8 -0
- data/lib/generators/infold/install/templates/app/components/admin/remote_modal_component.rb +21 -0
- data/lib/generators/infold/install/templates/app/components/admin/sortable_th_component.html.haml +4 -0
- data/lib/generators/infold/install/templates/app/components/admin/sortable_th_component.rb +27 -0
- data/lib/generators/infold/install/templates/app/controllers/admin/admin_users/registrations_controller.rb +71 -0
- data/lib/generators/infold/install/templates/app/controllers/admin/admin_users/sessions_controller.rb +39 -0
- data/lib/generators/infold/install/templates/app/controllers/admin/admin_users_controller.rb +62 -0
- data/lib/generators/infold/install/templates/app/controllers/admin/base_controller.rb +17 -0
- data/lib/generators/infold/install/templates/app/controllers/admin/errors_controller.rb +8 -0
- data/lib/generators/infold/install/templates/app/controllers/admin/turbo_devise_controller.rb +21 -0
- data/lib/generators/infold/install/templates/app/controllers/concerns/admin/error_handlers.rb +40 -0
- data/lib/generators/infold/install/templates/app/forms/admin/search_form_base.rb +48 -0
- data/lib/generators/infold/install/templates/app/helpers/admin_helper.rb +37 -0
- data/lib/generators/infold/install/templates/app/models/concerns/admin/datetime_field_concern.rb +57 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/_detail.html.haml +14 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/_form.html.haml +6 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/_index_row.html.haml +9 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/_show_operation.html.haml +4 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/edit.html+turbo_frame.haml +11 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/edit.html.haml +10 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/form.turbo_stream.haml +4 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/index.html.haml +21 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/new.html+turbo_frame.haml +11 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/new.html.haml +10 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/registrations/edit.html.haml +15 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/sessions/new.html.haml +19 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/show.html+turbo_frame.haml +11 -0
- data/lib/generators/infold/install/templates/app/views/admin/admin_users/show.html.haml +8 -0
- data/lib/generators/infold/install/templates/app/views/admin/common/_flash.html.haml +6 -0
- data/lib/generators/infold/install/templates/app/views/admin/common/_header_menu.html.haml +0 -0
- data/lib/generators/infold/install/templates/app/views/admin/errors/bad_request.html.haml +11 -0
- data/lib/generators/infold/install/templates/app/views/admin/errors/forbidden.html.haml +11 -0
- data/lib/generators/infold/install/templates/app/views/admin/errors/internal_server_error.html.haml +11 -0
- data/lib/generators/infold/install/templates/app/views/admin/errors/not_found.html.haml +11 -0
- data/lib/generators/infold/install/templates/app/views/admin/kaminari/_first_page.html.haml +2 -0
- data/lib/generators/infold/install/templates/app/views/admin/kaminari/_gap.html.haml +2 -0
- data/lib/generators/infold/install/templates/app/views/admin/kaminari/_last_page.html.haml +2 -0
- data/lib/generators/infold/install/templates/app/views/admin/kaminari/_next_page.html.haml +2 -0
- data/lib/generators/infold/install/templates/app/views/admin/kaminari/_page.html.haml +6 -0
- data/lib/generators/infold/install/templates/app/views/admin/kaminari/_paginator.html.haml +12 -0
- data/lib/generators/infold/install/templates/app/views/admin/kaminari/_prev_page.html.haml +2 -0
- data/lib/generators/infold/install/templates/app/views/layouts/admin.haml.tt +49 -0
- data/lib/generators/infold/install/templates/config/locales/infold.en.yml +28 -0
- data/lib/generators/infold/install/templates/config/locales/infold.ja.yml +28 -0
- data/lib/generators/infold/install/templates/config/routes/admin.rb +13 -0
- data/lib/generators/infold/install/templates/javascript/admin/controllers/application.js +9 -0
- data/lib/generators/infold/install/templates/javascript/admin/controllers/datepicker_controller.js +8 -0
- data/lib/generators/infold/install/templates/javascript/admin/controllers/flash_controller.js +10 -0
- data/lib/generators/infold/install/templates/javascript/admin/controllers/index.js +26 -0
- data/lib/generators/infold/install/templates/javascript/admin/controllers/index_page_controller.js +33 -0
- data/lib/generators/infold/install/templates/javascript/admin/controllers/nested_form_controller.js +33 -0
- data/lib/generators/infold/install/templates/javascript/admin/controllers/relation_search_controller.js +21 -0
- data/lib/generators/infold/install/templates/javascript/admin/controllers/remote_modal_controller.js +37 -0
- data/lib/generators/infold/install/templates/javascript/admin/controllers/timepicker_controller.js +8 -0
- data/lib/generators/infold/install/templates/javascript/admin/stylesheets/custom.css +290 -0
- data/lib/generators/infold/install/templates/javascript/admin/stylesheets/custom.css.map +1 -0
- data/lib/generators/infold/install/templates/javascript/esbuild/admin.js +10 -0
- data/lib/generators/infold/install/templates/javascript/webpacker/admin.js +9 -0
- data/lib/generators/infold/model/model_generator.rb +50 -0
- data/lib/generators/infold/model/templates/decorator.rb.tt +10 -0
- data/lib/generators/infold/model/templates/model.rb.tt +59 -0
- data/lib/generators/infold/project/project_generator.rb +66 -0
- data/lib/generators/infold/project/templates/_header_menu.haml.tt +17 -0
- data/lib/generators/infold/project/templates/locales/form.yml.tt +11 -0
- data/lib/generators/infold/project/templates/locales/model.yml.tt +43 -0
- data/lib/generators/infold/project/templates/relation_fieldset_component.rb.tt +30 -0
- data/lib/infold/engine.rb +15 -0
- data/lib/infold/version.rb +3 -0
- data/lib/infold.rb +6 -0
- data/lib/tasks/infold_tasks.rake +125 -0
- metadata +556 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
module Infold
|
2
|
+
class AppViewShow < AppView
|
3
|
+
has_many :show_fields, foreign_key: :app_view_id, dependent: :destroy
|
4
|
+
has_many :show_columns, foreign_key: :app_view_id
|
5
|
+
has_many :show_attachment_fields, foreign_key: :app_view_id
|
6
|
+
has_many :show_associations, foreign_key: :app_view_id
|
7
|
+
|
8
|
+
accepts_nested_attributes_for :show_fields, allow_destroy: true
|
9
|
+
|
10
|
+
before_create :build_default_show_fields
|
11
|
+
|
12
|
+
# def save_with_associations
|
13
|
+
# seq = -1
|
14
|
+
# show_columns.sort_by(&:seq).each do |column|
|
15
|
+
# column.seq = seq += 1
|
16
|
+
# end
|
17
|
+
# seq = -1
|
18
|
+
# show_attachment_fields.sort_by(&:seq).each do |ass|
|
19
|
+
# ass.seq = seq += 1
|
20
|
+
# end
|
21
|
+
# seq = -1
|
22
|
+
# show_associations.sort_by(&:seq).each do |ass|
|
23
|
+
# ass.seq = seq += 1
|
24
|
+
# end
|
25
|
+
# self.save
|
26
|
+
# end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def build_default_show_fields
|
31
|
+
model.columns.sort_by(&:seq).each_with_index do |column, i|
|
32
|
+
show_column = show_fields.build
|
33
|
+
show_column.type = ShowColumn.name
|
34
|
+
show_column.seq = i
|
35
|
+
show_column.model_column_id = column.id
|
36
|
+
show_column.display = true
|
37
|
+
end
|
38
|
+
model.attachment_fields.each.with_index(show_fields.size) do |column, i|
|
39
|
+
show_column = show_fields.build
|
40
|
+
show_column.type = ShowAttachmentField.name
|
41
|
+
show_column.seq = i
|
42
|
+
show_column.attachment_field_id = column.id
|
43
|
+
show_column.display = true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Infold
|
2
|
+
class AttachmentField < ApplicationRecord
|
3
|
+
self.table_name = name.gsub('Infold::', '').underscore.pluralize
|
4
|
+
|
5
|
+
belongs_to :model
|
6
|
+
has_many :search_result_attachment_fields, dependent: :destroy
|
7
|
+
has_many :form_attachment_fields, dependent: :destroy
|
8
|
+
has_many :show_attachment_fields, dependent: :destroy
|
9
|
+
has_many :form_association_attachment_fields, dependent: :destroy
|
10
|
+
has_many :show_association_attachment_fields, dependent: :destroy
|
11
|
+
|
12
|
+
enum kind: { image: 1, file: 2 }, _prefix: true
|
13
|
+
enum thumbnail: { none: 0, fill: 1, fit: 2 }, _prefix: true
|
14
|
+
|
15
|
+
after_initialize do
|
16
|
+
set_default unless persisted?
|
17
|
+
end
|
18
|
+
|
19
|
+
validates :name, presence: true
|
20
|
+
validates :kind, presence: true
|
21
|
+
validates :thumb_width, presence: true, unless: :thumbnail_none?
|
22
|
+
validates :thumb_height, presence: true, unless: :thumbnail_none?
|
23
|
+
|
24
|
+
def locale_or_name
|
25
|
+
locale.presence || name
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def set_default
|
31
|
+
self.kind ||= :image
|
32
|
+
self.thumbnail ||= :none if kind_image?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
module Infold
|
4
|
+
class Build
|
5
|
+
|
6
|
+
def generate_models
|
7
|
+
Rails::Generators.invoke('infold:model', ['-1'])
|
8
|
+
sleep 0.1
|
9
|
+
direct_model_ids = App.all.pluck(:model_id)
|
10
|
+
association_model_ids = Model.where(id: direct_model_ids).includes(:child_model_associations, :parent_model_associations).
|
11
|
+
map{|m| [ m.child_model_associations.pluck(:model_id), m.parent_model_associations.pluck(:parent_model_id)] }.flatten.uniq
|
12
|
+
# association先の更にassociationまでを対象にする
|
13
|
+
over_association_model_ids = Model.where(id: association_model_ids).includes(:child_model_associations, :parent_model_associations).
|
14
|
+
map{|m| [ m.child_model_associations.pluck(:model_id), m.parent_model_associations.pluck(:parent_model_id)] }.flatten.uniq
|
15
|
+
Model.where(id: (direct_model_ids + association_model_ids + over_association_model_ids).uniq).each do |model|
|
16
|
+
Rails::Generators.invoke('infold:model', [model.id.to_s], destination_root: Rails.root)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def generate_apps
|
21
|
+
Rails::Generators.invoke('infold:app', ['-1'])
|
22
|
+
sleep 0.1
|
23
|
+
App.all.each do |app|
|
24
|
+
Rails::Generators.invoke('infold:app', [app.id.to_s], destination_root: Rails.root)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def generate_project
|
29
|
+
Rails::Generators.invoke('infold:project', ['-1'])
|
30
|
+
sleep 0.1
|
31
|
+
Rails::Generators.invoke('infold:project', ['1'], destination_root: Rails.root)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Infold
|
2
|
+
class CsvColumn < ApplicationRecord
|
3
|
+
self.table_name = name.gsub('Infold::', '').underscore.pluralize
|
4
|
+
|
5
|
+
belongs_to :app_view, class_name: AppViewIndex.name
|
6
|
+
belongs_to :model_column, optional: true
|
7
|
+
delegate :model, :model_association, to: :model_column
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Infold
|
2
|
+
class Enum < ApplicationRecord
|
3
|
+
self.table_name = name.gsub('Infold::', '').underscore.pluralize
|
4
|
+
|
5
|
+
belongs_to :model_column
|
6
|
+
|
7
|
+
enum color: { white: 0, light: 1, blue: 2, purple: 3, red: 4, orange: 5, green: 6, secondary: 7, dark: 8 }, _prefix: true
|
8
|
+
|
9
|
+
# validates :key, presence: true, uniqueness: { scope: :model_column }, ruby_code: true
|
10
|
+
validates :value, presence: true
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Infold
|
2
|
+
class FormAssociation < FormField
|
3
|
+
belongs_to :model_association
|
4
|
+
has_many :form_association_fields, dependent: :destroy
|
5
|
+
has_many :form_association_columns
|
6
|
+
has_many :form_association_attachment_fields
|
7
|
+
|
8
|
+
accepts_nested_attributes_for :form_association_fields, allow_destroy: true
|
9
|
+
|
10
|
+
delegate :limit, :has_name, :belongs_name, :required?, :model, to: :model_association
|
11
|
+
|
12
|
+
before_create :build_default_form_association_fields
|
13
|
+
|
14
|
+
def save_with_associations
|
15
|
+
seq = -1
|
16
|
+
form_association_fields.sort_by(&:seq).each do |column|
|
17
|
+
column.seq = seq += 1
|
18
|
+
end
|
19
|
+
self.save
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def build_default_form_association_fields
|
25
|
+
model_association.model.columns.sort_by(&:seq).each_with_index do |column, i|
|
26
|
+
next if column.is_foreign_key? && column == model_association.foreign_key_column
|
27
|
+
form_field = form_association_columns.build
|
28
|
+
form_field.seq = i
|
29
|
+
form_field.model_column_id = column.id
|
30
|
+
form_field.form_kind = form_field.enable_form_kinds&.first[1]
|
31
|
+
form_field.display = !column.is_primary_key? && !column.is_timestamp_field?
|
32
|
+
end
|
33
|
+
model_association.model.attachment_fields.each.with_index(form_association_columns.size) do |attachment_field, i|
|
34
|
+
form_field = form_association_attachment_fields.build
|
35
|
+
form_field.seq = i
|
36
|
+
form_field.attachment_field_id = attachment_field.id
|
37
|
+
form_field.display = true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Infold
|
2
|
+
class MenuItem < ApplicationRecord
|
3
|
+
self.table_name = name.gsub('Infold::', '').underscore.pluralize
|
4
|
+
|
5
|
+
belongs_to :project
|
6
|
+
belongs_to :app, optional: true
|
7
|
+
belongs_to :directory, class_name: MenuItem.name, foreign_key: :directory_id, optional: true
|
8
|
+
has_many :menu_apps, class_name: MenuItem.name, foreign_key: :directory_id, dependent: :nullify
|
9
|
+
|
10
|
+
accepts_nested_attributes_for :menu_apps, allow_destroy: true
|
11
|
+
|
12
|
+
enum kind: { app: 1, directory: 2 }, _prefix: true
|
13
|
+
|
14
|
+
validates :name, presence: true, if: :name_required?
|
15
|
+
validate :check_menu_apps
|
16
|
+
|
17
|
+
def layer
|
18
|
+
kind_directory? || directory.blank? ? 1 : 2
|
19
|
+
end
|
20
|
+
|
21
|
+
def layer1?
|
22
|
+
layer == 1
|
23
|
+
end
|
24
|
+
|
25
|
+
def layer2?
|
26
|
+
layer == 2
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def name_required?
|
32
|
+
kind_directory? && (persisted? || menu_apps.present?)
|
33
|
+
end
|
34
|
+
|
35
|
+
def check_menu_apps
|
36
|
+
if apps_required? && project.menu_items.select{ |i| i.kind_app? && i.directory == self }.blank?
|
37
|
+
errors.add(:menu_apps, 'を設定してください')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def apps_required?
|
42
|
+
kind_directory? && persisted? && name.present?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Infold
|
2
|
+
class Model < ApplicationRecord
|
3
|
+
self.table_name = name.gsub('Infold::', '').underscore.pluralize
|
4
|
+
|
5
|
+
belongs_to :pk_column, class_name: ModelColumn.name, optional: true
|
6
|
+
belongs_to :create_timestamp_column, class_name: ModelColumn.name, optional: true
|
7
|
+
belongs_to :update_timestamp_column, class_name: ModelColumn.name, optional: true
|
8
|
+
belongs_to :label_column, class_name: ModelColumn.name, optional: true
|
9
|
+
|
10
|
+
has_many :columns, class_name: ModelColumn.name, dependent: :destroy
|
11
|
+
has_many :associations, class_name: ModelAssociation.name, dependent: :destroy
|
12
|
+
has_many :child_model_associations, class_name: ModelAssociation.name, foreign_key: 'parent_model_id', dependent: :destroy
|
13
|
+
has_many :child_models, through: :child_model_associations, source: :model
|
14
|
+
has_many :parent_model_associations, class_name: ModelAssociation.name, foreign_key: 'model_id'
|
15
|
+
has_many :parent_models, through: :parent_model_associations, source: :parent_model
|
16
|
+
has_many :apps, dependent: :destroy
|
17
|
+
has_many :attachment_fields, dependent: :destroy
|
18
|
+
|
19
|
+
accepts_nested_attributes_for :columns, allow_destroy: true
|
20
|
+
accepts_nested_attributes_for :associations, allow_destroy: true
|
21
|
+
|
22
|
+
def self_and_association_models
|
23
|
+
order = "CASE WHEN id = #{id} THEN 0 ELSE id END"
|
24
|
+
self.class.where(id: [id] + child_model_associations.map(&:model_id)).order(Arel.sql(order))
|
25
|
+
end
|
26
|
+
|
27
|
+
def locale_or_name
|
28
|
+
locale.presence || name
|
29
|
+
end
|
30
|
+
|
31
|
+
def name_pluralize
|
32
|
+
name.to_s.underscore.pluralize
|
33
|
+
end
|
34
|
+
|
35
|
+
def set_name_from_table_name
|
36
|
+
self.name = table_name&.singularize&.camelize
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Infold
|
2
|
+
class ModelAssociation < ApplicationRecord
|
3
|
+
self.table_name = name.gsub('Infold::', '').underscore.pluralize
|
4
|
+
|
5
|
+
belongs_to :model
|
6
|
+
belongs_to :model_column
|
7
|
+
belongs_to :parent_model, class_name: Model.name, optional: true
|
8
|
+
|
9
|
+
has_many :show_associations, dependent: :destroy
|
10
|
+
has_many :form_associations, dependent: :destroy
|
11
|
+
|
12
|
+
delegate :name, to: :parent_model, prefix: true
|
13
|
+
|
14
|
+
before_validation :set_model_id
|
15
|
+
|
16
|
+
enum dependent: { destroy: 1, delete_all: 2, nullify: 3 }, _prefix: true
|
17
|
+
enum has_kind: { one: 1, many: 2 }, _prefix: true
|
18
|
+
enum dependent_kind: { destroy: 1, delete_all: 2, nullify: 3, restrict_with_error: 4 }, _prefix: true
|
19
|
+
|
20
|
+
validates :parent_model_id, presence: true
|
21
|
+
validates :has_kind, presence: true
|
22
|
+
validates :dependent_kind, presence: true
|
23
|
+
|
24
|
+
def has_name
|
25
|
+
_name = model.name.underscore
|
26
|
+
has_kind_one? ? _name.singularize : _name.pluralize
|
27
|
+
end
|
28
|
+
|
29
|
+
def belongs_name
|
30
|
+
parent_model.name.underscore.singularize
|
31
|
+
end
|
32
|
+
|
33
|
+
def locale_or_has_name
|
34
|
+
locale.presence || has_name
|
35
|
+
end
|
36
|
+
|
37
|
+
def primary_key_column
|
38
|
+
parent_model.pk_column
|
39
|
+
end
|
40
|
+
|
41
|
+
def foreign_key_column
|
42
|
+
model_column
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def set_model_id
|
48
|
+
self.model = model_column.model
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module Infold
|
2
|
+
class ModelColumn < ApplicationRecord
|
3
|
+
self.table_name = name.gsub('Infold::', '').underscore.pluralize
|
4
|
+
|
5
|
+
belongs_to :model
|
6
|
+
|
7
|
+
has_one :model_association, dependent: :destroy
|
8
|
+
|
9
|
+
has_many :search_conditions, dependent: :destroy
|
10
|
+
has_many :search_result_columns, dependent: :destroy
|
11
|
+
has_many :csv_columns, dependent: :destroy
|
12
|
+
has_many :show_columns, dependent: :destroy
|
13
|
+
has_many :show_association_columns, dependent: :destroy
|
14
|
+
has_many :form_columns, dependent: :destroy
|
15
|
+
has_many :form_association_columns, dependent: :destroy
|
16
|
+
has_many :enums, dependent: :destroy
|
17
|
+
|
18
|
+
accepts_nested_attributes_for :model_association, allow_destroy: true
|
19
|
+
accepts_nested_attributes_for :enums, allow_destroy: true, reject_if: :all_blank
|
20
|
+
|
21
|
+
with_options unless: -> { validation_context == :detail } do |v|
|
22
|
+
v.validates :kind, presence: true
|
23
|
+
v.validates :enums, length: { minimum: 1, message: 'を設定してください' }, if: :kind_enum?
|
24
|
+
v.validates :model_association, presence: { message: 'を設定してください' }, if: :kind_reference?
|
25
|
+
end
|
26
|
+
|
27
|
+
with_options on: :detail do |v|
|
28
|
+
v.validates :minimum_length, allow_blank: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
29
|
+
v.validates :maximum_length, allow_blank: true, numericality: { only_integer: true, greater_than: 0 }
|
30
|
+
v.validates :minimum_value, allow_blank: true, numericality: { only_integer: true }
|
31
|
+
v.validates :maximum_value, allow_blank: true, numericality: { only_integer: true }
|
32
|
+
v.validate :check_value_range
|
33
|
+
v.validate :check_enums
|
34
|
+
end
|
35
|
+
|
36
|
+
enum kind: {
|
37
|
+
string: 1,
|
38
|
+
number: 2,
|
39
|
+
date: 3,
|
40
|
+
datetime: 4,
|
41
|
+
boolean: 6,
|
42
|
+
enum: 7,
|
43
|
+
reference: 8,
|
44
|
+
}, _prefix: true
|
45
|
+
enum number_kind: { integer: 1, float: 2 }, _prefix: true
|
46
|
+
enum unit_position: { prefix: 1, suffix: 2 }, _prefix: true
|
47
|
+
enum not_null: { none: 0, app: 1, db: 2 }, _prefix: true
|
48
|
+
enum unique: { none: 0, app: 1, db: 2 }, _prefix: true
|
49
|
+
|
50
|
+
def is_foreign_key?
|
51
|
+
kind_reference?
|
52
|
+
end
|
53
|
+
|
54
|
+
def is_primary_key?
|
55
|
+
model.pk_column == self
|
56
|
+
end
|
57
|
+
|
58
|
+
def is_timestamp_field?
|
59
|
+
self == model.create_timestamp_column || self == model.update_timestamp_column
|
60
|
+
end
|
61
|
+
|
62
|
+
def locale_or_name_with_foreign_key
|
63
|
+
model_association&.locale.presence || locale_or_name
|
64
|
+
end
|
65
|
+
|
66
|
+
def name_with_foreign_key
|
67
|
+
if is_foreign_key?
|
68
|
+
association_label_name = model_association.parent_model.label_column&.name
|
69
|
+
"#{name} (#{model_association.belongs_name}.#{association_label_name || 'id'})"
|
70
|
+
else
|
71
|
+
name
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def not_null?
|
76
|
+
not_null_app? || not_null_db?
|
77
|
+
end
|
78
|
+
|
79
|
+
def required_validate?
|
80
|
+
not_null? && !kind_boolean? && !is_primary_key? && !is_timestamp_field?
|
81
|
+
end
|
82
|
+
|
83
|
+
def unique?
|
84
|
+
unique_app? || unique_db?
|
85
|
+
end
|
86
|
+
|
87
|
+
def view_form_default_display?
|
88
|
+
!is_primary_key? && self != model.create_timestamp_column && self != model.update_timestamp_column
|
89
|
+
end
|
90
|
+
|
91
|
+
def locale_or_name
|
92
|
+
locale.presence || name
|
93
|
+
end
|
94
|
+
|
95
|
+
def has_detail_setting?
|
96
|
+
!%w(date datetime boolean).include?(kind)
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def check_value_range
|
102
|
+
if kind_number?
|
103
|
+
if errors[:minimum_value].blank? && errors[:maximum_value].blank? &&
|
104
|
+
minimum_value.present? && maximum_value.present? &&
|
105
|
+
minimum_value > maximum_value
|
106
|
+
errors.add(:minimum_value, "は#{self.class.human_attribute_name(:maximum_value)}以下にしてください")
|
107
|
+
end
|
108
|
+
elsif kind_string?
|
109
|
+
if errors[:minimum_length].blank? && errors[:maximum_length].blank? &&
|
110
|
+
minimum_length.present? && maximum_length.present? &&
|
111
|
+
minimum_length > maximum_length
|
112
|
+
errors.add(:minimum_length, "は#{self.class.human_attribute_name(:maximum_length)}以下にしてください")
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def check_enums
|
118
|
+
enums&.group_by(&:value)&.each do |duplicate_value, _enum|
|
119
|
+
errors.add(:base, "Valueが重複しています。value:#{duplicate_value}") if duplicate_value.present? && _enum.size > 1
|
120
|
+
end
|
121
|
+
|
122
|
+
enums&.group_by(&:key)&.each do |duplicate_key, _enum|
|
123
|
+
errors.add(:base, "Codeが重複しています。value:#{duplicate_key}") if duplicate_key.present? && _enum.size > 1
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Infold
|
2
|
+
class Project < ApplicationRecord
|
3
|
+
self.table_name = name.gsub('Infold::', '').underscore.pluralize
|
4
|
+
|
5
|
+
has_many :menu_items, dependent: :destroy
|
6
|
+
accepts_nested_attributes_for :menu_items, allow_destroy: true
|
7
|
+
|
8
|
+
def create_menu_items
|
9
|
+
seq = menu_items.size
|
10
|
+
App.all.where.not(id: menu_items.map(&:app_id).compact).each_with_index do |app, i|
|
11
|
+
menu_items.create!(kind: :app, app: app, directory: nil, seq: seq += i)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def root_app
|
16
|
+
menu = menu_items.select(&:layer1?).sort_by(&:seq).first
|
17
|
+
if menu.kind_directory?
|
18
|
+
menu = menu.menu_apps.sort_by(&:seq).first
|
19
|
+
end
|
20
|
+
menu&.app
|
21
|
+
end
|
22
|
+
|
23
|
+
def destroy_blank_menu_directory
|
24
|
+
menu_items.select { |menu| menu.kind_directory? && menu.menu_apps.blank? }.each do |blank_dir|
|
25
|
+
blank_dir.destroy
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|