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
@@ -0,0 +1,103 @@
|
|
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 · Ruby on Rails SaaS Development Framework.
|
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://www.lesli.tech
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
28
|
+
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
30
|
+
// ·
|
31
|
+
=end
|
32
|
+
|
33
|
+
module Lesli
|
34
|
+
module RequesterInterface
|
35
|
+
|
36
|
+
def set_path
|
37
|
+
@@engine_path = Lesli::Engine.routes.find_script_name({})
|
38
|
+
end
|
39
|
+
|
40
|
+
# Set the user language based on user_settings, session configuration or instance default locale
|
41
|
+
def set_locale
|
42
|
+
# get saved language in session, browser language or the default in config
|
43
|
+
# the session param is setted in settings controller through "get :language, to: "settings#language""
|
44
|
+
locale = session[:locale] || I18n.default_locale
|
45
|
+
|
46
|
+
# get user's preferred language
|
47
|
+
# IMPORTANT:
|
48
|
+
# Here it's not possible to use the methods provided by devise to check if user is
|
49
|
+
# authenticated "user_signed_in", due those methods redirects to the login controller
|
50
|
+
# if user is not authenticated; For some scenarios we need to have control of the behavior
|
51
|
+
# for not authenticated user requests, thats why here we go deeper and check if user is
|
52
|
+
# authenticated checking the warden storage
|
53
|
+
# locale = current_user.locale if warden.authenticated?
|
54
|
+
|
55
|
+
# language defined in the http header request
|
56
|
+
locale = request.headers["Require-Language"] unless request.headers["Require-Language"].blank?
|
57
|
+
|
58
|
+
# use default locale if requested language is not supported
|
59
|
+
locale = I18n.default_locale unless I18n.available_locales.include?(locale.to_sym)
|
60
|
+
|
61
|
+
# set the new locale
|
62
|
+
I18n.locale = locale
|
63
|
+
end
|
64
|
+
|
65
|
+
# Set default query params for:
|
66
|
+
def set_requester
|
67
|
+
@query = {
|
68
|
+
:search => params[:search] || nil,
|
69
|
+
:pagination => {
|
70
|
+
:perPage => (params[:perPage] ? params[:perPage].to_i : 12),
|
71
|
+
:page => (params[:page] ? params[:page].to_i : 1)
|
72
|
+
},
|
73
|
+
:order => {
|
74
|
+
:by => (params[:orderBy] || "id"),
|
75
|
+
:dir => (params[:order] || "desc")
|
76
|
+
}
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
def get_user_agent(as_string=true)
|
81
|
+
|
82
|
+
http_user_agent = request.env["HTTP_USER_AGENT"]
|
83
|
+
|
84
|
+
# parse user agent
|
85
|
+
user_agent = UserAgent.parse(http_user_agent)
|
86
|
+
|
87
|
+
user_agent_version = user_agent.version.to_a.first(2).join(".")
|
88
|
+
|
89
|
+
# return user agent as object
|
90
|
+
if as_string == false
|
91
|
+
return {
|
92
|
+
platform: user_agent.platform,
|
93
|
+
os: user_agent.os,
|
94
|
+
browser: user_agent.browser,
|
95
|
+
version: user_agent_version
|
96
|
+
}
|
97
|
+
end
|
98
|
+
|
99
|
+
# return user agent info as string
|
100
|
+
"#{user_agent.platform} #{user_agent.os} - #{user_agent.browser} #{user_agent_version}"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,127 @@
|
|
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
|
+
=end
|
32
|
+
|
33
|
+
module Lesli
|
34
|
+
module ResponderInterface
|
35
|
+
|
36
|
+
# Return an standard http 200 respond
|
37
|
+
def respond_as_successful(payload = nil)
|
38
|
+
payload
|
39
|
+
end
|
40
|
+
|
41
|
+
# Usage example
|
42
|
+
# tasks = Task
|
43
|
+
# .joins(:detail)
|
44
|
+
# .page(query[:pagination][:page])
|
45
|
+
# .per(query[:pagination][:perPage])
|
46
|
+
#
|
47
|
+
# respond_with_pagination(tasks)
|
48
|
+
#
|
49
|
+
# IMPORTANT: It is strictly necessary to use the pagination methods
|
50
|
+
# to make this work properly
|
51
|
+
def respond_as_pagination(payload)
|
52
|
+
{
|
53
|
+
pagination: {
|
54
|
+
page: payload.current_page,
|
55
|
+
pages: payload.total_pages,
|
56
|
+
total: payload.total_count,
|
57
|
+
results: payload.length
|
58
|
+
},
|
59
|
+
records: payload
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
def respond_with_successful(payload = nil)
|
67
|
+
respond_with_http(200, respond_as_successful(payload))
|
68
|
+
end
|
69
|
+
|
70
|
+
def respond_with_pagination(payload)
|
71
|
+
respond_with_http(200, respond_as_pagination(payload))
|
72
|
+
end
|
73
|
+
|
74
|
+
# JSON not found response
|
75
|
+
def respond_with_not_found
|
76
|
+
respond_with_http(404, {
|
77
|
+
message: I18n.t("core.shared.messages_danger_not_found")
|
78
|
+
})
|
79
|
+
end
|
80
|
+
|
81
|
+
# JSON not found response
|
82
|
+
def respond_with_unauthorized(detail = {})
|
83
|
+
error_object = {}
|
84
|
+
|
85
|
+
error_object[:message] = I18n.t("core.shared.view_text_unauthorized_request")
|
86
|
+
error_object[:detail] = detail if Rails.env == "development"
|
87
|
+
|
88
|
+
error_object[:role] = "( #{current_user.lesliroles.map(&:name).join(', ')} )" if (Rails.env == "development") && !current_user.blank?
|
89
|
+
|
90
|
+
respond_to do |format|
|
91
|
+
format.json { render status: 401, json: error_object.to_json }
|
92
|
+
format.html { redirect_to "/401" } if Rails.env == "production"
|
93
|
+
format.html { render status: 401, json: error_object.to_json }
|
94
|
+
# format.xlsx { redirect_to "/401" } if Rails.env == "production"
|
95
|
+
# format.xlsx { render status: 401, json: error_object.to_json }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# JSON failure response due users has to perform an action
|
100
|
+
# example: respond_with_action({ :redirect => "telephone_confirmation" })
|
101
|
+
def respond_with_action(action, message = "Action Required")
|
102
|
+
respond_with_http(490, { :message => message, :action => action })
|
103
|
+
end
|
104
|
+
|
105
|
+
# JSON failure response
|
106
|
+
def respond_with_error(message = "", details = [])
|
107
|
+
# Message should be a String
|
108
|
+
message = "" unless message.instance_of?(String)
|
109
|
+
|
110
|
+
# TODO:
|
111
|
+
# check if active error and then:
|
112
|
+
# message = error message to sentence
|
113
|
+
# details = error array of messages
|
114
|
+
# check another types of errors and parse respond according
|
115
|
+
respond_with_http(400, { :message => message, :details => details })
|
116
|
+
end
|
117
|
+
|
118
|
+
# Respond with an standard http message
|
119
|
+
def respond_with_http(status, payload)
|
120
|
+
unless payload.nil?
|
121
|
+
return render(:status => status, content_type: "application/json", json: payload.to_json)
|
122
|
+
end
|
123
|
+
|
124
|
+
render(:status => status, content_type: "application/json", json: "")
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/app/lib/date2.rb
CHANGED
@@ -1,200 +1,2 @@
|
|
1
|
-
|
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 · Ruby on Rails SaaS Development Framework.
|
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://www.lesli.tech
|
27
|
-
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
28
|
-
|
29
|
-
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
30
|
-
// ·
|
31
|
-
=end
|
32
|
-
|
33
|
-
class Date2
|
34
|
-
|
35
|
-
def initialize(datetime = Time.current, format = "%Y-%m-%d %H:%M:%S")
|
36
|
-
|
37
|
-
# NOTE: user should be able to change this through settings table
|
38
|
-
# get initial datetime configuration
|
39
|
-
config = Lesli.config.datetime
|
40
|
-
|
41
|
-
|
42
|
-
# NOTE: Do not modify settings here,
|
43
|
-
# if you need a different date format you should change it in the config file
|
44
|
-
# Check the docs for more information: /development/docs/rails-lib-time
|
45
|
-
|
46
|
-
# configuration example
|
47
|
-
# @settings = {
|
48
|
-
# :time_zone => config[:time_zone],
|
49
|
-
# :start_week_on => config[:start_week_on],
|
50
|
-
# :format => {
|
51
|
-
# :date => "%d.%m.%Y",
|
52
|
-
# :time => "%H:%M %p", # 12 hours datetime format
|
53
|
-
# :time => "%H:%M", # 24 hours datetime format (default)
|
54
|
-
# :date_time => "%d.%m.%Y %I:%M %p", # 12 hours datetime format
|
55
|
-
# :date_time => "%d.%m.%Y %H:%M", # 24 hours datetime format (default)
|
56
|
-
# :date_words => "%A, %B %d, %Y",
|
57
|
-
# :date_time_words => "%A, %B %d, %Y, %I:%M %p", # 12 hours datetime in words format
|
58
|
-
# :date_time_words => "%A, %B %d, %Y, %H:%M" # 24 hours datetime in words format (default)
|
59
|
-
# }
|
60
|
-
# }
|
61
|
-
|
62
|
-
@settings = {
|
63
|
-
:time_zone => config[:time_zone],
|
64
|
-
:start_week_on => config[:start_week_on],
|
65
|
-
:format => {
|
66
|
-
:date => "%d.%m.%Y",
|
67
|
-
:time => "%H:%M",
|
68
|
-
:date_time => config[:formats][:date_time],
|
69
|
-
:date_words => "%A, %B %d, %Y",
|
70
|
-
:date_time_words => "%A, %B %d, %Y, %I:%M %p", # 12 hours datetime in words format
|
71
|
-
:date_time_words => "%A, %B %d, %Y, %H:%M" # 24 hours datetime in words format (default)
|
72
|
-
}
|
73
|
-
}
|
74
|
-
|
75
|
-
|
76
|
-
# default date format
|
77
|
-
@format = set_format(:date)
|
78
|
-
|
79
|
-
|
80
|
-
# get a valid timezone
|
81
|
-
@zone = ActiveSupport::TimeZone.new(@settings[:time_zone])
|
82
|
-
|
83
|
-
|
84
|
-
# get datetime object from user params
|
85
|
-
@datetime = parse_initial_datetime(datetime, format).in_time_zone(@zone)
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
# set date format and return Date2 instance
|
90
|
-
def date
|
91
|
-
set_format(:date)
|
92
|
-
self
|
93
|
-
end
|
94
|
-
|
95
|
-
# set time format and return Date2 instance
|
96
|
-
def time
|
97
|
-
set_format(:time)
|
98
|
-
self
|
99
|
-
end
|
100
|
-
|
101
|
-
# set date_time format and return Date2 instance
|
102
|
-
def date_time
|
103
|
-
set_format(:date_time)
|
104
|
-
self
|
105
|
-
end
|
106
|
-
|
107
|
-
# set date_words format and return Date2 instance
|
108
|
-
def date_words
|
109
|
-
set_format(:date_words)
|
110
|
-
self
|
111
|
-
end
|
112
|
-
|
113
|
-
# set date_time_words format and return Date2 instance
|
114
|
-
def date_time_words
|
115
|
-
set_format(:date_time_words)
|
116
|
-
self
|
117
|
-
end
|
118
|
-
|
119
|
-
# return query string to get timestamps columns from database
|
120
|
-
def db_timestamps table=""
|
121
|
-
|
122
|
-
# avoid ambiguous columns
|
123
|
-
table = table.concat(".") if table != ""
|
124
|
-
|
125
|
-
# get right format for dates
|
126
|
-
format = self.db_format
|
127
|
-
|
128
|
-
"TO_CHAR(#{table}created_at at time zone 'utc' at time zone '#{@settings[:time_zone]}', '#{format}') as created_at_date, TO_CHAR(#{table}updated_at at time zone 'utc' at time zone '#{@settings[:time_zone]}', '#{format}') as updated_at_date"
|
129
|
-
|
130
|
-
end
|
131
|
-
|
132
|
-
# return query string to get a datetime column from database
|
133
|
-
def db_column column, table=""
|
134
|
-
|
135
|
-
# avoid ambiguous columns
|
136
|
-
table = table.concat(".") if table != ""
|
137
|
-
|
138
|
-
# get right format for dates
|
139
|
-
format = self.db_format
|
140
|
-
|
141
|
-
# compatibility for SQLite
|
142
|
-
if ActiveRecord::Base.connection.adapter_name == "SQLite"
|
143
|
-
return "strftime('#{format}', #{table}#{column}) as #{column}_string"
|
144
|
-
end
|
145
|
-
|
146
|
-
"TO_CHAR(#{table}#{column} at time zone 'utc' at time zone '#{@settings[:time_zone]}', '#{format}') as #{column}_string"
|
147
|
-
|
148
|
-
end
|
149
|
-
|
150
|
-
# convert a datetime object to string representation using defined format
|
151
|
-
def to_s
|
152
|
-
@datetime.strftime(@format)
|
153
|
-
end
|
154
|
-
|
155
|
-
def get
|
156
|
-
@datetime
|
157
|
-
end
|
158
|
-
|
159
|
-
private
|
160
|
-
|
161
|
-
|
162
|
-
# get datetime object or string datetime and return a datetime object
|
163
|
-
def parse_initial_datetime datetime, format
|
164
|
-
|
165
|
-
return datetime if datetime.is_a?(Time)
|
166
|
-
|
167
|
-
if datetime.is_a?(::String) and datetime.size == 25 and datetime[10] == "T"
|
168
|
-
return ::DateTime.iso8601(datetime)
|
169
|
-
end
|
170
|
-
|
171
|
-
return ::DateTime.strptime(datetime, format)
|
172
|
-
end
|
173
|
-
|
174
|
-
|
175
|
-
def set_format format
|
176
|
-
@format = @settings[:format][format || :date]
|
177
|
-
end
|
178
|
-
|
179
|
-
|
180
|
-
def db_format
|
181
|
-
format = @format
|
182
|
-
|
183
|
-
# SQLite format dates are the same of ruby format
|
184
|
-
return format if ActiveRecord::Base.connection.adapter_name == "SQLite"
|
185
|
-
|
186
|
-
# Convert Ruby to postgresql date format
|
187
|
-
format = format.gsub("%Y", "YYYY")
|
188
|
-
format = format.gsub("%m", "MM")
|
189
|
-
format = format.gsub("%d", "DD")
|
190
|
-
|
191
|
-
# Convert Ruby to postgresql time format
|
192
|
-
format = format.gsub("%H", "HH24") # 24 hours format
|
193
|
-
format = format.gsub("%I", "HH12") # 12 hours format
|
194
|
-
format = format.gsub("%p", "AM") # Meridian indicator (AM/PM)
|
195
|
-
format = format.gsub("%M", "MI")
|
196
|
-
|
197
|
-
format
|
198
|
-
end
|
199
|
-
|
1
|
+
class Date2 < LesliDate::Formatter
|
200
2
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Lesli
|
2
|
+
class Courier
|
3
|
+
|
4
|
+
# Store the module_name (e.g., :lesli_support as LesliSupport)
|
5
|
+
def initialize(module_name, on_error=nil)
|
6
|
+
@module_name = module_name.to_s.camelize
|
7
|
+
@on_error=on_error
|
8
|
+
end
|
9
|
+
|
10
|
+
# Dynamically determine the class to call (e.g., :ticket_service as TicketService)
|
11
|
+
def from(service_name, *args)
|
12
|
+
@service_params = args
|
13
|
+
@service_name = service_name.to_s.camelize
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
# Store the method name to call on the service (e.g., :index_with_deadline)
|
18
|
+
def call(method_name, *args)
|
19
|
+
@method_params = args
|
20
|
+
@method_name = method_name
|
21
|
+
self.execute
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# Execute the final call to the service, either with or without params
|
27
|
+
def execute
|
28
|
+
|
29
|
+
module_name = "#{@module_name}"
|
30
|
+
|
31
|
+
# Look up the module and class dynamically
|
32
|
+
return @on_error unless Object.const_defined?(module_name)
|
33
|
+
|
34
|
+
module_service_name = "#{@module_name}::#{@service_name}"
|
35
|
+
|
36
|
+
return @on_error unless Object.const_defined?(module_service_name)
|
37
|
+
|
38
|
+
# Create a reference of the module service object
|
39
|
+
module_service_class = module_service_name.constantize
|
40
|
+
|
41
|
+
# Instantiate the service class with or without arguments
|
42
|
+
module_service_instance = module_service_class.new(*@service_params.to_a)
|
43
|
+
|
44
|
+
# Check if the method is defined on the service instance
|
45
|
+
return @on_error unless module_service_instance.respond_to?(@method_name)
|
46
|
+
|
47
|
+
# Dynamically call the method on the service instance
|
48
|
+
module_service_instance.send(@method_name)
|
49
|
+
|
50
|
+
rescue
|
51
|
+
return @on_error
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -34,61 +34,31 @@ module Lesli
|
|
34
34
|
class ApplicationLesliMailer < ActionMailer::Base
|
35
35
|
|
36
36
|
# Set a dynamic template according to the engine that is sending the email
|
37
|
-
|
38
|
-
=begin
|
39
|
-
default(
|
40
|
-
|
41
|
-
from: -> {
|
42
|
-
|
43
|
-
instance = Rails.application.config.lesli.dig(:instance)
|
44
|
-
|
45
|
-
# add custom email name for emails sent from www.lesli.cloud
|
46
|
-
if instance[:code] == 'lesli_cloud'
|
47
|
-
return email_address_with_name(
|
48
|
-
Rails.configuration.lesli.dig(:env, :action_mailer, :default_options_from),
|
49
|
-
"Lesli"
|
50
|
-
)
|
51
|
-
end
|
52
|
-
|
53
|
-
Rails.configuration.lesli.dig(:env, :action_mailer, :default_options_from)
|
54
|
-
|
55
|
-
},
|
56
|
-
|
57
|
-
template_path: -> {
|
58
|
-
|
59
|
-
instance = Rails.application.config.lesli.dig(:instance)
|
60
|
-
|
61
|
-
# get class that is executing the mailer
|
62
|
-
module_info = self.class.name.split("::")
|
63
|
-
|
64
|
-
# mailers from engines
|
65
|
-
if module_info.length > 1
|
66
|
-
return "#{ instance[:code] }/emails/#{(module_info[0].underscore)}/#{ module_info[1].underscore }"
|
67
|
-
end
|
68
|
-
|
69
|
-
# mailers from core
|
70
|
-
return "#{ instance[:code] }/emails/#{ module_info[0].underscore }"
|
37
|
+
default(template_path: Lesli.config.mailer.dig(:templates))
|
71
38
|
|
72
|
-
}
|
73
|
-
|
74
|
-
)
|
75
|
-
=end
|
76
39
|
#after_action :log_mail_requests
|
77
40
|
|
78
|
-
#default(template_path: "lesli/emails/devise_mailer")
|
79
|
-
|
80
41
|
def initialize
|
81
42
|
|
82
43
|
super
|
83
44
|
|
84
|
-
|
85
|
-
|
86
|
-
@email = {}
|
45
|
+
@app = {}
|
87
46
|
@custom = {}
|
88
|
-
@params = {
|
89
|
-
|
90
|
-
}
|
47
|
+
@params = {}
|
48
|
+
end
|
91
49
|
|
50
|
+
def build_url(path, params = {})
|
51
|
+
default_url = Rails.application.config.action_mailer.default_url_options
|
52
|
+
host = default_url[:host].to_s.sub(/\Ahttps?:\/\//, "")
|
53
|
+
scheme = default_url[:protocol]&.delete(":") || "http"
|
54
|
+
|
55
|
+
URI::Generic.build(
|
56
|
+
scheme: scheme,
|
57
|
+
host: host,
|
58
|
+
port: default_url[:port],
|
59
|
+
path: path,
|
60
|
+
query: params.to_query.presence
|
61
|
+
).to_s
|
92
62
|
end
|
93
63
|
|
94
64
|
protected
|
@@ -97,6 +67,8 @@ module Lesli
|
|
97
67
|
|
98
68
|
@params = @params.merge(params)
|
99
69
|
|
70
|
+
build_app_from_params(params)
|
71
|
+
|
100
72
|
mail(
|
101
73
|
to: to,
|
102
74
|
subject: subject,
|
@@ -109,21 +81,20 @@ module Lesli
|
|
109
81
|
|
110
82
|
def build_app_from_params(params)
|
111
83
|
|
112
|
-
@app[:host] =
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
# return if params[:user].blank? || params[:user].class.name != "User"
|
84
|
+
@app[:host] = build_url("/")
|
85
|
+
@app[:company] = {
|
86
|
+
id: 0,
|
87
|
+
name: "",
|
88
|
+
tag_line: "",
|
89
|
+
}
|
120
90
|
|
121
|
-
|
122
|
-
# id: params[:user].account.id,
|
123
|
-
# name: params[:user].account.company_name,
|
124
|
-
# tag_line: params[:user].account.company_tag_line,
|
125
|
-
# }
|
91
|
+
return if params[:user].blank? || params[:user].class.name != "Lesli::User"
|
126
92
|
|
93
|
+
@app[:company] = {
|
94
|
+
id: params[:user].account.id,
|
95
|
+
name: params[:user].account.name,
|
96
|
+
#tag_line: params[:user].account.company_tag_line,
|
97
|
+
}
|
127
98
|
end
|
128
99
|
|
129
100
|
def build_customization_from_params(params)
|
@@ -174,6 +145,8 @@ module Lesli
|
|
174
145
|
}
|
175
146
|
end
|
176
147
|
|
148
|
+
if defined? LesliMailer
|
149
|
+
end
|
177
150
|
# TODO: Save template path and view used within the email
|
178
151
|
Account::Log.log_email(
|
179
152
|
"#{self.class.to_s}/#{self.action_name}",
|
@@ -1,23 +1,21 @@
|
|
1
1
|
module Lesli
|
2
2
|
class DeviseMailer < ApplicationLesliMailer
|
3
3
|
|
4
|
-
default(template_path: "lesli/emails/devise_mailer")
|
5
|
-
|
6
4
|
# Sends an email with instructions to allow the user reset the password
|
7
5
|
def reset_password_instructions(user, token, opts = {})
|
8
6
|
|
9
7
|
# defaults for new accounts/users
|
10
|
-
email_template = "reset_password_instructions"
|
8
|
+
email_template = "devise/reset_password_instructions"
|
11
9
|
email_subject = I18n.t("core.users/confirmations.mailer_email_verification")
|
12
10
|
|
13
11
|
# email parameters
|
14
12
|
params = {
|
15
|
-
url: "/password/edit
|
16
|
-
|
13
|
+
url: build_url("/password/edit", { reset_password_token: token}),
|
14
|
+
full_name: user.full_name
|
17
15
|
}
|
18
16
|
|
19
17
|
# send email
|
20
|
-
|
18
|
+
email(
|
21
19
|
params,
|
22
20
|
to: user.email,
|
23
21
|
subject: email_subject,
|
@@ -29,7 +27,7 @@ module Lesli
|
|
29
27
|
def confirmation_instructions(user, token, opts = {})
|
30
28
|
|
31
29
|
# defaults for new accounts/users
|
32
|
-
email_template = "confirmation_instructions"
|
30
|
+
email_template = "devise/confirmation_instructions"
|
33
31
|
email_subject = I18n.t("core.users/confirmations.mailer_email_verification")
|
34
32
|
|
35
33
|
# # custom email and subject if user is changin his email address
|
@@ -44,7 +42,7 @@ module Lesli
|
|
44
42
|
|
45
43
|
# email parameters
|
46
44
|
params = {
|
47
|
-
url: "/confirmation
|
45
|
+
url: build_url("/confirmation", { confirmation_token: token})
|
48
46
|
}
|
49
47
|
|
50
48
|
# send email
|
@@ -55,5 +53,15 @@ module Lesli
|
|
55
53
|
template_name: email_template
|
56
54
|
)
|
57
55
|
end
|
56
|
+
|
57
|
+
def welcome(user)
|
58
|
+
email_recipient = user.unconfirmed_email || user.email
|
59
|
+
email(
|
60
|
+
{ :user => user },
|
61
|
+
to: email_recipient,
|
62
|
+
subject: "test",
|
63
|
+
template_name: "devise/welcome"
|
64
|
+
)
|
65
|
+
end
|
58
66
|
end
|
59
67
|
end
|