lesli 5.0.13 → 5.0.14
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.
- checksums.yaml +4 -4
- data/app/assets/config/lesli_manifest.js +3 -6
- data/app/assets/images/lesli/brand/app-icon.svg +45 -39
- data/app/assets/javascripts/lesli/application.js +1 -0
- data/app/controllers/lesli/abouts_controller.rb +16 -14
- data/app/controllers/lesli/application_controller.rb +13 -0
- data/app/controllers/lesli/application_devise_controller.rb +10 -12
- data/app/controllers/lesli/application_lesli_controller.rb +12 -11
- data/app/controllers/lesli/apps_controller.rb +6 -0
- data/app/controllers/lesli/roles_controller.rb +2 -2
- data/app/helpers/lesli/general_helper.rb +18 -5
- data/app/helpers/lesli/html_helper.rb +8 -0
- data/app/helpers/lesli/navigation_helper.rb +30 -11
- data/app/helpers/lesli/system_helper.rb +2 -2
- data/app/helpers/lesli/turbo_helper.rb +58 -0
- data/app/interfaces/lesli/customization_interface.rb +42 -0
- data/app/interfaces/lesli/requester_interface.rb +103 -0
- data/app/interfaces/lesli/responder_interface.rb +127 -0
- data/app/lib/date2.rb +1 -199
- data/app/lib/lesli/courier.rb +54 -0
- data/app/mailers/lesli/application_lesli_mailer.rb +32 -59
- data/app/mailers/lesli/devise_mailer.rb +16 -8
- data/app/models/concerns/account_initializer.rb +27 -68
- data/app/models/concerns/lesli/has_activities.rb +29 -0
- data/app/models/concerns/user_extensions.rb +34 -19
- data/app/models/concerns/user_security.rb +4 -4
- data/app/models/lesli/account.rb +13 -20
- data/{lib/scss/layouts/application-container.scss → app/models/lesli/item/activity.rb} +11 -8
- data/app/models/lesli/role/{power.rb → action.rb} +6 -4
- data/app/models/lesli/role.rb +7 -15
- data/app/models/lesli/shared/catalog.rb +20 -0
- data/app/models/lesli/shared/dashboard.rb +1 -1
- data/app/models/lesli/user/activity.rb +5 -0
- data/app/models/lesli/user/detail.rb +5 -5
- data/app/models/lesli/user/{log.rb → journal.rb} +3 -3
- data/app/models/lesli/user/{power.rb → role.rb} +2 -3
- data/app/models/lesli/user/session.rb +3 -4
- data/app/models/lesli/user.rb +50 -46
- data/app/operators/lesli/controller_operator.rb +3 -1
- data/app/operators/lesli/{role_descriptor_operator.rb → role_operator.rb} +51 -28
- data/app/operators/lesli/user_registration_operator.rb +3 -2
- data/app/services/lesli/application_lesli_service.rb +8 -4
- data/app/services/lesli/role/action_service.rb +58 -0
- data/app/services/lesli/role_service.rb +232 -0
- data/app/services/lesli/{user_session_service.rb → user/session_service.rb} +23 -14
- data/app/services/lesli/user_service.rb +85 -1
- data/app/views/lesli/apps/show.html.erb +52 -0
- data/app/views/lesli/layouts/application-devise.html.erb +5 -7
- data/app/views/lesli/layouts/application-lesli.html.erb +18 -24
- data/app/views/lesli/partials/_application-analytics.html.erb +2 -2
- data/app/views/lesli/partials/_application-data.html.erb +3 -77
- data/app/views/lesli/partials/_application-head.html.erb +7 -4
- data/app/views/lesli/partials/_application-lesli-annoouncements.html.erb +49 -0
- data/app/views/lesli/partials/_application-lesli-header.html.erb +73 -49
- data/app/views/lesli/partials/_application-lesli-javascript.html.erb +3 -16
- data/app/views/lesli/partials/_application-lesli-navigation.html.erb +12 -9
- data/app/views/lesli/partials/{_application-lesli-notices.html.erb → _application-lesli-notifications.html.erb} +10 -8
- data/app/views/lesli/partials/_application-lesli-scss.html.erb +1 -1
- data/app/views/lesli/partials/_application-lesli-sidebar.html.erb +1 -1
- data/app/views/lesli/partials/_application-public-javascript.html.erb +1 -4
- data/app/views/lesli/shared/dashboards/_show.html.erb +63 -0
- data/app/views/lesli/wrappers/_application-devise.html.erb +4 -6
- data/config/importmap.rb +14 -0
- data/config/initializers/lesli.rb +20 -12
- data/config/initializers/lesli_migration_helpers.rb +61 -0
- data/config/locales/translations.en.yml +1 -26
- data/config/locales/translations.es.yml +1 -26
- data/config/locales/translations.fr.yml +1 -26
- data/config/locales/translations.it.yml +1 -26
- data/config/locales/translations.pt.yml +1 -26
- data/config/routes.rb +3 -1
- data/db/migrate/v1/{0010000110_create_lesli_accounts.rb → 0000000110_create_lesli_accounts.rb} +13 -12
- data/db/migrate/v1/0000000210_create_lesli_roles.rb +65 -0
- data/db/migrate/v1/0000000310_create_lesli_users.rb +99 -0
- data/db/migrate/v1/{0010000610_create_lesli_system_controllers.rb → 0000100110_create_lesli_system_controllers.rb} +3 -3
- data/db/migrate/v1/{0010000710_create_lesli_system_controller_actions.rb → 0000100210_create_lesli_system_controller_actions.rb} +3 -4
- data/{lib/scss/layouts/application-content.scss → db/migrate/v1/0000110310_create_lesli_account_settings.rb} +8 -6
- data/{app/models/lesli/user/agent.rb → db/migrate/v1/0000110410_create_lesli_account_activities.rb} +3 -3
- data/db/migrate/v1/0000120210_create_lesli_role_actions.rb +45 -0
- data/db/migrate/v1/{0010001410_create_lesli_account_logs.rb → 0000120310_create_lesli_role_privileges.rb} +8 -8
- data/db/{tables/0010003810_create_user_shortcuts.rb → migrate/v1/0000130210_create_lesli_user_roles.rb} +9 -12
- data/db/migrate/v1/0000130310_create_lesli_user_sessions.rb +56 -0
- data/db/{seed/production.rb → migrate/v1/0000130410_create_lesli_user_activities.rb} +7 -4
- data/db/{tables/0010001110_create_account_locations.rb → migrate2/0000100510_create_lesli_account_locations.rb} +6 -6
- data/db/{tables/0010001510_create_account_currencies.rb → migrate2/0000100610_create_lesli_account_currencies.rb} +4 -4
- data/db/seed/{development/accounts.rb → accounts.rb} +6 -2
- data/db/seed/{production/users.rb → users.rb} +4 -10
- data/db/seed/{tools.rb → xyz.rb} +2 -7
- data/db/seeds.rb +3 -2
- data/db/structure/00000020_catalogs.json +0 -0
- data/lib/generators/{application_lesli_generator.rb → application_lesli_generator_base.rb} +4 -4
- data/lib/generators/lesli/spec/spec_generator.rb +2 -2
- data/lib/generators/lesli/view/USAGE +8 -0
- data/lib/generators/lesli/view/templates/spec-factory.template +17 -0
- data/lib/generators/lesli/view/templates/spec-model.template +70 -0
- data/lib/generators/lesli/view/view_generator.rb +25 -0
- data/lib/lesli/configuration.rb +7 -10
- data/lib/lesli/engine.rb +22 -3
- data/lib/lesli/r_spec.rb +5 -2
- data/lib/lesli/routing.rb +42 -9
- data/lib/lesli/version.rb +2 -2
- data/lib/lesli.rb +11 -0
- data/lib/migrate/common.rb +94 -0
- data/lib/migrate/items/action_structure.rb +51 -0
- data/{db/migrate/v1/0010001210_create_lesli_account_activities.rb → lib/migrate/items/activity_structure.rb} +18 -16
- data/lib/migrate/items/attachment_structure.rb +62 -0
- data/{app/views/lesli/partials/_application-lesli-engines.html.erb → lib/migrate/items/discussion_structure.rb} +19 -27
- data/lib/migrate/items/subscriber_structure.rb +49 -0
- data/lib/migrate/items/version_structure.rb +53 -0
- data/lib/migrate/shared/account_structure.rb +21 -0
- data/lib/migrate/shared/catalog_structure.rb +30 -0
- data/lib/migrate/shared/dashboard_structure.rb +54 -0
- data/lib/migrate/shared/setting_structure.rb +20 -0
- data/lib/rspec/config/spec_coverage.rb +95 -0
- data/{db/migrate/v1/0010001110_create_lesli_account_settings.rb → lib/rspec/factories/lesli_account.rb} +10 -7
- data/{db/seed/development.rb → lib/rspec/factories/lesli_role.rb} +30 -3
- data/{db/seed/test.rb → lib/rspec/factories/lesli_user.rb} +32 -3
- data/lib/rspec/fixtures/files/lesli-icon.png +0 -0
- data/lib/rspec/fixtures/files/test_file_1.docx +0 -0
- data/{db/tables/0010001610_create_account_currency_exchange_rates.rb → lib/rspec/helpers/lesli_helper.rb} +21 -21
- data/lib/rspec/helpers/rails_helper.rb +134 -0
- data/lib/rspec/helpers/response_request_helper.rb +214 -0
- data/lib/rspec/helpers/response_service_helper.rb +66 -0
- data/lib/rspec/helpers/spec_helper.rb +99 -0
- data/lib/rspec/lesli_api_tester.rb +133 -0
- data/lib/rspec/lesli_service_tester.rb +46 -0
- data/{db/tables/0010001410_create_account_files.rb → lib/rspec/testers/controller.rb} +31 -20
- data/lib/rspec/testers/model.rb +36 -0
- data/lib/rspec/testers/request.rb +84 -0
- data/lib/tasks/lesli/db.rake +5 -3
- data/lib/tasks/lesli/git.rake +28 -32
- data/lib/tasks/lesli/github.rake +89 -0
- data/lib/tasks/lesli_tasks.rake +3 -3
- data/readme.md +28 -17
- metadata +134 -394
- data/app/assets/fonts/lesli/Domine/Domine-Variable.ttf +0 -0
- data/app/assets/fonts/lesli/Domine/OFL.txt +0 -97
- data/app/assets/fonts/lesli/MaterialDesign/icons.woff2 +0 -0
- data/app/assets/fonts/lesli/Montserrat/Montserrat-Variable.ttf +0 -0
- data/app/assets/fonts/lesli/OpenSans/OpenSans-Variable.ttf +0 -0
- data/app/assets/fonts/lesli/Remix/remixicon.eot +0 -0
- data/app/assets/fonts/lesli/Remix/remixicon.glyph.json +0 -1
- data/app/assets/fonts/lesli/Remix/remixicon.svg +0 -7633
- data/app/assets/fonts/lesli/Remix/remixicon.symbol.svg +0 -11
- data/app/assets/fonts/lesli/Remix/remixicon.ttf +0 -0
- data/app/assets/fonts/lesli/Remix/remixicon.woff +0 -0
- data/app/assets/fonts/lesli/Remix/remixicon.woff2 +0 -0
- data/app/assets/fonts/lesli/Roboto/LICENSE.txt +0 -202
- data/app/assets/fonts/lesli/Roboto/Roboto-Black.ttf +0 -0
- data/app/assets/fonts/lesli/Roboto/Roboto-BlackItalic.ttf +0 -0
- data/app/assets/fonts/lesli/Roboto/Roboto-Bold.ttf +0 -0
- data/app/assets/fonts/lesli/Roboto/Roboto-BoldItalic.ttf +0 -0
- data/app/assets/fonts/lesli/Roboto/Roboto-Italic.ttf +0 -0
- data/app/assets/fonts/lesli/Roboto/Roboto-Light.ttf +0 -0
- data/app/assets/fonts/lesli/Roboto/Roboto-LightItalic.ttf +0 -0
- data/app/assets/fonts/lesli/Roboto/Roboto-Medium.ttf +0 -0
- data/app/assets/fonts/lesli/Roboto/Roboto-MediumItalic.ttf +0 -0
- data/app/assets/fonts/lesli/Roboto/Roboto-Regular.ttf +0 -0
- data/app/assets/fonts/lesli/Roboto/Roboto-Thin.ttf +0 -0
- data/app/assets/fonts/lesli/Roboto/Roboto-ThinItalic.ttf +0 -0
- data/app/assets/icons/lesli/engine-admin.svg +0 -1
- data/app/assets/icons/lesli/engine-audit.svg +0 -1
- data/app/assets/icons/lesli/engine-babel.svg +0 -1
- data/app/assets/icons/lesli/engine-bell.svg +0 -1
- data/app/assets/icons/lesli/engine-books.svg +0 -1
- data/app/assets/icons/lesli/engine-calendar.svg +0 -1
- data/app/assets/icons/lesli/engine-dashboard.svg +0 -1
- data/app/assets/icons/lesli/engine-dispatcher.svg +0 -1
- data/app/assets/icons/lesli/engine-focus.svg +0 -1
- data/app/assets/icons/lesli/engine-kb.svg +0 -1
- data/app/assets/icons/lesli/engine-leaf.svg +0 -1
- data/app/assets/icons/lesli/engine-lesli.svg +0 -1
- data/app/assets/icons/lesli/engine-letter.svg +0 -1
- data/app/assets/icons/lesli/engine-mailer.svg +0 -1
- data/app/assets/icons/lesli/engine-one.svg +0 -1
- data/app/assets/icons/lesli/engine-profile.svg +0 -1
- data/app/assets/icons/lesli/engine-proposal.svg +0 -1
- data/app/assets/icons/lesli/engine-scraper.svg +0 -1
- data/app/assets/icons/lesli/engine-security.svg +0 -1
- data/app/assets/icons/lesli/engine-shared.svg +0 -1
- data/app/assets/icons/lesli/engine-shield.svg +0 -1
- data/app/assets/icons/lesli/engine-storage.svg +0 -1
- data/app/assets/icons/lesli/engine-support.svg +0 -1
- data/app/assets/icons/lesli/engine-talk.svg +0 -1
- data/app/assets/icons/lesli/engine-team.svg +0 -1
- data/app/assets/icons/lesli/engine-time.svg +0 -1
- data/app/assets/icons/lesli/locale-en.svg +0 -1
- data/app/assets/icons/lesli/locale-es.svg +0 -1
- data/app/assets/icons/lesli/locale-fr.svg +0 -1
- data/app/assets/icons/lesli/locale-it.svg +0 -1
- data/app/assets/icons/lesli/locale-pt.svg +0 -1
- data/app/assets/icons/readme.md +0 -10
- data/app/assets/javascripts/lesli/templates/application.js +0 -14
- data/app/assets/javascripts/lesli/templates/public.js +0 -14
- data/app/assets/stylesheets/lesli/templates/application.css +0 -2918
- data/app/assets/stylesheets/lesli/templates/public.css +0 -1
- data/app/controllers/lesli/interfaces/application/authorization.rb +0 -107
- data/app/controllers/lesli/interfaces/application/customization.rb +0 -46
- data/app/controllers/lesli/interfaces/application/logger.rb +0 -134
- data/app/controllers/lesli/interfaces/application/requester.rb +0 -84
- data/app/controllers/lesli/interfaces/application/responder.rb +0 -132
- data/app/controllers/lesli/interfaces/controllers/actions.rb +0 -250
- data/app/controllers/lesli/interfaces/controllers/activities.rb +0 -215
- data/app/controllers/lesli/interfaces/controllers/discussions.rb +0 -270
- data/app/controllers/lesli/interfaces/controllers/files.rb +0 -467
- data/app/controllers/lesli/interfaces/controllers/subscribers.rb +0 -234
- data/app/lib/lesli/system.rb +0 -110
- data/app/models/lesli/cloud_object/action.rb +0 -70
- data/app/models/lesli/cloud_object/activity.rb +0 -311
- data/app/models/lesli/cloud_object/custom_field.rb +0 -158
- data/app/models/lesli/cloud_object/discussion.rb +0 -219
- data/app/models/lesli/cloud_object/subscriber.rb +0 -186
- data/app/operators/lesli/descriptor_privilege_operator.rb +0 -75
- data/app/views/lesli/emails/devise_mailer/confirmation_instructions.html.erb +0 -23
- data/app/views/lesli/emails/devise_mailer/reset_password_instructions.html.erb +0 -23
- data/app/views/lesli/partials/_application-lesli-icons.html.erb +0 -1
- data/config/initializers/devise.rb +0 -336
- data/db/seed/development/users.rb +0 -52
- data/db/seed/production/accounts.rb +0 -50
- data/db/structure/00000000_people.json +0 -34
- data/db/structure/00000003_actions.json +0 -14
- data/db/structure/00000004_activities.json +0 -20
- data/db/structure/00000005_discussions.json +0 -8
- data/db/structure/00000006_files.json +0 -32
- data/db/structure/00000007_subscribers.json +0 -11
- data/db/structure/00000501_dashboards.json +0 -14
- data/db/structure/00000502_dashboard_components.json +0 -23
- data/db/tables/0010003410_create_user_activities.rb +0 -51
- data/db/tables/0010003710_create_user_codes.rb +0 -43
- data/db/tables/0010004110_create_user_tokens.rb +0 -45
- data/db/tables/0010005610_create_role_activities.rb +0 -50
- data/db/tables/0010009010_create_feedbacks.rb +0 -56
- data/lib/mailer_previews/devise_mailer_preview.rb +0 -49
- data/lib/scss/cloud-objects/discussion.scss +0 -80
- data/lib/scss/cloud-objects/file.scss +0 -138
- data/lib/scss/components/keypad.scss +0 -109
- data/lib/scss/elements/autocomplete.scss +0 -72
- data/lib/scss/elements/card.scss +0 -37
- data/lib/scss/elements/empty.scss +0 -43
- data/lib/scss/elements/file-uploader.scss +0 -74
- data/lib/scss/elements/gallery.scss +0 -98
- data/lib/scss/elements/input-tag.scss +0 -73
- data/lib/scss/elements/loading.scss +0 -63
- data/lib/scss/elements/map.scss +0 -107
- data/lib/scss/elements/navbar.scss +0 -115
- data/lib/scss/elements/table.scss +0 -118
- data/lib/scss/elements/toolbar.scss +0 -66
- data/lib/scss/fonts/families.scss +0 -47
- data/lib/scss/fonts/mdicons.scss +0 -82
- data/lib/scss/fonts/remixicons.scss +0 -2602
- data/lib/scss/helpers/display.scss +0 -44
- data/lib/scss/helpers/tooltip.scss +0 -91
- data/lib/scss/layouts/application-announcements.scss +0 -40
- data/lib/scss/layouts/application-component.scss +0 -39
- data/lib/scss/layouts/application-engines.scss +0 -125
- data/lib/scss/layouts/application-footer.scss +0 -102
- data/lib/scss/layouts/application-header.scss +0 -91
- data/lib/scss/layouts/application-navigation.scss +0 -79
- data/lib/scss/layouts/application-search.scss +0 -71
- data/lib/scss/layouts/application-sidebar.scss +0 -219
- data/lib/scss/overrides/notification.scss +0 -75
- data/lib/scss/overrides/sweetalert.scss +0 -106
- data/lib/scss/pages/devise-simple.scss +0 -89
- data/lib/scss/pages/devise.scss +0 -179
- data/lib/scss/pages/invites.scss +0 -81
- data/lib/scss/panels/panel-announcements.scss +0 -56
- data/lib/scss/panels/panel-notification.scss +0 -67
- data/lib/scss/panels/panel-profile.scss +0 -62
- data/lib/scss/panels/panel-support-ticket.scss +0 -56
- data/lib/scss/panels/panel-tasks.scss +0 -41
- data/lib/scss/settings/variables.scss +0 -148
- data/lib/scss/shared/workflow-status-progress.scss +0 -135
- data/lib/scss/templates/application.scss +0 -127
- data/lib/scss/templates/component.scss +0 -39
- data/lib/scss/templates/dashboards.scss +0 -53
- data/lib/scss/templates/empty.scss +0 -42
- data/lib/scss/templates/pdf.scss +0 -45
- data/lib/scss/templates/public.scss +0 -72
- data/lib/vue/application.js +0 -285
- data/lib/vue/cloudobjects/discussion/content.vue +0 -62
- data/lib/vue/cloudobjects/discussion/element.vue +0 -170
- data/lib/vue/cloudobjects/discussion/filters.vue +0 -108
- data/lib/vue/cloudobjects/discussion/new.vue +0 -134
- data/lib/vue/cloudobjects/discussion.vue +0 -99
- data/lib/vue/cloudobjects/stores/discussion.js +0 -212
- data/lib/vue/layouts/application-announcements.vue +0 -78
- data/lib/vue/layouts/application-component.vue +0 -38
- data/lib/vue/layouts/application-container.vue +0 -48
- data/lib/vue/layouts/application-engines.vue +0 -66
- data/lib/vue/layouts/application-footer.vue +0 -123
- data/lib/vue/layouts/application-header.vue +0 -252
- data/lib/vue/layouts/application-navbar.vue +0 -110
- data/lib/vue/layouts/application-search.vue +0 -86
- data/lib/vue/layouts/application-sidebar.vue +0 -63
- data/lib/vue/pages/errors/app.js +0 -32
- data/lib/vue/pages/invites/app.js +0 -76
- data/lib/vue/pages/mfas/application.js +0 -77
- data/lib/vue/pages/onboarding/application.js +0 -45
- data/lib/vue/pages/onboarding/components/address.vue +0 -120
- data/lib/vue/pages/onboarding/components/buttons.vue +0 -67
- data/lib/vue/pages/onboarding/components/contact.vue +0 -148
- data/lib/vue/pages/onboarding/components/date-time.vue +0 -265
- data/lib/vue/pages/onboarding/components/finish.vue +0 -62
- data/lib/vue/pages/onboarding/components/general-info.vue +0 -93
- data/lib/vue/pages/onboarding/components/indicators.vue +0 -78
- data/lib/vue/pages/onboarding/components/welcome.vue +0 -66
- data/lib/vue/pages/onboarding/show.vue +0 -67
- data/lib/vue/pages/onboarding/store.js +0 -165
- data/lib/vue/pages/otps/application.js +0 -90
- data/lib/vue/pages/passes/application.js +0 -80
- data/lib/vue/pages/websites/application.js +0 -34
- data/lib/vue/panels/panel-announcements.vue +0 -248
- data/lib/vue/panels/panel-bell-notifications.vue +0 -102
- data/lib/vue/panels/panel-files.vue +0 -281
- data/lib/vue/panels/panel-profile.vue +0 -76
- data/lib/vue/panels/panel-support-tickets.vue +0 -163
- data/lib/vue/panels/panel-tasks.vue +0 -124
- data/lib/vue/panels/stores/bell-notifications.js +0 -46
- data/lib/vue/panels/stores/support-tickets.js +0 -103
- data/lib/vue/public.js +0 -83
- data/lib/vue/refactor/shared/cloudobjects/action.vue +0 -193
- data/lib/vue/refactor/shared/cloudobjects/file/grid.vue +0 -215
- data/lib/vue/refactor/shared/cloudobjects/file/list.vue +0 -106
- data/lib/vue/refactor/shared/cloudobjects/file.vue +0 -145
- data/lib/vue/refactor/shared/workflows2/apps/actions/form.vue +0 -232
- data/lib/vue/refactor/shared/workflows2/apps/actions/forms/chatroom-form.vue +0 -103
- data/lib/vue/refactor/shared/workflows2/apps/actions/forms/cloud-object-clone-form.vue +0 -125
- data/lib/vue/refactor/shared/workflows2/apps/actions/forms/cloud-object-file-form.vue +0 -102
- data/lib/vue/refactor/shared/workflows2/apps/actions/forms/email-form.vue +0 -190
- data/lib/vue/refactor/shared/workflows2/apps/actions/forms/notification-form.vue +0 -124
- data/lib/vue/refactor/shared/workflows2/apps/actions/forms/send-cloud-object-file.vue +0 -170
- data/lib/vue/refactor/shared/workflows2/apps/actions/forms/task-form.vue +0 -258
- data/lib/vue/refactor/shared/workflows2/apps/actions/index.vue +0 -146
- data/lib/vue/refactor/shared/workflows2/apps/checks/form.vue +0 -200
- data/lib/vue/refactor/shared/workflows2/apps/checks/index.vue +0 -160
- data/lib/vue/refactor/shared/workflows2/apps/index.vue +0 -177
- data/lib/vue/refactor/shared/workflows2/apps/new.vue +0 -97
- data/lib/vue/refactor/shared/workflows2/apps/show.vue +0 -146
- data/lib/vue/refactor/shared/workflows2/components/associations.vue +0 -215
- data/lib/vue/refactor/shared/workflows2/components/chart.vue +0 -91
- data/lib/vue/refactor/shared/workflows2/components/workflow-form.vue +0 -466
- data/lib/vue/refactor/shared/workflows2/components/workflow-status-dropdown.vue +0 -129
- data/lib/vue/refactor/stores/cloudobjects/action.js +0 -181
- data/lib/vue/refactor/stores/cloudobjects/file.js +0 -205
- data/lib/vue/refactor/stores/entities/announcements.js +0 -75
- data/lib/vue/refactor/stores/entities/dashboard.js +0 -251
- data/lib/vue/refactor/stores/entities/workflow.js +0 -185
- data/lib/vue/refactor/stores/panels/announcements.js +0 -153
- data/lib/vue/refactor/stores/panels/notification.js +0 -114
- data/lib/vue/refactor/stores/panels/task.js +0 -66
- data/lib/vue/refactor/stores/panels/tickets.js +0 -129
- data/lib/vue/refactor/stores/role.js +0 -243
- data/lib/vue/refactor/stores/translations.json +0 -60
- data/lib/vue/refactor/stores/users.js +0 -98
- data/lib/vue/shared/dashboards/apps/edit.vue +0 -215
- data/lib/vue/shared/dashboards/apps/index.vue +0 -112
- data/lib/vue/shared/dashboards/apps/new.vue +0 -89
- data/lib/vue/shared/dashboards/apps/show.vue +0 -88
- data/lib/vue/shared/dashboards/components/form.vue +0 -246
- data/lib/vue/shared/services/firebase.js +0 -163
- data/lib/vue/shared/services/translator.js +0 -87
- data/lib/vue/shared/stores/command.js +0 -154
- data/lib/vue/shared/stores/dashboard.js +0 -253
- data/lib/vue/shared/stores/layout.js +0 -61
- data/lib/vue/shared/stores/systemController.js +0 -67
- data/lib/vue/shared/stores/users.js +0 -57
- data/lib/vue/stores/translations.json +0 -177
- data/lib/vue/translation.js +0 -45
- data/lib/webpack/base.js +0 -191
- data/lib/webpack/core.js +0 -93
- data/lib/webpack/engines.js +0 -167
- data/lib/webpack/root.js +0 -105
- data/lib/webpack/version.js +0 -78
- data/vendor/bulma/LICENSE +0 -21
- data/vendor/bulma/bulma.sass +0 -10
- data/vendor/bulma/css/bulma-rtl.css +0 -11851
- data/vendor/bulma/css/bulma-rtl.min.css +0 -1
- data/vendor/bulma/css/bulma.css +0 -11851
- data/vendor/bulma/css/bulma.min.css +0 -1
- data/vendor/bulma/sass/base/_all.sass +0 -6
- data/vendor/bulma/sass/base/animations.sass +0 -5
- data/vendor/bulma/sass/base/generic.sass +0 -145
- data/vendor/bulma/sass/base/helpers.sass +0 -1
- data/vendor/bulma/sass/base/minireset.sass +0 -79
- data/vendor/bulma/sass/components/_all.sass +0 -15
- data/vendor/bulma/sass/components/breadcrumb.sass +0 -77
- data/vendor/bulma/sass/components/card.sass +0 -103
- data/vendor/bulma/sass/components/dropdown.sass +0 -83
- data/vendor/bulma/sass/components/level.sass +0 -79
- data/vendor/bulma/sass/components/media.sass +0 -59
- data/vendor/bulma/sass/components/menu.sass +0 -59
- data/vendor/bulma/sass/components/message.sass +0 -101
- data/vendor/bulma/sass/components/modal.sass +0 -117
- data/vendor/bulma/sass/components/navbar.sass +0 -446
- data/vendor/bulma/sass/components/pagination.sass +0 -167
- data/vendor/bulma/sass/components/panel.sass +0 -121
- data/vendor/bulma/sass/components/tabs.sass +0 -176
- data/vendor/bulma/sass/elements/_all.sass +0 -16
- data/vendor/bulma/sass/elements/box.sass +0 -26
- data/vendor/bulma/sass/elements/button.sass +0 -357
- data/vendor/bulma/sass/elements/container.sass +0 -29
- data/vendor/bulma/sass/elements/content.sass +0 -162
- data/vendor/bulma/sass/elements/form.sass +0 -1
- data/vendor/bulma/sass/elements/icon.sass +0 -46
- data/vendor/bulma/sass/elements/image.sass +0 -73
- data/vendor/bulma/sass/elements/notification.sass +0 -52
- data/vendor/bulma/sass/elements/other.sass +0 -31
- data/vendor/bulma/sass/elements/progress.sass +0 -73
- data/vendor/bulma/sass/elements/table.sass +0 -134
- data/vendor/bulma/sass/elements/tag.sass +0 -140
- data/vendor/bulma/sass/elements/title.sass +0 -70
- data/vendor/bulma/sass/form/_all.sass +0 -9
- data/vendor/bulma/sass/form/checkbox-radio.sass +0 -22
- data/vendor/bulma/sass/form/file.sass +0 -184
- data/vendor/bulma/sass/form/input-textarea.sass +0 -66
- data/vendor/bulma/sass/form/select.sass +0 -88
- data/vendor/bulma/sass/form/shared.sass +0 -60
- data/vendor/bulma/sass/form/tools.sass +0 -215
- data/vendor/bulma/sass/grid/_all.sass +0 -5
- data/vendor/bulma/sass/grid/columns.sass +0 -513
- data/vendor/bulma/sass/grid/tiles.sass +0 -36
- data/vendor/bulma/sass/helpers/_all.sass +0 -12
- data/vendor/bulma/sass/helpers/color.sass +0 -39
- data/vendor/bulma/sass/helpers/flexbox.sass +0 -35
- data/vendor/bulma/sass/helpers/float.sass +0 -10
- data/vendor/bulma/sass/helpers/other.sass +0 -14
- data/vendor/bulma/sass/helpers/overflow.sass +0 -2
- data/vendor/bulma/sass/helpers/position.sass +0 -7
- data/vendor/bulma/sass/helpers/spacing.sass +0 -31
- data/vendor/bulma/sass/helpers/typography.sass +0 -103
- data/vendor/bulma/sass/helpers/visibility.sass +0 -122
- data/vendor/bulma/sass/layout/_all.sass +0 -6
- data/vendor/bulma/sass/layout/footer.sass +0 -11
- data/vendor/bulma/sass/layout/hero.sass +0 -153
- data/vendor/bulma/sass/layout/section.sass +0 -17
- data/vendor/bulma/sass/utilities/_all.sass +0 -9
- data/vendor/bulma/sass/utilities/animations.sass +0 -1
- data/vendor/bulma/sass/utilities/controls.sass +0 -49
- data/vendor/bulma/sass/utilities/derived-variables.sass +0 -114
- data/vendor/bulma/sass/utilities/extends.sass +0 -25
- data/vendor/bulma/sass/utilities/functions.sass +0 -135
- data/vendor/bulma/sass/utilities/initial-variables.sass +0 -79
- data/vendor/bulma/sass/utilities/mixins.sass +0 -303
- data/vendor/lesli-css/_index.scss +0 -34
- data/vendor/lesli-css/lesli.scss +0 -51
- data/vendor/lesli-css/license +0 -28
- data/vendor/lesli-css/src/base/fonts.scss +0 -50
- data/vendor/lesli-css/src/base/normalize.scss +0 -118
- data/vendor/lesli-css/src/components/blockquote.scss +0 -61
- data/vendor/lesli-css/src/components/columns.scss +0 -92
- data/vendor/lesli-css/src/components/container.scss +0 -47
- data/vendor/lesli-css/src/components/navigation.scss +0 -59
- data/vendor/lesli-css/src/functions/colors.scss +0 -184
- data/vendor/lesli-css/src/helpers/units.scss +0 -44
- data/vendor/lesli-css/src/mixins/breakpoint.scss +0 -184
- data/vendor/lesli-css/src/mixins/flex.scss +0 -80
- data/vendor/lesli-css/src/mixins/scrollbar.scss +0 -46
- data/vendor/lesli-css/src/settings/variables.scss +0 -26
- data/vendor/lesli-css/tests/base/normalize.spec.scss +0 -125
- data/vendor/lesli-css/tests/functions/colors.spec.scss +0 -117
- data/vendor/lesli-css/tests/mixins/breakpoint.spec.scss +0 -429
- data/vendor/lesli-css/tests/mixins/scrollbar.spec.scss +0 -82
- data/vendor/lesli-css/vendor/normalize.scss +0 -351
- data/vendor/remixicon/License +0 -201
- data/vendor/remixicon/fonts/remixicon.css +0 -2583
- /data/{vendor/lesli-css/src/components/grid.scss → app/assets/stylesheets/lesli/application.css} +0 -0
- /data/db/migrate/v1/{0010001010_create_lesli_account_details.rb → 0000110210_create_lesli_account_details.rb} +0 -0
- /data/db/structure/{00000008_custom_fields.json → 00000300_custom_fields.json} +0 -0
- /data/lib/assets/javascripts/lesli/{i18n.js → i18n_js} +0 -0
@@ -1,467 +0,0 @@
|
|
1
|
-
=begin
|
2
|
-
|
3
|
-
Lesli
|
4
|
-
|
5
|
-
Copyright (c) 2023, Lesli Technologies, S. A.
|
6
|
-
|
7
|
-
This program is free software: you can redistribute it and/or modify
|
8
|
-
it under the terms of the GNU General Public License as published by
|
9
|
-
the Free Software Foundation, either version 3 of the License, or
|
10
|
-
(at your option) any later version.
|
11
|
-
|
12
|
-
This program is distributed in the hope that it will be useful,
|
13
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
-
GNU General Public License for more details.
|
16
|
-
|
17
|
-
You should have received a copy of the GNU General Public License
|
18
|
-
along with this program. If not, see http://www.gnu.org/licenses/.
|
19
|
-
|
20
|
-
Lesli · Your Smart Business Assistant.
|
21
|
-
|
22
|
-
Made with ♥ by https://www.lesli.tech
|
23
|
-
Building a better future, one line of code at a time.
|
24
|
-
|
25
|
-
@contact hello@lesli.tech
|
26
|
-
@website https://lesli.tech
|
27
|
-
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
28
|
-
|
29
|
-
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
30
|
-
// ·
|
31
|
-
|
32
|
-
=end
|
33
|
-
|
34
|
-
module Lesli
|
35
|
-
module Interfaces
|
36
|
-
module Controllers
|
37
|
-
module Files
|
38
|
-
|
39
|
-
|
40
|
-
# @return [Json] Json that contains a list of all files related to a *cloud_object*
|
41
|
-
# @description Retrieves and returns all files associated to a *cloud_object*. The id of the
|
42
|
-
# *cloud_object* is within the *params* attribute. If the child class provides a block, the function is
|
43
|
-
# yielded sending the files as parameters. The block given *must* return the HTTP response
|
44
|
-
# @example
|
45
|
-
# # Executing this controller's action from javascript's frontend
|
46
|
-
# let ticket_id = 1;
|
47
|
-
# this.http.get(`127.0.0.1/help/tickets/${ticket_id}/files.json`);
|
48
|
-
def index
|
49
|
-
file_model = file_model() # If there is a custom file model, it must be returned in this method
|
50
|
-
cloud_object_model = file_model.cloud_object_model
|
51
|
-
account_model = cloud_object_model.reflect_on_association(:account).klass
|
52
|
-
|
53
|
-
#Get filters from http request
|
54
|
-
filters = params[:f]
|
55
|
-
|
56
|
-
#Get start and final date only if the request have filters
|
57
|
-
unless filters.blank?
|
58
|
-
file_type = filters[:file_type]
|
59
|
-
end
|
60
|
-
|
61
|
-
respond_to do |format|
|
62
|
-
format.json do
|
63
|
-
@files = file_model.where(
|
64
|
-
"#{cloud_object_model.table_name}_id".to_sym => params["#{cloud_object_model.name.demodulize.underscore}_id".to_sym]
|
65
|
-
)
|
66
|
-
|
67
|
-
# Filter results
|
68
|
-
unless file_type.blank?
|
69
|
-
@files = @files.where(file_type: file_type)
|
70
|
-
end
|
71
|
-
|
72
|
-
@files = @files
|
73
|
-
.order(id: :desc).map do |file|
|
74
|
-
file_attributes = file.attributes
|
75
|
-
file_attributes["user_creator_name"] = file.user_creator&.full_name
|
76
|
-
file_attributes["public_url"] = file.attachment_public.url if file.attachment_public
|
77
|
-
file_attributes["created_at_raw"] = file_attributes["created_at"]
|
78
|
-
file_attributes["created_at"] = LC::Date2.new(file_attributes["created_at"]).date_time.to_s
|
79
|
-
file_attributes["updated_at_raw"] = file_attributes["updated_at"]
|
80
|
-
file_attributes["updated_at"] = LC::Date2.new(file_attributes["updated_at"]).date_time.to_s
|
81
|
-
file_attributes["editable"] = file.is_editable_by?(current_user)
|
82
|
-
file_attributes
|
83
|
-
end
|
84
|
-
|
85
|
-
if block_given?
|
86
|
-
yield(@files)
|
87
|
-
else
|
88
|
-
respond_with_successful(@files)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
format.zip do
|
93
|
-
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
|
99
|
-
# @controller_action_param :attachment [File] The uploaded attachment
|
100
|
-
# @controller_action_param :name [String] The name to be displayed
|
101
|
-
# @controller_action_param :file_type [String] The file type of
|
102
|
-
# @return [Json] Json that contains wheter the creation of the file was successful or not.
|
103
|
-
# If it is not successful, it returs an error message
|
104
|
-
# @description Creates a new file associated to a *cloud_object*. The id of the
|
105
|
-
# *cloud_object* is within the *params* attribute. If the child class provides a block, the function is
|
106
|
-
# yielded sending the cloud_object as first param, and the file as second param.
|
107
|
-
# The block given *must* return the HTTP response
|
108
|
-
# @example
|
109
|
-
# # Executing this controller's action from javascript's frontend
|
110
|
-
# let ticket_id = 1;
|
111
|
-
# let data = {
|
112
|
-
# ticket_file: {
|
113
|
-
# file: FILE_CONTENT
|
114
|
-
# name: "contract_information"
|
115
|
-
# }
|
116
|
-
# };
|
117
|
-
# this.http.post(`127.0.0.1/help/tickets/${ticket_id}/files`, data);
|
118
|
-
def create
|
119
|
-
file_model = file_model() # If there is a custom file model, it must be returned in this method
|
120
|
-
cloud_object_model = file_model.cloud_object_model
|
121
|
-
|
122
|
-
set_cloud_object
|
123
|
-
new_file_params = file_params.merge(
|
124
|
-
user_creator: current_user,
|
125
|
-
cloud_object: @cloud_object
|
126
|
-
)
|
127
|
-
|
128
|
-
# Verifying the extension of the file. If it's valid, the block will be executed
|
129
|
-
decode_and_verify_file(new_file_params) do |verified_file_params|
|
130
|
-
file = file_model.new(verified_file_params)
|
131
|
-
|
132
|
-
if file.save
|
133
|
-
# Setting the file name in case it's blank and updating the file in case the filename changed
|
134
|
-
if file.name.blank?
|
135
|
-
file.update(
|
136
|
-
name: params["#{cloud_object_model.name.demodulize.underscore}_file".to_sym][:attachment].original_filename
|
137
|
-
)
|
138
|
-
else
|
139
|
-
file.update({})
|
140
|
-
end
|
141
|
-
|
142
|
-
cloud_object = file.cloud_object
|
143
|
-
|
144
|
-
# Setting up file uploader to upload in background
|
145
|
-
Files::AwsUploadJob.perform_later(file)
|
146
|
-
|
147
|
-
if block_given?
|
148
|
-
yield(cloud_object, file)
|
149
|
-
else
|
150
|
-
# Registering an activity in the cloud_object
|
151
|
-
cloud_object.activities.create(
|
152
|
-
user_creator: current_user,
|
153
|
-
category: "action_create_file",
|
154
|
-
description: "#{file.name} - #{file.attachment_identifier}"
|
155
|
-
)
|
156
|
-
|
157
|
-
# Returning the 200 HTTP response
|
158
|
-
respond_with_successful(file)
|
159
|
-
end
|
160
|
-
else
|
161
|
-
respond_with_error(file.errors.full_messages.to_sentence)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
# @controller_action_param :attachment [File] The uploaded attachment
|
167
|
-
# @controller_action_param :name [String] The name to be displayed
|
168
|
-
# @controller_action_param :file_type [String] The file type of
|
169
|
-
# @return [Json] Json that contains wheter the creation of the file was successful or not.
|
170
|
-
# If it is not successful, it returs an error message
|
171
|
-
# @description Updates an existing file associated to a *cloud_object*. The id of the
|
172
|
-
# *cloud_object* is within the *params* attribute. If the child class provides a block, the function is
|
173
|
-
# yielded sending the cloud_object as first param, and the file as second param.
|
174
|
-
# The block given *must* return the HTTP response
|
175
|
-
# @example
|
176
|
-
# # Executing this controller's action from javascript's frontend
|
177
|
-
# let ticket_id = 1;
|
178
|
-
# let data = {
|
179
|
-
# ticket_file: {
|
180
|
-
# file: FILE_CONTENT
|
181
|
-
# name: "contract_information"
|
182
|
-
# }
|
183
|
-
# };
|
184
|
-
# this.http.put(`127.0.0.1/help/tickets/${ticket_id}/files`, data);
|
185
|
-
def update
|
186
|
-
set_file
|
187
|
-
return respond_with_not_found unless @file
|
188
|
-
|
189
|
-
# Verifying the extension of the file. If it's valid, the block will be executed
|
190
|
-
decode_and_verify_file(file_params) do |verified_file_params|
|
191
|
-
if @file.update(verified_file_params)
|
192
|
-
|
193
|
-
# Setting up file uploader to upload in background
|
194
|
-
Files::AwsUploadJob.perform_later(@file)
|
195
|
-
|
196
|
-
if block_given?
|
197
|
-
yield(@cloud_object, @file)
|
198
|
-
else
|
199
|
-
# Registering an activity in the cloud_object
|
200
|
-
@file.cloud_object.activities.create(
|
201
|
-
user_creator: current_user,
|
202
|
-
category: "action_update_file",
|
203
|
-
description: "#{@file.name} - #{@file.attachment_identifier}"
|
204
|
-
)
|
205
|
-
|
206
|
-
# Returning the 200 HTTP response
|
207
|
-
respond_with_successful(@file)
|
208
|
-
end
|
209
|
-
else
|
210
|
-
respond_with_error(@file.errors.full_messages.to_sentence)
|
211
|
-
end
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
# @return [void]
|
216
|
-
# @description Prepares the files for download and redirects the explorer to a new window,
|
217
|
-
# where they can view/download the file. The id of the
|
218
|
-
# *cloud_object* and the id of the *file* are within the *params* attribute
|
219
|
-
# @example
|
220
|
-
# # Executing this controller's action from javascript's frontend
|
221
|
-
# let ticket_id = 1;
|
222
|
-
# let file_id = 5;
|
223
|
-
# this.http.get(`127.0.0.1/help/tickets/${ticket_id}/files/${file_id}`);
|
224
|
-
def show
|
225
|
-
set_file
|
226
|
-
return respond_with_not_found unless @file
|
227
|
-
|
228
|
-
file_model = file_model()
|
229
|
-
|
230
|
-
disposition = "inline"
|
231
|
-
disposition = "attachment" if params["download"]
|
232
|
-
|
233
|
-
begin
|
234
|
-
# Sending file using CarrierWave
|
235
|
-
if @file.attachment_s3.file
|
236
|
-
|
237
|
-
# We either get the file from AWS and serve it ourselves or provide a direct AWS link with expiration time
|
238
|
-
if @file.size_mb && @file.size_mb > file_model.size_threshold
|
239
|
-
redirect_to(@file.refresh_external_url, allow_other_host: true)
|
240
|
-
else
|
241
|
-
send_data(@file.attachment_s3.read, filename: @file.attachment_s3_identifier, disposition: disposition, stream: "true")
|
242
|
-
end
|
243
|
-
elsif @file.attachment_public.file
|
244
|
-
redirect_to(@file.attachment_public_url, allow_other_host: true)
|
245
|
-
else
|
246
|
-
send_data(@file.attachment.read, filename: @file.attachment_identifier, disposition: disposition, stream: "true")
|
247
|
-
end
|
248
|
-
rescue => exception
|
249
|
-
# Logging the failure to retrieve the file
|
250
|
-
@file.cloud_object.activities.create(
|
251
|
-
user_creator: current_user,
|
252
|
-
category: "action_not_found_file",
|
253
|
-
description: "#{@file.name} - #{@file.attachment_identifier}"
|
254
|
-
)
|
255
|
-
|
256
|
-
# Returning a generic image in response if the file is not found on storage
|
257
|
-
redirect_to("/assets/global/generic.png")
|
258
|
-
end
|
259
|
-
end
|
260
|
-
|
261
|
-
# @return [Json] A response that contains wheter the file was deleted or not.
|
262
|
-
# If it is not successful, it returns an error message
|
263
|
-
# @description Deletes a file from the database based on the id of the *cloud_object* and its own id. If a block is given,
|
264
|
-
# the function is yielded with no arguments after the file is destroyed
|
265
|
-
# @example
|
266
|
-
# # Executing this controller's action from javascript's frontend
|
267
|
-
# let ticket_id = 1;
|
268
|
-
# let file_id = 22;
|
269
|
-
# this.http.delete(`127.0.0.1/help/tickets/${ticket_id}/files/${file_id}`);
|
270
|
-
def destroy
|
271
|
-
set_file
|
272
|
-
return respond_with_not_found unless @file
|
273
|
-
return respond_with_unauthorized unless @file.is_editable_by?(current_user)
|
274
|
-
|
275
|
-
if @file.destroy
|
276
|
-
if block_given?
|
277
|
-
yield(@cloud_object, @file)
|
278
|
-
else
|
279
|
-
# Registering an activity in the cloud_object
|
280
|
-
@file.cloud_object.activities.create(
|
281
|
-
user_creator: current_user,
|
282
|
-
category: "action_destroy_file",
|
283
|
-
description: @file.name
|
284
|
-
)
|
285
|
-
|
286
|
-
respond_with_successful
|
287
|
-
end
|
288
|
-
else
|
289
|
-
respond_with_error(@file.errors.full_messages.to_sentence)
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
# @return [void]
|
294
|
-
# @description Returns a list of needed information in order to create a file.
|
295
|
-
# For the time being, it only returns a list of all file types
|
296
|
-
# @example
|
297
|
-
# # Executing this controller's action from javascript's frontend
|
298
|
-
# this.http.get('127.0.0.1/house/options/project/files')
|
299
|
-
def options
|
300
|
-
file_model = file_model() # If there is a custom file model, it must be returned in this method
|
301
|
-
respond_with_successful(file_model.options(@query))
|
302
|
-
end
|
303
|
-
|
304
|
-
# @return [void]
|
305
|
-
# @description Creates a zip file with all selected documents and sends it to the user. Note that files
|
306
|
-
# that don't belong to the current_user's account will be ignored. This method is deprecated, use
|
307
|
-
# the index method instead.
|
308
|
-
# @example
|
309
|
-
# # Executing this controller's action from javascript's frontend
|
310
|
-
# this.http.get('127.0.0.1/house/projects/1/resources/files-zip-download&ids=1,2,3,4');
|
311
|
-
def zip_download
|
312
|
-
|
313
|
-
end
|
314
|
-
|
315
|
-
protected
|
316
|
-
|
317
|
-
def decode_and_verify_file(file_params)
|
318
|
-
|
319
|
-
# Verifying the extension of the file
|
320
|
-
extension = ""
|
321
|
-
|
322
|
-
if file_params[:attachment]
|
323
|
-
|
324
|
-
# if attachment is a string, it means that it's a base64 encoded file
|
325
|
-
if file_params[:attachment].is_a? String
|
326
|
-
# Base64 images
|
327
|
-
|
328
|
-
if file_params[:name]
|
329
|
-
file_name = file_params[:name].downcase.gsub(" ","_")
|
330
|
-
elsif @file
|
331
|
-
file_name = @file.name.downcase.gsub(" ","_")
|
332
|
-
else
|
333
|
-
file_name = "file_#{DateTime.now.strftime("%Y%m%d%H%M%S")}"
|
334
|
-
end
|
335
|
-
|
336
|
-
img_from_base64 = Base64.decode64(file_params[:attachment])
|
337
|
-
|
338
|
-
begin
|
339
|
-
extension = /(png|jpg|jpeg|exif|jfif)/.match(img_from_base64[0,16].downcase)[0]
|
340
|
-
rescue
|
341
|
-
return respond_with_error(I18n.t("core.shared.messages_warning_files_extension_not_allowed"))
|
342
|
-
end
|
343
|
-
|
344
|
-
# Due a encode issue, jpeg images are sent as jfif
|
345
|
-
extension = "jpeg" if extension == "jfif"
|
346
|
-
extension = "png" if extension == "exif"
|
347
|
-
|
348
|
-
return respond_with_error(I18n.t("core.shared.messages_warning_files_extension_not_allowed")) unless file_model.verify_file_extension(extension)
|
349
|
-
|
350
|
-
file_path = Rails.root.join("public", "uploads", "tmp", file_name << '.' << extension)
|
351
|
-
File.open(file_path, 'wb') do|f|
|
352
|
-
f.write(img_from_base64)
|
353
|
-
end
|
354
|
-
|
355
|
-
file_params[:attachment] = File.open(Rails.root.join(file_path), "rb")
|
356
|
-
file_params[:size_mb] = file_params[:attachment].size.to_f / (1024*1024)
|
357
|
-
FileUtils.rm_rf(Rails.root.join(file_path))
|
358
|
-
else
|
359
|
-
extension = file_params[:attachment].original_filename
|
360
|
-
file_params[:size_mb] = file_params[:attachment].size.to_f / (1024*1024)
|
361
|
-
|
362
|
-
return respond_with_error(I18n.t("core.shared.messages_warning_files_extension_not_allowed")) unless file_model.verify_file_extension(extension)
|
363
|
-
end
|
364
|
-
|
365
|
-
file_params[:external_url] = nil
|
366
|
-
end
|
367
|
-
|
368
|
-
if block_given?
|
369
|
-
yield(file_params)
|
370
|
-
end
|
371
|
-
end
|
372
|
-
|
373
|
-
# @return [void]
|
374
|
-
# @description This function handles the zip download based on the type of attachment that the file has.
|
375
|
-
# If the attachment is local, it means that the file has not yet been uploaded to S3 and will be handled
|
376
|
-
# accordingly
|
377
|
-
# @example
|
378
|
-
# # Executing this controller's action from javascript's frontend
|
379
|
-
# this.http.get('127.0.0.1/house/options/project/1/files/zip&ids=1,2,3,4');
|
380
|
-
def handle_zip_download(files)
|
381
|
-
|
382
|
-
end
|
383
|
-
|
384
|
-
# @return [void]
|
385
|
-
# @descriptions Sets the variable @cloud_object based on the paremeters send in the URL. If no,
|
386
|
-
# cloud_object is found or it is not within the current_user's account, nil is used instead
|
387
|
-
# @example
|
388
|
-
# # Imagine you are inside CloudFocus::Task::FilesController
|
389
|
-
# puts @cloud_object # will display nil
|
390
|
-
# set_cloud_object
|
391
|
-
# puts @cloud_object # Will display an instance of CloudFocus::Task
|
392
|
-
def set_cloud_object
|
393
|
-
file_model = file_model() # If there is a custom file model, it must be returned in this method
|
394
|
-
cloud_object_model = file_model.cloud_object_model
|
395
|
-
account_model = cloud_object_model.reflect_on_association(:account).klass
|
396
|
-
|
397
|
-
@cloud_object = cloud_object_model.find_by(
|
398
|
-
id: params["#{cloud_object_model.name.demodulize.underscore}_id".to_sym],
|
399
|
-
"#{account_model.table_name}_id".to_sym => current_user.account.id
|
400
|
-
)
|
401
|
-
end
|
402
|
-
|
403
|
-
# @return [void]
|
404
|
-
# @description Sets the variable @file. The variable contains the file
|
405
|
-
# to be updated based on the id of the *cloud_object* and the id of the *file*. The variable
|
406
|
-
# will only be available if the file belongs to the current_user's account
|
407
|
-
# @example
|
408
|
-
# #suppose params[:ticket_id] = 1
|
409
|
-
# #suppose params[:id] = 44
|
410
|
-
# puts @file # will display nil
|
411
|
-
# set_file
|
412
|
-
# puts @file # will display an instance of CloudHelp:Ticket::File
|
413
|
-
def set_file
|
414
|
-
set_cloud_object
|
415
|
-
return unless @cloud_object
|
416
|
-
|
417
|
-
@file = @cloud_object.files.find_by(id: params[:id])
|
418
|
-
end
|
419
|
-
|
420
|
-
# @return [Parameters] Allowed parameters for the file
|
421
|
-
# @description Sanitizes the parameters received from an HTTP call to only allow the specified ones.
|
422
|
-
# Allowed params are _:name_, _:file_type_, _:attachment_
|
423
|
-
# @example
|
424
|
-
# # supose params contains {
|
425
|
-
# # "ticket_file": {
|
426
|
-
# # "id": 5,
|
427
|
-
# # "name": "User Contract",
|
428
|
-
# # "file": FILE_CONTENT,
|
429
|
-
# # "ticket_id": 55,
|
430
|
-
# # "word": false
|
431
|
-
# # }
|
432
|
-
# #}
|
433
|
-
# file_params = file_params
|
434
|
-
# puts file_params
|
435
|
-
# # will remove _id_ and _word_ fields and only print {
|
436
|
-
# # "ticket_file": {
|
437
|
-
# # "name": "User Contract",
|
438
|
-
# # "attachment": FILE_CONTENT
|
439
|
-
# # }
|
440
|
-
# #}
|
441
|
-
def file_params
|
442
|
-
file_model = file_model() # If there is a custom file model, it must be returned in this method
|
443
|
-
cloud_object_model = file_model.cloud_object_model
|
444
|
-
|
445
|
-
params.fetch(
|
446
|
-
"#{cloud_object_model.name.demodulize.underscore}_file".to_sym, {}
|
447
|
-
).permit(
|
448
|
-
:name,
|
449
|
-
:attachment,
|
450
|
-
:file_type
|
451
|
-
)
|
452
|
-
end
|
453
|
-
|
454
|
-
# @return [CloudObject::File] The file model that the controller will handle
|
455
|
-
# @descriptions Constantizes and returns the file model associated to this controller. This method
|
456
|
-
# can be overrided by the implementation in the child controller
|
457
|
-
# @example
|
458
|
-
# # Suppose you are inside CloudHelp::Ticket::FilesController
|
459
|
-
# puts file_model().new
|
460
|
-
# # This will display a new instance of CloudHelp::Ticket::File
|
461
|
-
def file_model
|
462
|
-
self.class.name.gsub("Controller","").singularize.constantize
|
463
|
-
end
|
464
|
-
end
|
465
|
-
end
|
466
|
-
end
|
467
|
-
end
|