lesli 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Rakefile +3 -0
- data/app/assets/config/lesli_manifest.js +53 -0
- data/app/assets/fonts/lesli/Domine/Domine-Bold.ttf +0 -0
- data/app/assets/fonts/lesli/Domine/Domine-Regular.ttf +0 -0
- data/app/assets/fonts/lesli/Domine/OFL.txt +95 -0
- 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 +1 -0
- data/app/assets/fonts/lesli/Remix/remixicon.svg +7633 -0
- data/app/assets/fonts/lesli/Remix/remixicon.symbol.svg +11 -0
- 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 +202 -0
- 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/cloud-admin.svg +1 -0
- data/app/assets/icons/lesli/cloud-audit.svg +1 -0
- data/app/assets/icons/lesli/cloud-babel.svg +1 -0
- data/app/assets/icons/lesli/cloud-bell.svg +1 -0
- data/app/assets/icons/lesli/cloud-books.svg +1 -0
- data/app/assets/icons/lesli/cloud-development.svg +1 -0
- data/app/assets/icons/lesli/cloud-dispatcher.svg +1 -0
- data/app/assets/icons/lesli/cloud-driver.svg +1 -0
- data/app/assets/icons/lesli/cloud-focus.svg +1 -0
- data/app/assets/icons/lesli/cloud-help.svg +1 -0
- data/app/assets/icons/lesli/cloud-kb.svg +1 -0
- data/app/assets/icons/lesli/cloud-leaf.svg +1 -0
- data/app/assets/icons/lesli/cloud-lesli.svg +1 -0
- data/app/assets/icons/lesli/cloud-mailer.svg +1 -0
- data/app/assets/icons/lesli/cloud-one.svg +1 -0
- data/app/assets/icons/lesli/cloud-profile.svg +1 -0
- data/app/assets/icons/lesli/cloud-proposal.svg +1 -0
- data/app/assets/icons/lesli/cloud-scraper.svg +1 -0
- data/app/assets/icons/lesli/cloud-shared.svg +1 -0
- data/app/assets/icons/lesli/cloud-storage.svg +1 -0
- data/app/assets/icons/lesli/cloud-talk.svg +1 -0
- data/app/assets/icons/lesli/cloud-team.svg +1 -0
- data/app/assets/icons/lesli/cloud-time.svg +1 -0
- data/app/assets/icons/lesli/cloud-vault.svg +1 -0
- data/app/assets/icons/lesli/cloud-word.svg +1 -0
- data/app/assets/icons/lesli/icon-module.svg +1 -0
- data/app/assets/icons/lesli/logo-android.svg +1 -0
- data/app/assets/icons/lesli/logo-bulma.svg +1 -0
- data/app/assets/icons/lesli/logo-ios.svg +1 -0
- data/app/assets/icons/lesli/logo-linux.svg +1 -0
- data/app/assets/icons/lesli/logo-mac.svg +1 -0
- data/app/assets/icons/lesli/logo-module.svg +1 -0
- data/app/assets/icons/lesli/logo-postgresql.svg +1 -0
- data/app/assets/icons/lesli/logo-rails.svg +1 -0
- data/app/assets/icons/lesli/logo-ruby.svg +1 -0
- data/app/assets/icons/lesli/logo-sass.svg +1 -0
- data/app/assets/icons/lesli/logo-vue.svg +1 -0
- data/app/assets/icons/lesli/logo-web.svg +1 -0
- data/app/assets/icons/lesli/logo-windows.svg +1 -0
- data/app/assets/icons/readme.md +10 -0
- data/app/assets/images/lesli/brand/app-auth.svg +9 -0
- data/app/assets/images/lesli/brand/app-icon.svg +42 -0
- data/app/assets/images/lesli/brand/app-logo.svg +4 -0
- data/app/assets/images/lesli/brand/favicon.png +0 -0
- data/app/assets/images/lesli/brand/favicon.svg +61 -0
- data/app/assets/images/lesli/brand/login-background.jpg +0 -0
- data/app/assets/javascripts/lesli/users/sessions.js +786 -0
- data/app/assets/stylesheets/lesli/users/confirmations.scss +34 -0
- data/app/assets/stylesheets/lesli/users/devise.scss +32 -0
- data/app/assets/stylesheets/lesli/users/oauth.scss +34 -0
- data/app/assets/stylesheets/lesli/users/passwords.scss +34 -0
- data/app/assets/stylesheets/lesli/users/registrations.scss +34 -0
- data/app/assets/stylesheets/lesli/users/sessions.scss +38 -0
- data/app/controllers/lesli/application_controller.rb +108 -0
- data/app/controllers/lesli/application_devise_controller.rb +54 -0
- data/app/controllers/lesli/application_lesli_controller.rb +61 -0
- data/app/controllers/lesli/interfaces/application/authorization.rb +107 -0
- data/app/controllers/lesli/interfaces/application/customization.rb +46 -0
- data/app/controllers/lesli/interfaces/application/logger.rb +133 -0
- data/app/controllers/lesli/interfaces/application/requester.rb +84 -0
- data/app/controllers/lesli/interfaces/application/responder.rb +132 -0
- data/app/controllers/lesli/profiles_controller.rb +60 -0
- data/app/controllers/users/confirmations_controller.rb +30 -0
- data/app/controllers/users/omniauth_callbacks_controller.rb +30 -0
- data/app/controllers/users/passwords_controller.rb +34 -0
- data/app/controllers/users/registrations_controller.rb +62 -0
- data/app/controllers/users/sessions_controller.rb +142 -0
- data/app/controllers/users/unlocks_controller.rb +30 -0
- data/app/helpers/lesli/assets_helper.rb +92 -0
- data/app/helpers/lesli/customization_helper.rb +84 -0
- data/app/helpers/lesli/general_helper.rb +83 -0
- data/app/helpers/lesli/navigation_helper.rb +349 -0
- data/app/helpers/lesli/profiles_helper.rb +4 -0
- data/app/helpers/lesli/system_helper.rb +57 -0
- data/app/lib/date2.rb +192 -0
- data/app/lib/lesli/system.rb +80 -0
- data/app/models/concerns/account_engines.rb +249 -0
- data/app/models/concerns/user_activities.rb +163 -0
- data/app/models/concerns/user_extensions.rb +129 -0
- data/app/models/concerns/user_guard.rb +278 -0
- data/app/models/concerns/user_polyfill.rb +134 -0
- data/app/models/lesli/account/log.rb +57 -0
- data/app/models/lesli/account.rb +76 -0
- data/app/models/lesli/application_lesli_record.rb +37 -0
- data/app/models/lesli/profile.rb +4 -0
- data/app/models/lesli/system_controller/action.rb +37 -0
- data/app/models/lesli/system_controller.rb +37 -0
- data/app/models/lesli/user/agent.rb +37 -0
- data/app/models/lesli/user/log.rb +38 -0
- data/app/models/lesli/user/request.rb +37 -0
- data/app/models/lesli/user/session.rb +105 -0
- data/app/models/lesli/user.rb +162 -0
- data/app/services/lesli/application_lesli_service.rb +168 -0
- data/app/services/lesli/user/session_service.rb +62 -0
- data/app/validators/lesli/application_lesli_validator.rb +67 -0
- data/app/validators/lesli/users_validator.rb +217 -0
- data/app/views/devise/confirmations/new.html.erb +16 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/email_changed.html.erb +7 -0
- data/app/views/devise/mailer/password_change.html.erb +3 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise/passwords/edit.html.erb +25 -0
- data/app/views/devise/passwords/new.html.erb +16 -0
- data/app/views/devise/registrations/edit.html.erb +43 -0
- data/app/views/devise/registrations/new.html.erb +29 -0
- data/app/views/devise/sessions/new.html.erb +178 -0
- data/app/views/devise/shared/_error_messages.html.erb +15 -0
- data/app/views/devise/shared/_links.html.erb +25 -0
- data/app/views/devise/unlocks/new.html.erb +16 -0
- data/app/views/lesli/devise/sessions/_form.html.erb +17 -0
- data/app/views/lesli/devise/sessions/_session.html.erb +2 -0
- data/app/views/lesli/devise/sessions/edit.html.erb +10 -0
- data/app/views/lesli/devise/sessions/index.html.erb +14 -0
- data/app/views/lesli/devise/sessions/new.html.erb +9 -0
- data/app/views/lesli/devise/sessions/show.html.erb +10 -0
- data/app/views/lesli/layouts/application-devise.html.erb +58 -0
- data/app/views/lesli/layouts/application-lesli.html.erb +57 -0
- data/app/views/lesli/layouts/application-public.html.erb +59 -0
- data/app/views/lesli/partials/_application-analytics.html.erb +71 -0
- data/app/views/lesli/partials/_application-data.html.erb +102 -0
- data/app/views/lesli/partials/_application-head.html.erb +56 -0
- data/app/views/lesli/partials/_application-lesli-chatbox.html.erb +35 -0
- data/app/views/lesli/partials/_application-lesli-content.html.erb +35 -0
- data/app/views/lesli/partials/_application-lesli-engines.html.erb +83 -0
- data/app/views/lesli/partials/_application-lesli-footer.html.erb +82 -0
- data/app/views/lesli/partials/_application-lesli-header.html.erb +79 -0
- data/app/views/lesli/partials/_application-lesli-icons.html.erb +1 -0
- data/app/views/lesli/partials/_application-lesli-javascript.html.erb +57 -0
- data/app/views/lesli/partials/_application-lesli-navigation.html.erb +52 -0
- data/app/views/lesli/partials/_application-lesli-notices.html.erb +43 -0
- data/app/views/lesli/partials/_application-lesli-panels.html.erb +58 -0
- data/app/views/lesli/partials/_application-lesli-scss.html.erb +60 -0
- data/app/views/lesli/partials/_application-lesli-sidebar.html.erb +50 -0
- data/app/views/lesli/partials/_application-public-footer.html.erb +51 -0
- data/app/views/lesli/partials/_application-public-javascript.html.erb +51 -0
- data/app/views/lesli/partials/_application-public-scss.html.erb +35 -0
- data/app/views/lesli/profiles/_form.html.erb +17 -0
- data/app/views/lesli/profiles/_profile.html.erb +2 -0
- data/app/views/lesli/profiles/edit.html.erb +10 -0
- data/app/views/lesli/profiles/index.html.erb +14 -0
- data/app/views/lesli/profiles/new.html.erb +9 -0
- data/app/views/lesli/profiles/show.html.erb +10 -0
- data/app/views/lesli/wrappers/_application-auth.html.erb +65 -0
- data/config/initializers/devise.rb +334 -0
- data/config/initializers/lesli_defaults.rb +100 -0
- data/config/locales/devise.en.yml +65 -0
- data/config/routes.rb +52 -0
- data/db/migrate/v1.0/0010000110_create_lesli_accounts.rb +70 -0
- data/db/migrate/v1.0/0010000210_create_lesli_roles.rb +59 -0
- data/db/migrate/v1.0/0010000310_create_lesli_users.rb +97 -0
- data/db/migrate/v1.0/0010000610_create_lesli_system_controllers.rb +44 -0
- data/db/migrate/v1.0/0010000710_create_lesli_system_controller_actions.rb +43 -0
- data/db/migrate/v1.0/0010001210_create_lesli_account_activities.rb +50 -0
- data/db/migrate/v1.0/0010001310_create_lesli_account_logs.rb +45 -0
- data/db/migrate/v1.0/0010003210_create_lesli_user_sessions.rb +51 -0
- data/db/migrate/v1.0/0010003310_create_lesli_user_requests.rb +48 -0
- data/db/migrate/v1.0/0010003610_create_lesli_user_logs.rb +45 -0
- data/db/migrate/v1.0/0010004010_create_lesli_user_agents.rb +46 -0
- data/db/seed/development/accounts.rb +47 -0
- data/db/seed/development/users.rb +53 -0
- data/db/seed/development.rb +35 -0
- data/db/seed/production.rb +35 -0
- data/db/seed/test.rb +35 -0
- data/db/seed/tools.rb +60 -0
- data/db/seeds.rb +64 -0
- data/db/structure/00000000_locations.json +32 -0
- data/db/structure/00000000_people.json +34 -0
- data/db/structure/00000003_actions.json +14 -0
- data/db/structure/00000004_activities.json +20 -0
- data/db/structure/00000005_discussions.json +8 -0
- data/db/structure/00000006_files.json +32 -0
- data/db/structure/00000007_subscribers.json +11 -0
- data/db/structure/00000008_custom_fields.json +8 -0
- data/db/structure/00000201_workflows.json +17 -0
- data/db/structure/00000202_workflow_statuses.json +24 -0
- data/db/structure/00000203_workflow_associations.json +14 -0
- data/db/structure/00000204_workflow_actions.json +39 -0
- data/db/structure/00000205_workflow_checks.json +27 -0
- data/db/structure/00000301_custom_fields.json +38 -0
- data/db/structure/00000401_custom_validations.json +14 -0
- data/db/structure/00000402_custom_validation_rules.json +23 -0
- data/db/structure/00000403_custom_validation_fields.json +14 -0
- data/db/structure/00000501_dashboards.json +14 -0
- data/db/structure/00000502_dashboard_components.json +23 -0
- data/db/tables/0010001010_create_account_settings.rb +42 -0
- data/db/tables/0010001110_create_account_locations.rb +64 -0
- data/db/tables/0010001410_create_account_files.rb +52 -0
- data/db/tables/0010001510_create_account_currencies.rb +48 -0
- data/db/tables/0010001610_create_account_currency_exchange_rates.rb +54 -0
- data/db/tables/0010003010_create_user_details.rb +49 -0
- data/db/tables/0010003110_create_user_settings.rb +44 -0
- data/db/tables/0010003410_create_user_activities.rb +51 -0
- data/db/tables/0010003510_create_user_roles.rb +43 -0
- data/db/tables/0010003710_create_user_codes.rb +43 -0
- data/db/tables/0010003810_create_user_shortcuts.rb +46 -0
- data/db/tables/0010004110_create_user_tokens.rb +45 -0
- data/db/tables/0010005010_create_descriptors.rb +45 -0
- data/db/tables/0010005110_create_descriptor_privileges.rb +44 -0
- data/db/tables/0010005210_create_descriptor_activities.rb +51 -0
- data/db/tables/0010005510_create_role_descriptors.rb +44 -0
- data/db/tables/0010005610_create_role_activities.rb +50 -0
- data/db/tables/0010005710_create_role_privileges.rb +45 -0
- data/db/tables/0010009010_create_feedbacks.rb +56 -0
- data/lib/assets/javascripts/lesli/i18n.js +1095 -0
- data/lib/assets/javascripts/lesli/translations.js +15 -0
- data/lib/lesli/configuration.rb +45 -0
- data/lib/lesli/engine.rb +62 -0
- data/lib/lesli/version.rb +34 -0
- data/lib/lesli.rb +6 -0
- data/lib/sass/lesli/bulma/loader.scss +84 -0
- data/lib/sass/lesli/cloud-objects/discussion.scss +77 -0
- data/lib/sass/lesli/cloud-objects/file.scss +138 -0
- data/lib/sass/lesli/components/editor-richtext.scss +78 -0
- data/lib/sass/lesli/components/keypad.scss +109 -0
- data/lib/sass/lesli/devise/confirmations.scss.erb +75 -0
- data/lib/sass/lesli/devise/passwords.scss.erb +86 -0
- data/lib/sass/lesli/devise/registrations.scss.erb +50 -0
- data/lib/sass/lesli/devise/sessions.scss +36 -0
- data/lib/sass/lesli/elements/autocomplete.scss +72 -0
- data/lib/sass/lesli/elements/avatar.scss +48 -0
- data/lib/sass/lesli/elements/calendar.scss +47 -0
- data/lib/sass/lesli/elements/card.scss +37 -0
- data/lib/sass/lesli/elements/content.scss +37 -0
- data/lib/sass/lesli/elements/empty.scss +43 -0
- data/lib/sass/lesli/elements/file-uploader.scss +74 -0
- data/lib/sass/lesli/elements/form.scss +43 -0
- data/lib/sass/lesli/elements/gallery.scss +98 -0
- data/lib/sass/lesli/elements/header.scss +44 -0
- data/lib/sass/lesli/elements/input-tag.scss +73 -0
- data/lib/sass/lesli/elements/loading.scss +63 -0
- data/lib/sass/lesli/elements/map.scss +107 -0
- data/lib/sass/lesli/elements/msg.scss +77 -0
- data/lib/sass/lesli/elements/navbar.scss +115 -0
- data/lib/sass/lesli/elements/panel.scss +65 -0
- data/lib/sass/lesli/elements/tab.scss +48 -0
- data/lib/sass/lesli/elements/table.scss +118 -0
- data/lib/sass/lesli/elements/toggle.scss +102 -0
- data/lib/sass/lesli/elements/toolbar.scss +66 -0
- data/lib/sass/lesli/fonts/families.scss +47 -0
- data/lib/sass/lesli/fonts/mdicons.scss +84 -0
- data/lib/sass/lesli/fonts/remixicons.scss +2602 -0
- data/lib/sass/lesli/helpers/display.scss +44 -0
- data/lib/sass/lesli/helpers/tooltip.scss +91 -0
- data/lib/sass/lesli/layouts/application-announcements.scss +40 -0
- data/lib/sass/lesli/layouts/application-component.scss +50 -0
- data/lib/sass/lesli/layouts/application-engines.scss +155 -0
- data/lib/sass/lesli/layouts/application-footer.scss +102 -0
- data/lib/sass/lesli/layouts/application-header.scss +152 -0
- data/lib/sass/lesli/layouts/application-navbar.scss +61 -0
- data/lib/sass/lesli/layouts/application-search.scss +71 -0
- data/lib/sass/lesli/layouts/application-sidebar.scss +219 -0
- data/lib/sass/lesli/overrides/sweetalert.scss +106 -0
- data/lib/sass/lesli/pages/dashboards.scss +57 -0
- data/lib/sass/lesli/pages/invites.scss +81 -0
- data/lib/sass/lesli/pages/mfas.scss +36 -0
- data/lib/sass/lesli/pages/otps.scss +36 -0
- data/lib/sass/lesli/pages/passes.scss +35 -0
- data/lib/sass/lesli/panels/panel-announcements.scss +56 -0
- data/lib/sass/lesli/panels/panel-notification.scss +67 -0
- data/lib/sass/lesli/panels/panel-profile.scss +62 -0
- data/lib/sass/lesli/panels/panel-tasks.scss +41 -0
- data/lib/sass/lesli/panels/panel-ticket.scss +57 -0
- data/lib/sass/lesli/settings/variables.scss +148 -0
- data/lib/sass/lesli/shared/workflow-status-progress.scss +135 -0
- data/lib/sass/lesli/templates/application.scss +141 -0
- data/lib/sass/lesli/templates/dashboards.scss +32 -0
- data/lib/sass/lesli/templates/devise.scss +185 -0
- data/lib/sass/lesli/templates/empty.scss +42 -0
- data/lib/sass/lesli/templates/pdf.scss +45 -0
- data/lib/sass/lesli/templates/public.scss +71 -0
- data/lib/tasks/db.rb +75 -0
- data/lib/tasks/lesli/controllers.rake +103 -0
- data/lib/tasks/lesli_tasks.rake +23 -0
- data/lib/vue/application.js +269 -0
- data/lib/vue/apps/cloudobjects/action.vue +193 -0
- data/lib/vue/apps/cloudobjects/discussion/content.vue +60 -0
- data/lib/vue/apps/cloudobjects/discussion/element.vue +132 -0
- data/lib/vue/apps/cloudobjects/discussion/filters.vue +108 -0
- data/lib/vue/apps/cloudobjects/discussion/new.vue +130 -0
- data/lib/vue/apps/cloudobjects/discussion.vue +98 -0
- data/lib/vue/apps/cloudobjects/file/grid.vue +215 -0
- data/lib/vue/apps/cloudobjects/file/list.vue +106 -0
- data/lib/vue/apps/cloudobjects/file.vue +145 -0
- data/lib/vue/apps/dashboards/apps/edit.vue +105 -0
- data/lib/vue/apps/dashboards/apps/index.vue +114 -0
- data/lib/vue/apps/dashboards/apps/new.vue +89 -0
- data/lib/vue/apps/dashboards/apps/show.vue +76 -0
- data/lib/vue/apps/dashboards/components/form.vue +267 -0
- data/lib/vue/apps/dashboards/components/preview.vue +172 -0
- data/lib/vue/apps/workflows2/apps/actions/form.vue +232 -0
- data/lib/vue/apps/workflows2/apps/actions/forms/chatroom-form.vue +103 -0
- data/lib/vue/apps/workflows2/apps/actions/forms/cloud-object-clone-form.vue +125 -0
- data/lib/vue/apps/workflows2/apps/actions/forms/cloud-object-file-form.vue +102 -0
- data/lib/vue/apps/workflows2/apps/actions/forms/email-form.vue +190 -0
- data/lib/vue/apps/workflows2/apps/actions/forms/notification-form.vue +124 -0
- data/lib/vue/apps/workflows2/apps/actions/forms/send-cloud-object-file.vue +170 -0
- data/lib/vue/apps/workflows2/apps/actions/forms/task-form.vue +258 -0
- data/lib/vue/apps/workflows2/apps/actions/index.vue +146 -0
- data/lib/vue/apps/workflows2/apps/checks/form.vue +200 -0
- data/lib/vue/apps/workflows2/apps/checks/index.vue +160 -0
- data/lib/vue/apps/workflows2/apps/index.vue +177 -0
- data/lib/vue/apps/workflows2/apps/new.vue +97 -0
- data/lib/vue/apps/workflows2/apps/show.vue +146 -0
- data/lib/vue/apps/workflows2/components/associations.vue +215 -0
- data/lib/vue/apps/workflows2/components/chart.vue +91 -0
- data/lib/vue/apps/workflows2/components/workflow-form.vue +466 -0
- data/lib/vue/apps/workflows2/components/workflow-status-dropdown.vue +129 -0
- data/lib/vue/devise/confirmations.js +33 -0
- data/lib/vue/devise/passwords.js +137 -0
- data/lib/vue/devise/registrations.js +162 -0
- data/lib/vue/devise/sessions.js +143 -0
- data/lib/vue/layouts/application-announcements.vue +78 -0
- data/lib/vue/layouts/application-engines.vue +66 -0
- data/lib/vue/layouts/application-footer.vue +123 -0
- data/lib/vue/layouts/application-header.vue +213 -0
- data/lib/vue/layouts/application-navbar.vue +110 -0
- data/lib/vue/layouts/application-search.vue +86 -0
- data/lib/vue/layouts/application-sidebar.vue +63 -0
- data/lib/vue/layouts/dashboard-component.vue +62 -0
- data/lib/vue/pages/errors/app.js +32 -0
- data/lib/vue/pages/invites/app.js +76 -0
- data/lib/vue/pages/mfas/application.js +77 -0
- data/lib/vue/pages/onboarding/application.js +45 -0
- data/lib/vue/pages/onboarding/components/address.vue +120 -0
- data/lib/vue/pages/onboarding/components/buttons.vue +67 -0
- data/lib/vue/pages/onboarding/components/contact.vue +148 -0
- data/lib/vue/pages/onboarding/components/date-time.vue +265 -0
- data/lib/vue/pages/onboarding/components/finish.vue +62 -0
- data/lib/vue/pages/onboarding/components/general-info.vue +93 -0
- data/lib/vue/pages/onboarding/components/indicators.vue +78 -0
- data/lib/vue/pages/onboarding/components/welcome.vue +66 -0
- data/lib/vue/pages/onboarding/show.vue +67 -0
- data/lib/vue/pages/onboarding/store.js +165 -0
- data/lib/vue/pages/otps/application.js +90 -0
- data/lib/vue/pages/passes/application.js +80 -0
- data/lib/vue/pages/websites/application.js +34 -0
- data/lib/vue/panels/panel-announcements.vue +248 -0
- data/lib/vue/panels/panel-files.vue +281 -0
- data/lib/vue/panels/panel-notifications.vue +106 -0
- data/lib/vue/panels/panel-profile.vue +76 -0
- data/lib/vue/panels/panel-tasks.vue +124 -0
- data/lib/vue/panels/panel-tickets.vue +181 -0
- data/lib/vue/public.js +85 -0
- data/lib/vue/stores/announcements.js +75 -0
- data/lib/vue/stores/cloud-bell/notification.js +114 -0
- data/lib/vue/stores/cloudobjects/action.js +181 -0
- data/lib/vue/stores/cloudobjects/discussion.js +221 -0
- data/lib/vue/stores/cloudobjects/file.js +205 -0
- data/lib/vue/stores/dashboard.js +251 -0
- data/lib/vue/stores/firebase.js +163 -0
- data/lib/vue/stores/layout.js +60 -0
- data/lib/vue/stores/panels/announcements.js +153 -0
- data/lib/vue/stores/panels/task.js +66 -0
- data/lib/vue/stores/panels/tickets.js +129 -0
- data/lib/vue/stores/profile.js +90 -0
- data/lib/vue/stores/search.js +154 -0
- data/lib/vue/stores/services/translator.js +87 -0
- data/lib/vue/stores/workflow.js +185 -0
- data/lib/vue/stores/workflow2.js +345 -0
- data/lib/vue/stores/workflows/actions.js +327 -0
- data/lib/vue/stores/workflows/associations.js +130 -0
- data/lib/vue/stores/workflows/checks.js +210 -0
- data/lib/webpack/base.js +182 -0
- data/lib/webpack/core.js +80 -0
- data/lib/webpack/engines.js +162 -0
- data/license +674 -0
- data/readme.md +120 -0
- metadata +554 -0
|
@@ -0,0 +1,278 @@
|
|
|
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 Development Platform.
|
|
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
|
+
|
|
32
|
+
=end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# User extension methods
|
|
36
|
+
# Custom methods that belongs to a instance user
|
|
37
|
+
module UserGuard
|
|
38
|
+
extend ActiveSupport::Concern
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def max_object_level_permission
|
|
42
|
+
|
|
43
|
+
# get the max object level permission from roles assigned to the user
|
|
44
|
+
level = self.roles.map(&:object_level_permission).max()
|
|
45
|
+
|
|
46
|
+
# if user has no roles assigned, we return the lowest role available
|
|
47
|
+
# NOTE: This should not be possible due the user needs a role to login
|
|
48
|
+
unless level
|
|
49
|
+
return (self.account.roles.map(&:object_level_permission).min() + 1)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# return the level found
|
|
53
|
+
level
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @return [void]
|
|
57
|
+
# @description After creating a user, creates the necessary resources for them to access the different engines.
|
|
58
|
+
# @param *roles [String] One or more roles to be checked
|
|
59
|
+
# check role of the user
|
|
60
|
+
def has_roles? *roles
|
|
61
|
+
!roles.intersection(self.roles.map{ |r| r[:name] }).empty?
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# @return [Boolean]
|
|
66
|
+
# @description Return true/false if a user has all the privileges to do an action based on a controllers list,
|
|
67
|
+
# this validation includes the privileges that the user could have based on its roles and the privileges
|
|
68
|
+
# that has been added to the specific user.
|
|
69
|
+
# @examples
|
|
70
|
+
# validate privileges on a controller with the same actions on each one
|
|
71
|
+
# controllers = ["cloud_house/companies", "cloud_house/projects"]
|
|
72
|
+
# actions = ["index", "update"]
|
|
73
|
+
#
|
|
74
|
+
# current_user.has_privileges?(controllers, actions)
|
|
75
|
+
def has_privileges?(controller, action)
|
|
76
|
+
begin
|
|
77
|
+
!self.privileges
|
|
78
|
+
.where("role_privileges.controller = ?", controller)
|
|
79
|
+
.where("role_privileges.action = ?", action)
|
|
80
|
+
.first.blank?
|
|
81
|
+
rescue => exception
|
|
82
|
+
#Honeybadger.notify(exception)
|
|
83
|
+
return false
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# @return [Hash]
|
|
89
|
+
# @description Return a hash that contains all the abilities grouped by controller and define every action privilege. It also
|
|
90
|
+
# evaluate if the user has the ability no matter if is given to the user by role or by itself.
|
|
91
|
+
# @examples
|
|
92
|
+
# current_user.abilities_by_controller
|
|
93
|
+
def abilities_by_controller
|
|
94
|
+
|
|
95
|
+
# Abilities hash where we will save all the privileges the user has to
|
|
96
|
+
abilities = {}
|
|
97
|
+
|
|
98
|
+
# We check all the privileges the user has in the cache table according to his roles
|
|
99
|
+
# and create a key per controller (with the full controller name) that contains an array of all the
|
|
100
|
+
# methods/actions with permission
|
|
101
|
+
# self.privileges.all.each do |privilege|
|
|
102
|
+
# abilities[privilege.controller] = [] if abilities[privilege.controller].nil?
|
|
103
|
+
# abilities[privilege.controller] << privilege.action
|
|
104
|
+
# end
|
|
105
|
+
|
|
106
|
+
abilities
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
# @return Boolean
|
|
112
|
+
# @description Check if user has enough privilege to work with the given role
|
|
113
|
+
def can_work_with_role?(role)
|
|
114
|
+
|
|
115
|
+
# get the role if only id is given
|
|
116
|
+
role = self.account.roles.find_by(:id => role) unless role.class.name == "Role"
|
|
117
|
+
|
|
118
|
+
# false if role not found
|
|
119
|
+
return false if role.blank?
|
|
120
|
+
|
|
121
|
+
# not valid role without object levelpermission defined
|
|
122
|
+
return false if role.object_level_permission.blank?
|
|
123
|
+
|
|
124
|
+
# owner role can work with all the roles
|
|
125
|
+
return true if !self.roles.find_by(name: 'owner').blank?
|
|
126
|
+
|
|
127
|
+
# get the max object level permission from the roles the user has assigned
|
|
128
|
+
user_role_level_max = self.roles.map(&:object_level_permission).max()
|
|
129
|
+
|
|
130
|
+
# check if user can work with the object level permission of the role is trying to modify
|
|
131
|
+
# Note: user only can assigned an object level permission below the max of his own roles
|
|
132
|
+
# Current user cannot assign role if
|
|
133
|
+
# role to assign has greater object level permission than the greater role assigned to the current user
|
|
134
|
+
# role to assign is the same of the greater role assigned to the current user
|
|
135
|
+
# current user is not sysadmin or owner
|
|
136
|
+
return false if role.object_level_permission >= user_role_level_max
|
|
137
|
+
|
|
138
|
+
# user can work with this role :)
|
|
139
|
+
return true
|
|
140
|
+
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
# @return [nil,string]
|
|
145
|
+
# @description Checks configuration of all the roles assigned to the user
|
|
146
|
+
# if user has a role with "default path" to use as home to redirect after login
|
|
147
|
+
# IMPORTANT: This home path is used only the send the user after login, the user
|
|
148
|
+
# and the role are not limited by this configuration
|
|
149
|
+
def has_role_with_default_path?()
|
|
150
|
+
|
|
151
|
+
# get the roles that contains a path
|
|
152
|
+
role = self.roles.where.not(path_default: [nil, ""])
|
|
153
|
+
|
|
154
|
+
# here we must order the results descendant because we must
|
|
155
|
+
# keep the path of the hightest object level permission role.
|
|
156
|
+
# Example: we should use the path of the admin role if user has
|
|
157
|
+
# admin & employee roles, also order by default_path, so we get first
|
|
158
|
+
# the roles with path in case the user has roles with the same object level permission
|
|
159
|
+
role = role.order(object_level_permission: :desc).order(:path_default)
|
|
160
|
+
|
|
161
|
+
# get the first role found, due previously we sort in a descendant order
|
|
162
|
+
# the first role is going to be the one with highest object level permission
|
|
163
|
+
# this is going to return nil if no role was found
|
|
164
|
+
default_path = role.first&.path_default || "/"
|
|
165
|
+
|
|
166
|
+
# if first loggin for account owner send him to the onboarding page
|
|
167
|
+
if self.account.onboarding? && self.has_roles?("owner")
|
|
168
|
+
default_path = "/onboarding"
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
default_path
|
|
172
|
+
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
# @return [nil,string]
|
|
177
|
+
# @description Checks configuration of all the roles assigned to the user
|
|
178
|
+
# if user has a role limited to a defined path
|
|
179
|
+
# if user has a high privilege role that overrides any other role configuration
|
|
180
|
+
def has_role_limited_to_path?()
|
|
181
|
+
|
|
182
|
+
# get the roles ordering in descendant mode because we must
|
|
183
|
+
# keep the path of the hightest object level permission role.
|
|
184
|
+
# Example: we should use the path of the admin role if user has
|
|
185
|
+
# admin & employee roles, also order by default_path, so we get first
|
|
186
|
+
# the roles with path in case the user has roles with the same object level permission
|
|
187
|
+
role = self.roles.order(object_level_permission: :desc).order(:path_default)
|
|
188
|
+
|
|
189
|
+
# get the first role found, due previously we sort in a descendant order
|
|
190
|
+
# the first role is going to be the one with highest object level permission
|
|
191
|
+
# this is going to return nil if no role was found
|
|
192
|
+
role = role.first
|
|
193
|
+
|
|
194
|
+
# return the path of the role if is limited to a that specific path
|
|
195
|
+
return role.path_default_ if role.path_limited == true
|
|
196
|
+
|
|
197
|
+
# return nil if role has no limits
|
|
198
|
+
return nil
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
# @return [void]
|
|
203
|
+
# @description Sets this user as inactive and removes complete access to the platform from them
|
|
204
|
+
# @example
|
|
205
|
+
# old_user = User.last
|
|
206
|
+
# old_user.revoke_access
|
|
207
|
+
def revoke_access
|
|
208
|
+
self.update(active: false)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
# @return [void]
|
|
213
|
+
# @description Change user password forcing user to reset the password
|
|
214
|
+
def set_password_as_expired
|
|
215
|
+
self.update(password_expiration_at: Time.current)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
# @return [void]
|
|
220
|
+
# @description Change user password forcing user to reset the password
|
|
221
|
+
# @todo validate object level permission
|
|
222
|
+
def password_reset
|
|
223
|
+
pass = SecureRandom.hex(10)
|
|
224
|
+
self.update(password: pass)
|
|
225
|
+
pass
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
# @return [void]
|
|
230
|
+
# @description After creating a user, creates the necessary resources for them to access the different engines.
|
|
231
|
+
def has_expired_password?
|
|
232
|
+
return false if self.password_expiration_at.blank?
|
|
233
|
+
return Time.current > self.password_expiration_at
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
# @return String
|
|
238
|
+
# @description Change user password forcing user to reset the password
|
|
239
|
+
def generate_password_reset_token
|
|
240
|
+
raw, enc = Devise.token_generator.generate(self.class, :reset_password_token)
|
|
241
|
+
|
|
242
|
+
self.reset_password_token = enc
|
|
243
|
+
self.reset_password_sent_at = Time.now.utc
|
|
244
|
+
save(validate: false)
|
|
245
|
+
raw
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
# @return [Boolean]
|
|
250
|
+
# @description check if user has a confirmed telephone number
|
|
251
|
+
def telephone_confirmed?
|
|
252
|
+
!!self.telephone_confirmed_at
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
# @return String
|
|
257
|
+
# @description Generate a token to validate telephone number
|
|
258
|
+
def generate_telephone_token(length=4)
|
|
259
|
+
|
|
260
|
+
raw, enc = Devise.token_generator.create(self.class, :telephone_confirmation_token, type:'number', length:length)
|
|
261
|
+
|
|
262
|
+
self.telephone_confirmation_token = enc
|
|
263
|
+
self.telephone_confirmation_sent_at = Time.now.utc
|
|
264
|
+
self.telephone_confirmed_at = nil
|
|
265
|
+
save(validate: false)
|
|
266
|
+
raw
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
# @return String
|
|
271
|
+
# @description Mark telephone number as valid and confirmed
|
|
272
|
+
def confirm_telephone_number
|
|
273
|
+
self.telephone_confirmation_token = nil
|
|
274
|
+
self.telephone_confirmation_sent_at = nil
|
|
275
|
+
self.telephone_confirmed_at = Time.now.utc
|
|
276
|
+
save(validate: false)
|
|
277
|
+
end
|
|
278
|
+
end
|
|
@@ -0,0 +1,134 @@
|
|
|
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
|
+
|
|
35
|
+
# DEPRECATED METHODS
|
|
36
|
+
# We still need to keep the definition of this methods to bring compatibility to old installations of Lesli
|
|
37
|
+
module UserPolyfill
|
|
38
|
+
extend ActiveSupport::Concern
|
|
39
|
+
|
|
40
|
+
def has_privileges3?(controllers, actions)
|
|
41
|
+
|
|
42
|
+
begin
|
|
43
|
+
|
|
44
|
+
# This query fetch all the privileges actions that the user have through role descriptor assignments
|
|
45
|
+
sql_role_privile_actions = self.role_privilege_actions
|
|
46
|
+
.select(
|
|
47
|
+
"status",
|
|
48
|
+
"system_controller_actions.name as action",
|
|
49
|
+
"system_controllers.name as controller"
|
|
50
|
+
)
|
|
51
|
+
.joins(system_action: [:system_controller])
|
|
52
|
+
.where("system_controllers.name in (?)", controllers)
|
|
53
|
+
.where("system_controller_actions.name in (?)", actions)
|
|
54
|
+
.to_sql
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# This query fetch all the privileges actions that the user have through privileges actions added to the specific user
|
|
58
|
+
sql_user_privilege_actions = self.user_privilege_actions
|
|
59
|
+
.select(
|
|
60
|
+
"status",
|
|
61
|
+
"system_controller_actions.name as action",
|
|
62
|
+
"system_controllers.name as controller"
|
|
63
|
+
)
|
|
64
|
+
.joins(system_action: [:system_controller])
|
|
65
|
+
.where("system_controllers.name in (?)", controllers)
|
|
66
|
+
.where("system_controller_actions.name in (?)", actions)
|
|
67
|
+
.to_sql
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# This query is on charge of evaluate if the user have every specific privilege action
|
|
71
|
+
# no matter if is given indirectly by role or directly to the user. Then, after getting each
|
|
72
|
+
# specific boolean value of every privilege action, the query evalueate if is there some privilege
|
|
73
|
+
# action on false, if there is a false then the return of the method will be false, but if every
|
|
74
|
+
# privilege action is on true the permission is granted.
|
|
75
|
+
# This is possible by the union of the two previous queries
|
|
76
|
+
granted = ActiveRecord::Base.connection.exec_query("
|
|
77
|
+
select
|
|
78
|
+
bool_and(grouped_privileges.status) as value
|
|
79
|
+
from (
|
|
80
|
+
select
|
|
81
|
+
privilege_actions.controller,
|
|
82
|
+
privilege_actions.action,
|
|
83
|
+
BOOL_OR(privilege_actions.status) as status
|
|
84
|
+
from (
|
|
85
|
+
#{sql_role_privile_actions}
|
|
86
|
+
union
|
|
87
|
+
#{sql_user_privilege_actions}
|
|
88
|
+
) AS privilege_actions
|
|
89
|
+
group by (
|
|
90
|
+
controller,
|
|
91
|
+
action
|
|
92
|
+
)
|
|
93
|
+
) AS grouped_privileges
|
|
94
|
+
")
|
|
95
|
+
.first["value"]
|
|
96
|
+
|
|
97
|
+
return false if granted.blank?
|
|
98
|
+
|
|
99
|
+
return granted
|
|
100
|
+
|
|
101
|
+
rescue => exception
|
|
102
|
+
|
|
103
|
+
Honeybadger.notify(exception)
|
|
104
|
+
return false
|
|
105
|
+
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
# @return [void]
|
|
112
|
+
# @description After creating a user, creates the necessary resources for them to access the different engines.
|
|
113
|
+
# check role of the user
|
|
114
|
+
def is_role? *roles
|
|
115
|
+
LC::Debug.deprecation("Use has_roles?(role1, role2 ... rolen) instead")
|
|
116
|
+
return has_roles?(roles)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def log_activity request_method, request_controller, request_action, request_url, description = nil
|
|
120
|
+
LC::Debug.deprecation("Use user.activities, user.logs or log_user_comments instead")
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def generate_password_token
|
|
124
|
+
LC::Debug.deprecation("use generate_reset_password_token instead and build the email manually")
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def self.send_password_reset(user)
|
|
128
|
+
LC::Debug.deprecation("use generate_reset_password_token instead and build the email manually")
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def send_welcome_email
|
|
132
|
+
LC::Debug.deprecation("use generate_reset_password_token instead and build the email manually")
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
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 platform.
|
|
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
|
+
class Account::Log < ApplicationRecord
|
|
35
|
+
belongs_to :account
|
|
36
|
+
|
|
37
|
+
def self.log(system_module_action, system_process, title=nil, description=nil, payload=nil)
|
|
38
|
+
Account.first.activities.create(
|
|
39
|
+
system_module: system_module_action,
|
|
40
|
+
system_process: system_process,
|
|
41
|
+
description: description,
|
|
42
|
+
title: title,
|
|
43
|
+
payload: payload
|
|
44
|
+
)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.log_email(system_module_action, title="email_sent", description="email", payload=nil)
|
|
48
|
+
Account&.first&.logs&.create(
|
|
49
|
+
system_module: system_module_action,
|
|
50
|
+
system_process: "mailer",
|
|
51
|
+
description: description,
|
|
52
|
+
payload: payload,
|
|
53
|
+
title: title
|
|
54
|
+
)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
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.dev
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
=end
|
|
32
|
+
|
|
33
|
+
module Lesli
|
|
34
|
+
class Account < ApplicationLesliRecord
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# accounts always belongs to a user
|
|
38
|
+
belongs_to :user, optional: true
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# account resources
|
|
42
|
+
has_many :users
|
|
43
|
+
has_many :roles
|
|
44
|
+
has_many :files
|
|
45
|
+
has_many :cronos
|
|
46
|
+
has_many :settings
|
|
47
|
+
has_many :locations
|
|
48
|
+
has_many :feedbacks
|
|
49
|
+
has_many :descriptors
|
|
50
|
+
has_many :activities, class_name: "Account::Activity"
|
|
51
|
+
has_many :currencies, class_name: "Account::Currency"
|
|
52
|
+
has_many :logs
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# account statuses
|
|
57
|
+
enum status: [
|
|
58
|
+
:registered,
|
|
59
|
+
:onboarding,
|
|
60
|
+
:active,
|
|
61
|
+
:suspended
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# company region (GDPR)
|
|
66
|
+
enum region: {
|
|
67
|
+
latin_america: "latin_america",
|
|
68
|
+
united_states: "united_states",
|
|
69
|
+
european_union: "european_union"
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# required a name for the lesli account
|
|
74
|
+
validates :company_name, :presence => true
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
class ApplicationLesliRecord < ApplicationRecord
|
|
35
|
+
self.abstract_class = true
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
class SystemController::Action < ApplicationLesliRecord
|
|
35
|
+
belongs_to :system_controller
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
class SystemController < ApplicationLesliRecord
|
|
35
|
+
has_many :actions
|
|
36
|
+
end
|
|
37
|
+
end
|