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,221 @@
|
|
|
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 · 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
|
+
*/
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
// · This store is needed to make http requests, manage the reactivity
|
|
36
|
+
// · of certain global properties available to child components of the
|
|
37
|
+
// · cloud object.
|
|
38
|
+
|
|
39
|
+
import { defineStore } from "pinia"
|
|
40
|
+
|
|
41
|
+
export const useCloudObjectDiscussionStore = defineStore("cloudObjectDiscussion", {
|
|
42
|
+
state: () => {
|
|
43
|
+
return {
|
|
44
|
+
discussions: [],
|
|
45
|
+
activityLogs: [],
|
|
46
|
+
loading: false,
|
|
47
|
+
cloudModule: null,
|
|
48
|
+
cloudObject: null,
|
|
49
|
+
cloudObjectId: null,
|
|
50
|
+
stringToFind: null,
|
|
51
|
+
isBuilderEngine: null,
|
|
52
|
+
currentUserId: lesli.current_user.id,
|
|
53
|
+
index: {
|
|
54
|
+
pagination: {},
|
|
55
|
+
records: []
|
|
56
|
+
},
|
|
57
|
+
pagination: {
|
|
58
|
+
page: 1,
|
|
59
|
+
pages: 1,
|
|
60
|
+
total: 0,
|
|
61
|
+
results: 0
|
|
62
|
+
},
|
|
63
|
+
filters: {
|
|
64
|
+
per_page: 10,
|
|
65
|
+
showDiscussion: true,
|
|
66
|
+
showActivityLog: false,
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
getters: {
|
|
71
|
+
/**
|
|
72
|
+
*
|
|
73
|
+
* @param {*} state has the state of the store
|
|
74
|
+
* @returns {Array} merged array of discussions and activity logs
|
|
75
|
+
*/
|
|
76
|
+
mergedArray: (state) => {
|
|
77
|
+
// · Array of elements to be displayed in the discussion section
|
|
78
|
+
const elements = []
|
|
79
|
+
|
|
80
|
+
// · Verify length of the discussion array
|
|
81
|
+
if (state.discussions.length > 0) {
|
|
82
|
+
// · Add the discussion array to the merged array
|
|
83
|
+
elements.push(...state.discussions.map(discussion => {
|
|
84
|
+
// · Return the discussion object with a similar structure to the activity log
|
|
85
|
+
return {
|
|
86
|
+
type: "discussion",
|
|
87
|
+
responses: discussion.responses,
|
|
88
|
+
...discussion.data
|
|
89
|
+
}
|
|
90
|
+
}))
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// · Verify length of the activity log array
|
|
94
|
+
if (state.activityLogs.length > 0) {
|
|
95
|
+
// · Add the activity log array to the merged array
|
|
96
|
+
elements.push(...state.activityLogs.map(activityLog => {
|
|
97
|
+
// · Return the activity log object with a similar structure to the discussion
|
|
98
|
+
return {
|
|
99
|
+
type: "activityLog",
|
|
100
|
+
...activityLog
|
|
101
|
+
}
|
|
102
|
+
}))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return elements.sort((a, b) => {
|
|
106
|
+
return a.created_at < b.created_at ? 1 : -1
|
|
107
|
+
}, 0)
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
actions: {
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @param {number} page number to which I want to go.
|
|
114
|
+
* @description Sets a new page number, applying query parameters to fetch data once again.
|
|
115
|
+
*/
|
|
116
|
+
paginateDiscussions(page){
|
|
117
|
+
this.pagination.page = page
|
|
118
|
+
this.fetchDiscussions()
|
|
119
|
+
},
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* @description This action is used to fetch the list of discussion
|
|
123
|
+
*/
|
|
124
|
+
fetchDiscussions(url) {
|
|
125
|
+
this.loading = true
|
|
126
|
+
|
|
127
|
+
if (!url) url = this.url[this.cloudModule](`${this.cloudObject}/:id/discussions`, this.cloudObjectId)
|
|
128
|
+
|
|
129
|
+
this.http.get(url.paginate(this.pagination.page, this.filters.per_page)).then(result => {
|
|
130
|
+
this.pagination = result.pagination
|
|
131
|
+
this.discussions = result.records
|
|
132
|
+
}).catch(error => {
|
|
133
|
+
console.log(error)
|
|
134
|
+
this.msg.danger(I18n.t("core.shared").messages_danger_getting_discussions)
|
|
135
|
+
}).finally(() => {
|
|
136
|
+
this.loading = false
|
|
137
|
+
})
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
*
|
|
142
|
+
* @param {string} stringToFind String to search for
|
|
143
|
+
* @description This action is used to search for a string in the cloud object's discussions and activity logs
|
|
144
|
+
*/
|
|
145
|
+
search(stringToFind) {
|
|
146
|
+
|
|
147
|
+
// · It's necessary to set the string to find in the state
|
|
148
|
+
// · if the filters change and the toolbar is not empty
|
|
149
|
+
// · the search will be performed again
|
|
150
|
+
this.stringToFind = stringToFind
|
|
151
|
+
|
|
152
|
+
if (this.filters.showDiscussion) {
|
|
153
|
+
const discussionsUrl = this.url[this.cloudModule](`${this.cloudObject}/:id/discussions`, this.cloudObjectId).search(this.stringToFind)
|
|
154
|
+
this.fetchDiscussions(discussionsUrl)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (this.filters.showActivityLog) {
|
|
158
|
+
const activityLogsUrl = this.url[this.cloudModule](`${this.cloudObject}/:id/activities`, this.cloudObjectId).search(this.stringToFind)
|
|
159
|
+
this.fetchActivityLogs(activityLogsUrl)
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @description This action is used to create a discussion
|
|
165
|
+
* @param {Object} payload contains the data of the discussion
|
|
166
|
+
*/
|
|
167
|
+
createDiscussion(payload) {
|
|
168
|
+
|
|
169
|
+
const url = this.url[this.cloudModule](`${this.cloudObject}/:id/discussions`, {
|
|
170
|
+
id: this.cloudObjectId,
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
this.http.post(url, payload
|
|
174
|
+
).then(() => {
|
|
175
|
+
this.msg.success(I18n.t("core.shared").messages_success_creating_discussion)
|
|
176
|
+
this.fetchDiscussions()
|
|
177
|
+
}).catch(error => {
|
|
178
|
+
this.msg.danger(I18n.t("core.shared").messages_danger_creating_discussion)
|
|
179
|
+
})
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* @description This action is used to delete a discussion.
|
|
184
|
+
*/
|
|
185
|
+
deleteDiscussion(discussionId) {
|
|
186
|
+
|
|
187
|
+
if (!discussionId) return
|
|
188
|
+
|
|
189
|
+
const url = this.url[this.cloudModule](`${this.cloudObject}/:id/discussions/:discussionId`, {
|
|
190
|
+
id: this.cloudObjectId,
|
|
191
|
+
discussionId: discussionId,
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
this.http.delete(url).then(() => {
|
|
195
|
+
this.msg.success(I18n.t("core.shared").messages_success_deleting_discussion)
|
|
196
|
+
this.fetchDiscussions()
|
|
197
|
+
}).catch(error => {
|
|
198
|
+
this.msg.danger(I18n.t("core.shared").messages_danger_deleting_discussion)
|
|
199
|
+
})
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* @description This action is used to get the activity logs of the cloud object.
|
|
204
|
+
* @param {String} url to fetch the activity logs
|
|
205
|
+
*/
|
|
206
|
+
fetchActivityLogs(url) {
|
|
207
|
+
this.loading = true
|
|
208
|
+
|
|
209
|
+
if (!url) url = this.url[this.cloudModule](`${this.cloudObject}/:id/activities`, this.cloudObjectId)
|
|
210
|
+
|
|
211
|
+
this.http.get(url).then(result => {
|
|
212
|
+
this.activityLogs = result
|
|
213
|
+
}).catch(error => {
|
|
214
|
+
console.log(error)
|
|
215
|
+
this.msg.danger(I18n.t("core.shared").messages_danger_getting_activity_logs)
|
|
216
|
+
}).finally(() => {
|
|
217
|
+
this.loading = false
|
|
218
|
+
})
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
})
|
|
@@ -0,0 +1,205 @@
|
|
|
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 · 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
|
+
*/
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
// · This store is needed to make http requests, manage the reactivity
|
|
36
|
+
// · of certain global properties available to child components of the
|
|
37
|
+
// · cloud object, such as the form to upload files and the table to display them.
|
|
38
|
+
|
|
39
|
+
import { defineStore } from "pinia"
|
|
40
|
+
|
|
41
|
+
export const useCloudObjectFileStore = defineStore("cloud.object.file", {
|
|
42
|
+
state: () => {
|
|
43
|
+
return {
|
|
44
|
+
files: [],
|
|
45
|
+
filesToUpload: [],
|
|
46
|
+
fileTypes: [],
|
|
47
|
+
acceptedFiles: [],
|
|
48
|
+
clearDropZone: false,
|
|
49
|
+
loading: false,
|
|
50
|
+
cloudModule: null,
|
|
51
|
+
cloudObject: null,
|
|
52
|
+
cloudObjectId: null,
|
|
53
|
+
fileType: null,
|
|
54
|
+
maxFiles: null,
|
|
55
|
+
maxSizeFile: null,
|
|
56
|
+
showFilesUpload: false,
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
actions: {
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @param {Object[]} files with an accepted format
|
|
64
|
+
* @description This action is used to add files to the server.
|
|
65
|
+
*/
|
|
66
|
+
uploadFiles(files) {
|
|
67
|
+
// · array of promises
|
|
68
|
+
const promises = []
|
|
69
|
+
|
|
70
|
+
// · url to upload files
|
|
71
|
+
const url = this.url[this.cloudModule](
|
|
72
|
+
`${this.cloudObject}/:cloudObjectId/files`,
|
|
73
|
+
{
|
|
74
|
+
cloudObjectId: this.cloudObjectId,
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
// · interate all files, create a promise and save it in the array
|
|
79
|
+
for (let i = 0; i < files.length; i++) {
|
|
80
|
+
promises.push(this.http.post(url, files[i], {
|
|
81
|
+
headers: {
|
|
82
|
+
"Content-Type": "multipart/form-data",
|
|
83
|
+
}
|
|
84
|
+
}))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// · execute all promises asynchronously
|
|
88
|
+
Promise.all(promises).then(() => {
|
|
89
|
+
this.msg.success(I18n.t("core.shared").messages_success_files_uploaded)
|
|
90
|
+
this.fetchFiles()
|
|
91
|
+
}).catch(error => {
|
|
92
|
+
this.msg.danger(error.message)
|
|
93
|
+
}).finally(() => {
|
|
94
|
+
this.loading = false
|
|
95
|
+
})
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* @description This action is used to fetch the files of a cloud object.
|
|
101
|
+
*/
|
|
102
|
+
fetchFiles() {
|
|
103
|
+
this.loading = true
|
|
104
|
+
|
|
105
|
+
// · url to fetch files
|
|
106
|
+
const url = this.url[this.cloudModule](
|
|
107
|
+
`${this.cloudObject}/:cloudObjectId/files`,
|
|
108
|
+
{ cloudObjectId: this.cloudObjectId, }
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
// · If file type is not null, add the query param "f" to the url
|
|
112
|
+
if (this.fileType) url.filter({ file_type: [this.fileType] })
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
this.http.get(url).then(response => {
|
|
116
|
+
if (response.length === 0) this.files = []
|
|
117
|
+
else this.files = response
|
|
118
|
+
}).catch(error => {
|
|
119
|
+
console.log(error)
|
|
120
|
+
this.msg.danger(I18n.t("core.shared").messages_danger_getting_files)
|
|
121
|
+
}).finally(() => {
|
|
122
|
+
this.loading = false
|
|
123
|
+
})
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
*
|
|
129
|
+
* @param {string} id
|
|
130
|
+
* @description this action is used to delete a file from a cloud object.
|
|
131
|
+
*/
|
|
132
|
+
deleteFile(id) {
|
|
133
|
+
this.loading = true
|
|
134
|
+
|
|
135
|
+
// · url to delete file
|
|
136
|
+
const url = this.url[this.cloudModule](
|
|
137
|
+
`${this.cloudObject}/:cloudObjectId/files/:fileId`,
|
|
138
|
+
{
|
|
139
|
+
cloudObjectId: this.cloudObjectId,
|
|
140
|
+
fileId: id
|
|
141
|
+
}
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
this.http.delete(url).then(() => {
|
|
145
|
+
// · fetch files after delete a file
|
|
146
|
+
this.fetchFiles()
|
|
147
|
+
this.msg.success(I18n.t("core.shared").messages_success_files_deleted)
|
|
148
|
+
}).catch(error => {
|
|
149
|
+
console.log(error)
|
|
150
|
+
this.msg.danger(I18n.t("core.shared").messages_danger_files_deleted)
|
|
151
|
+
}).finally(() => {
|
|
152
|
+
this.loading = false
|
|
153
|
+
this.filesToUpload = []
|
|
154
|
+
})
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* @description This method is used to fetch the files type to show in a select element.
|
|
160
|
+
*/
|
|
161
|
+
fetchFileTypes() {
|
|
162
|
+
this.loading = true
|
|
163
|
+
|
|
164
|
+
// · url to fetch file types that are allowed to upload
|
|
165
|
+
const url = this.url[this.cloudModule](
|
|
166
|
+
`${this.cloudObject}/files/options`,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
this.http.get(url)
|
|
170
|
+
.then(response => {
|
|
171
|
+
// transform the response to an acceptable array of options for lesli-select
|
|
172
|
+
this.fileTypes = response.file_types.map(fileType => {
|
|
173
|
+
return {
|
|
174
|
+
value: fileType.value,
|
|
175
|
+
label: fileType.text
|
|
176
|
+
}
|
|
177
|
+
})
|
|
178
|
+
}).catch(error => {
|
|
179
|
+
console.log(error)
|
|
180
|
+
this.msg.danger(I18n.t("core.shared").messages_danger_getting_file_types)
|
|
181
|
+
}).finally(() => {
|
|
182
|
+
this.loading = false
|
|
183
|
+
})
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
*
|
|
188
|
+
* @param {string} id
|
|
189
|
+
* @description This method is used to get the url of a file
|
|
190
|
+
* @returns {string} file url
|
|
191
|
+
*/
|
|
192
|
+
getUrl(id) {
|
|
193
|
+
// · url to fetch file types that are allowed to upload
|
|
194
|
+
const url = this.url[this.cloudModule](
|
|
195
|
+
`${this.cloudObject}/:cloudObjectId/files/:fileId`,
|
|
196
|
+
{
|
|
197
|
+
cloudObjectId: this.cloudObjectId,
|
|
198
|
+
fileId: id
|
|
199
|
+
}
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
return url.toString()
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
})
|
|
@@ -0,0 +1,251 @@
|
|
|
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 · 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
|
+
*/
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
// ·
|
|
36
|
+
import { defineStore } from "pinia"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
// ·
|
|
40
|
+
export const useDashboard = defineStore("shared.dashboard", {
|
|
41
|
+
state: () => {
|
|
42
|
+
return {
|
|
43
|
+
loading: false,
|
|
44
|
+
engine: null,
|
|
45
|
+
|
|
46
|
+
dashboard: {
|
|
47
|
+
components: []
|
|
48
|
+
},
|
|
49
|
+
dashboards: [],
|
|
50
|
+
|
|
51
|
+
options: [],
|
|
52
|
+
selected_dashboard_component: {},
|
|
53
|
+
deleted_components: [],
|
|
54
|
+
default_component_configuration:{
|
|
55
|
+
index: 1,
|
|
56
|
+
layout: 4
|
|
57
|
+
},
|
|
58
|
+
new_component_id: ""
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
actions: {
|
|
62
|
+
/**
|
|
63
|
+
* @description This action is used to get the default dashboard
|
|
64
|
+
*/
|
|
65
|
+
getDashboard() {
|
|
66
|
+
this.http.get(this.url[this.engine]('dashboards/default')).then(result => {
|
|
67
|
+
let components = result.components
|
|
68
|
+
this.dashboard = result
|
|
69
|
+
this.dashboard.components = []
|
|
70
|
+
|
|
71
|
+
// Parse components so they can be rendered
|
|
72
|
+
components.forEach((component) => {
|
|
73
|
+
component.component_id = component.component_id.replaceAll('_','-')
|
|
74
|
+
this.dashboard.components.push(component)
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* @description This action is used to fetch the list of dashboards
|
|
80
|
+
*/
|
|
81
|
+
fetchDashboards(url) {
|
|
82
|
+
this.loading = true
|
|
83
|
+
|
|
84
|
+
if (!url) url = this.url[this.engine]('dashboards')
|
|
85
|
+
|
|
86
|
+
this.http.get(url).then(result => {
|
|
87
|
+
this.loading = false
|
|
88
|
+
this.dashboards = result.dashboards.map(dashboard => {
|
|
89
|
+
dashboard.created_at = this.date2(dashboard.created_at).dateTime().toString()
|
|
90
|
+
dashboard.updated_at = this.date2(dashboard.updated_at).dateTime().toString()
|
|
91
|
+
return dashboard
|
|
92
|
+
})
|
|
93
|
+
}).catch(error => {
|
|
94
|
+
this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
|
|
95
|
+
})
|
|
96
|
+
},
|
|
97
|
+
/**
|
|
98
|
+
* @param {string} search_string String to search for
|
|
99
|
+
* @description This action is used to search for a string in the dashboards
|
|
100
|
+
*/
|
|
101
|
+
searchDashboards(search_string){
|
|
102
|
+
const url = this.url[this.engine]('dashboards').search(search_string)
|
|
103
|
+
this.fetchDashboards(url)
|
|
104
|
+
},
|
|
105
|
+
/**
|
|
106
|
+
* @description This action is used to reset the dashboard
|
|
107
|
+
*/
|
|
108
|
+
resetDashboard(){
|
|
109
|
+
this.dashboard = {
|
|
110
|
+
components: []
|
|
111
|
+
}
|
|
112
|
+
this.deleted_components = []
|
|
113
|
+
this.selected_dashboard_component = {}
|
|
114
|
+
this.new_component_id = ""
|
|
115
|
+
},
|
|
116
|
+
/**
|
|
117
|
+
* @description This action is used to update a dashboard
|
|
118
|
+
*/
|
|
119
|
+
updateDashboard(){
|
|
120
|
+
this.loading = true
|
|
121
|
+
let data = {
|
|
122
|
+
dashboard: {
|
|
123
|
+
name: this.dashboard.name,
|
|
124
|
+
default: this.dashboard.default,
|
|
125
|
+
roles_id: this.dashboard.roles_id,
|
|
126
|
+
components_attributes: this.dashboard.components.map((component)=>{
|
|
127
|
+
let parsed_component = {...component}
|
|
128
|
+
// We check if the id is a valid integer or a placeholder. If it is a placeholder, we set it to null
|
|
129
|
+
if(isNaN(parsed_component.id)){
|
|
130
|
+
parsed_component.id = null
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return parsed_component
|
|
134
|
+
})
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
data.dashboard.components_attributes = data.dashboard.components_attributes.concat(this.deleted_components)
|
|
139
|
+
|
|
140
|
+
const url = this.url[this.engine](`dashboards/${this.dashboard.id}`)
|
|
141
|
+
|
|
142
|
+
return this.http.put(url, data).then(result => {
|
|
143
|
+
this.msg.success(I18n.t("core.users.messages_success_operation"))
|
|
144
|
+
this.loading = false
|
|
145
|
+
}).catch(error => {
|
|
146
|
+
this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
|
|
147
|
+
})
|
|
148
|
+
},
|
|
149
|
+
/**
|
|
150
|
+
* @description This action is used to post a dashboard
|
|
151
|
+
*/
|
|
152
|
+
async postDashboard(){
|
|
153
|
+
this.loading = true
|
|
154
|
+
let data = {
|
|
155
|
+
dashboard: {
|
|
156
|
+
name: this.dashboard.name,
|
|
157
|
+
default: this.dashboard.default,
|
|
158
|
+
roles_id: this.dashboard.roles_id,
|
|
159
|
+
components_attributes: this.dashboard.components.map((component)=>{
|
|
160
|
+
let parsed_component = {...component}
|
|
161
|
+
parsed_component.id = null
|
|
162
|
+
|
|
163
|
+
return parsed_component
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const url = this.url[this.engine]('dashboards')
|
|
169
|
+
|
|
170
|
+
return this.http.post(url, data).then(result => {
|
|
171
|
+
this.msg.success(I18n.t("core.users.messages_success_operation"))
|
|
172
|
+
this.loading = false
|
|
173
|
+
}).catch(error => {
|
|
174
|
+
this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
|
|
175
|
+
})
|
|
176
|
+
},
|
|
177
|
+
/**
|
|
178
|
+
* @description This action is used to get dashboard options
|
|
179
|
+
*/
|
|
180
|
+
getDashboardOptions(){
|
|
181
|
+
|
|
182
|
+
this.options = {
|
|
183
|
+
component_ids: [],
|
|
184
|
+
roles: [],
|
|
185
|
+
components_configuration_options: {}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const url = this.url[this.engine]('dashboards/options')
|
|
189
|
+
|
|
190
|
+
this.http.get(url).then(result => {
|
|
191
|
+
|
|
192
|
+
result["roles"].forEach((role)=>{
|
|
193
|
+
this.options["roles"].push({
|
|
194
|
+
label: role.text,
|
|
195
|
+
value: role.value
|
|
196
|
+
})
|
|
197
|
+
})
|
|
198
|
+
result["component_ids"].forEach((component)=>{
|
|
199
|
+
this.options["component_ids"].push({
|
|
200
|
+
label: component.text.replaceAll('_','-'),
|
|
201
|
+
value: component.value
|
|
202
|
+
})
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
this.options["components_configuration_options"] = result["components_configuration_options"]
|
|
206
|
+
|
|
207
|
+
}).catch(error => {
|
|
208
|
+
this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
|
|
209
|
+
})
|
|
210
|
+
},
|
|
211
|
+
/**
|
|
212
|
+
* @description This action is used to get the information for a dashboard
|
|
213
|
+
*/
|
|
214
|
+
fetchDashboard(dashboard_id){
|
|
215
|
+
this.loading = true
|
|
216
|
+
|
|
217
|
+
const url = this.url[this.engine]('dashboards/:dashboardId', { dashboardId: dashboard_id })
|
|
218
|
+
|
|
219
|
+
return this.http.get(url).then(result => {
|
|
220
|
+
|
|
221
|
+
let components = result.components
|
|
222
|
+
this.dashboard = result
|
|
223
|
+
this.dashboard.components = []
|
|
224
|
+
|
|
225
|
+
// Parse components so they can be rendered
|
|
226
|
+
components.forEach((component) => {
|
|
227
|
+
component.component_id = component.component_id.replaceAll('_','-')
|
|
228
|
+
this.dashboard.components.push(component)
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
this.loading = false
|
|
232
|
+
}).catch(error => {
|
|
233
|
+
this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
|
|
234
|
+
})
|
|
235
|
+
},
|
|
236
|
+
/**
|
|
237
|
+
* @description This action is used to delete a dashboard
|
|
238
|
+
*/
|
|
239
|
+
async deleteDashboard(){
|
|
240
|
+
this.loading = true
|
|
241
|
+
const url = this.url[this.engine]('dashboards/:dashboardId', { dashboardId: this.dashboard.id })
|
|
242
|
+
|
|
243
|
+
return this.http.delete(url).then(result => {
|
|
244
|
+
this.msg.success(I18n.t("core.users.messages_success_operation"))
|
|
245
|
+
this.loading = false
|
|
246
|
+
}).catch(error => {
|
|
247
|
+
this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
|
|
248
|
+
})
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
})
|