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,108 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
/*
|
|
3
|
+
|
|
4
|
+
Lesli
|
|
5
|
+
|
|
6
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
7
|
+
|
|
8
|
+
This program is free software: you can redistribute it and/or modify
|
|
9
|
+
it under the terms of the GNU General Public License as published by
|
|
10
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
11
|
+
(at your option) any later version.
|
|
12
|
+
|
|
13
|
+
This program is distributed in the hope that it will be useful,
|
|
14
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
GNU General Public License for more details.
|
|
17
|
+
|
|
18
|
+
You should have received a copy of the GNU General Public License
|
|
19
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
20
|
+
|
|
21
|
+
Lesli · Your Smart Business Assistant.
|
|
22
|
+
|
|
23
|
+
Made with ♥ by https://www.lesli.tech
|
|
24
|
+
Building a better future, one line of code at a time.
|
|
25
|
+
|
|
26
|
+
@contact hello@lesli.tech
|
|
27
|
+
@website https://lesli.tech
|
|
28
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
29
|
+
|
|
30
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
31
|
+
// ·
|
|
32
|
+
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
// · import vue tools
|
|
37
|
+
import { watch } from "vue"
|
|
38
|
+
|
|
39
|
+
// · import store
|
|
40
|
+
import { useCloudObjectDiscussionStore } from "Lesli/cloudobjects/stores/discussion"
|
|
41
|
+
|
|
42
|
+
// · defining translations
|
|
43
|
+
const translations = {
|
|
44
|
+
core: {
|
|
45
|
+
shared: I18n.t("core.shared"),
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// · implement store
|
|
50
|
+
const discussionStore = useCloudObjectDiscussionStore()
|
|
51
|
+
|
|
52
|
+
watch(discussionStore.filters, (filters) => {
|
|
53
|
+
|
|
54
|
+
// · if the toolbar text is not empty, and the filters changed then search
|
|
55
|
+
if (discussionStore.stringToFind) {
|
|
56
|
+
discussionStore.search(discussionStore.stringToFind)
|
|
57
|
+
} else {
|
|
58
|
+
// · if the toolbar text is empty, fetch with the new filters
|
|
59
|
+
if (filters.showDiscussion) discussionStore.fetchDiscussions()
|
|
60
|
+
if (filters.showActivityLog) discussionStore.fetchActivityLogs()
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// · if showDiscussion filter is false, then clear the discussions
|
|
64
|
+
if (!filters.showDiscussion) discussionStore.discussions = []
|
|
65
|
+
|
|
66
|
+
// · if showActivityLog filter is false, then clear the activity logs
|
|
67
|
+
if (!filters.showActivityLog) discussionStore.activityLogs = []
|
|
68
|
+
})
|
|
69
|
+
</script>
|
|
70
|
+
|
|
71
|
+
<template>
|
|
72
|
+
<div class="discussion-filters mt-2">
|
|
73
|
+
|
|
74
|
+
<!-- Discussion filter -->
|
|
75
|
+
<div class="discussion-filters-item">
|
|
76
|
+
<p class="mb-2">{{ translations.core.shared.view_text_discussions }}</p>
|
|
77
|
+
<lesli-toggle v-model="discussionStore.filters.showDiscussion"/>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<!-- Activity logs filter -->
|
|
81
|
+
<div class="discussion-filters-item">
|
|
82
|
+
<p class="mb-2">{{ translations.core.shared.view_text_activity_logs }}</p>
|
|
83
|
+
<lesli-toggle v-model="discussionStore.filters.showActivityLog"/>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<div class="discussion-filters-item mt-5">
|
|
87
|
+
<lesli-select
|
|
88
|
+
:options="[
|
|
89
|
+
{
|
|
90
|
+
label: '10',
|
|
91
|
+
value: 10
|
|
92
|
+
}, {
|
|
93
|
+
label: '15',
|
|
94
|
+
value: 15
|
|
95
|
+
}, {
|
|
96
|
+
label: '30',
|
|
97
|
+
value: 30
|
|
98
|
+
}, {
|
|
99
|
+
label: '50',
|
|
100
|
+
value: 50
|
|
101
|
+
},
|
|
102
|
+
]"
|
|
103
|
+
v-model="discussionStore.filters.per_page"
|
|
104
|
+
@change="discussionStore.fetchDiscussions()">
|
|
105
|
+
</lesli-select>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</template>
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
/*
|
|
3
|
+
|
|
4
|
+
Lesli
|
|
5
|
+
|
|
6
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
7
|
+
|
|
8
|
+
This program is free software: you can redistribute it and/or modify
|
|
9
|
+
it under the terms of the GNU General Public License as published by
|
|
10
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
11
|
+
(at your option) any later version.
|
|
12
|
+
|
|
13
|
+
This program is distributed in the hope that it will be useful,
|
|
14
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
GNU General Public License for more details.
|
|
17
|
+
|
|
18
|
+
You should have received a copy of the GNU General Public License
|
|
19
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
20
|
+
|
|
21
|
+
Lesli · Your Smart Business Assistant.
|
|
22
|
+
|
|
23
|
+
Made with ♥ by https://www.lesli.tech
|
|
24
|
+
Building a better future, one line of code at a time.
|
|
25
|
+
|
|
26
|
+
@contact hello@lesli.tech
|
|
27
|
+
@website https://lesli.tech
|
|
28
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
29
|
+
|
|
30
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
31
|
+
// ·
|
|
32
|
+
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
// · import vue tools
|
|
37
|
+
import { ref, computed } from "vue"
|
|
38
|
+
|
|
39
|
+
// · import store
|
|
40
|
+
import { useCloudObjectDiscussionStore } from "Lesli/cloudobjects/stores/discussion"
|
|
41
|
+
|
|
42
|
+
// · defining props
|
|
43
|
+
const props = defineProps({
|
|
44
|
+
isReply: {
|
|
45
|
+
type: Boolean,
|
|
46
|
+
default: false,
|
|
47
|
+
},
|
|
48
|
+
mainDiscussion: {
|
|
49
|
+
type: Object,
|
|
50
|
+
default: null,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// · defining emits
|
|
55
|
+
const emit = defineEmits(["onAddComment"])
|
|
56
|
+
|
|
57
|
+
// · defining translations
|
|
58
|
+
const translations = {
|
|
59
|
+
core: {
|
|
60
|
+
shared: I18n.t("core.shared"),
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// · implement stores
|
|
65
|
+
const discussionStore = useCloudObjectDiscussionStore()
|
|
66
|
+
|
|
67
|
+
// · comment to add a new discussion
|
|
68
|
+
const comment = ref(null)
|
|
69
|
+
|
|
70
|
+
// · component's title
|
|
71
|
+
const title = computed(() => props.isReply ? translations.core.shared.view_text_reply : translations.core.shared.view_text_add_new_comment)
|
|
72
|
+
|
|
73
|
+
// · button's text
|
|
74
|
+
const buttonText = computed(() => props.isReply ? translations.core.shared.view_btn_add_reply : translations.core.shared.view_btn_add_comment)
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @description function to be called when the user clicks on the 'Add Comment' or 'Add Reply' button
|
|
78
|
+
*/
|
|
79
|
+
const onAddComment = () => {
|
|
80
|
+
if (!comment.value) return
|
|
81
|
+
|
|
82
|
+
// · the discussion model to be used for adding a new discussion
|
|
83
|
+
let discussionModel = `${discussionStore.utils.singularize(discussionStore.cloudObject)}_discussion`
|
|
84
|
+
|
|
85
|
+
const payload = {}
|
|
86
|
+
|
|
87
|
+
if (props.isReply) {
|
|
88
|
+
// · add the discussion id to the payload when is a reply
|
|
89
|
+
payload[discussionModel] = {
|
|
90
|
+
content: comment.value,
|
|
91
|
+
discussion_parent_id: props.mainDiscussion.id
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
// · payload for a basic discussion
|
|
95
|
+
payload[discussionModel] = {
|
|
96
|
+
content: comment.value
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// · add a new discussion
|
|
101
|
+
discussionStore.createDiscussion(payload)
|
|
102
|
+
|
|
103
|
+
// · emit event after adding a new discussion
|
|
104
|
+
emit("onAddComment")
|
|
105
|
+
|
|
106
|
+
// · clear the comment
|
|
107
|
+
comment.value = null
|
|
108
|
+
}
|
|
109
|
+
</script>
|
|
110
|
+
|
|
111
|
+
<template>
|
|
112
|
+
<div class="discussion-comment mb-2 mt-2">
|
|
113
|
+
<div class="discussion-comment-input">
|
|
114
|
+
<p class="is-size-5 mb-4">{{ title }}</p>
|
|
115
|
+
<textarea
|
|
116
|
+
name="comment"
|
|
117
|
+
rows="2"
|
|
118
|
+
maxlength="1000"
|
|
119
|
+
class="textarea"
|
|
120
|
+
:placeholder="translations.core.shared.view_placeholder_enter_comment"
|
|
121
|
+
v-model="comment"
|
|
122
|
+
/>
|
|
123
|
+
</div>
|
|
124
|
+
<div class="is-flex is-justify-content-flex-end pb-2">
|
|
125
|
+
<button @click="onAddComment" class="discussion-comment-button mt-4 button is-primary has-text-weight-bold">
|
|
126
|
+
{{ buttonText }}
|
|
127
|
+
</button>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
</template>
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
/*
|
|
3
|
+
|
|
4
|
+
Lesli
|
|
5
|
+
|
|
6
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
7
|
+
|
|
8
|
+
This program is free software: you can redistribute it and/or modify
|
|
9
|
+
it under the terms of the GNU General Public License as published by
|
|
10
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
11
|
+
(at your option) any later version.
|
|
12
|
+
|
|
13
|
+
This program is distributed in the hope that it will be useful,
|
|
14
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
GNU General Public License for more details.
|
|
17
|
+
|
|
18
|
+
You should have received a copy of the GNU General Public License
|
|
19
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
20
|
+
|
|
21
|
+
Lesli · Your Smart Business Assistant.
|
|
22
|
+
|
|
23
|
+
Made with ♥ by https://www.lesli.tech
|
|
24
|
+
Building a better future, one line of code at a time.
|
|
25
|
+
|
|
26
|
+
@contact hello@lesli.tech
|
|
27
|
+
@website https://lesli.tech
|
|
28
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
29
|
+
|
|
30
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
31
|
+
// ·
|
|
32
|
+
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
// · import vue tools
|
|
37
|
+
import { onMounted } from "vue"
|
|
38
|
+
|
|
39
|
+
// · import store
|
|
40
|
+
import { useCloudObjectDiscussionStore } from "Lesli/cloudobjects/stores/discussion"
|
|
41
|
+
|
|
42
|
+
// · import components
|
|
43
|
+
import DiscussionNew from "Lesli/cloudobjects/components/discussion/new.vue"
|
|
44
|
+
import DiscussionContent from "Lesli/cloudobjects/components/discussion/content.vue"
|
|
45
|
+
import DiscussionFilters from "Lesli/cloudobjects/components/discussion/filters.vue"
|
|
46
|
+
|
|
47
|
+
// · defining translations
|
|
48
|
+
const translations = {
|
|
49
|
+
core: {
|
|
50
|
+
shared: I18n.t("core.shared"),
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// · implement store
|
|
55
|
+
const discussionStore = useCloudObjectDiscussionStore()
|
|
56
|
+
|
|
57
|
+
// · defining props
|
|
58
|
+
const props = defineProps({
|
|
59
|
+
// · prop that indicates the cloud module that will be used for interacting with the backend.
|
|
60
|
+
cloudModule: {
|
|
61
|
+
type: String,
|
|
62
|
+
required: true,
|
|
63
|
+
},
|
|
64
|
+
// · prop that indicates the resource that you need to interact with.
|
|
65
|
+
cloudObject: {
|
|
66
|
+
type: String,
|
|
67
|
+
required: true,
|
|
68
|
+
},
|
|
69
|
+
// · prop that indicates the object id of the resource that you need to interact with.
|
|
70
|
+
cloudObjectId: {
|
|
71
|
+
type: String,
|
|
72
|
+
required: true,
|
|
73
|
+
},
|
|
74
|
+
onlyDiscussions: {
|
|
75
|
+
type: Boolean,
|
|
76
|
+
required: false,
|
|
77
|
+
default: false
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
discussionStore.cloudModule = props.cloudModule
|
|
82
|
+
discussionStore.cloudObject = props.cloudObject
|
|
83
|
+
discussionStore.cloudObjectId = props.cloudObjectId
|
|
84
|
+
|
|
85
|
+
onMounted(() => {
|
|
86
|
+
if (discussionStore.filters.showActivityLog && !props.onlyDiscussions) discussionStore.fetchActivityLogs()
|
|
87
|
+
if (discussionStore.filters.showDiscussion) discussionStore.fetchDiscussions()
|
|
88
|
+
})
|
|
89
|
+
</script>
|
|
90
|
+
|
|
91
|
+
<template>
|
|
92
|
+
<div class="p-2 discussion">
|
|
93
|
+
<discussion-new></discussion-new>
|
|
94
|
+
<lesli-toolbar @search="discussionStore.search" :search-placeholder="translations.core.shared.view_placeholder_discussion_search" class="mt-4"></lesli-toolbar>
|
|
95
|
+
<discussion-filters v-if="!props.onlyDiscussions"></discussion-filters>
|
|
96
|
+
<discussion-content></discussion-content>
|
|
97
|
+
</div>
|
|
98
|
+
</template>
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
/*
|
|
3
|
+
|
|
4
|
+
Lesli
|
|
5
|
+
|
|
6
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
7
|
+
|
|
8
|
+
This program is free software: you can redistribute it and/or modify
|
|
9
|
+
it under the terms of the GNU General Public License as published by
|
|
10
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
11
|
+
(at your option) any later version.
|
|
12
|
+
|
|
13
|
+
This program is distributed in the hope that it will be useful,
|
|
14
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
GNU General Public License for more details.
|
|
17
|
+
|
|
18
|
+
You should have received a copy of the GNU General Public License
|
|
19
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
20
|
+
|
|
21
|
+
Lesli · Your Smart Business Assistant.
|
|
22
|
+
|
|
23
|
+
Made with ♥ by https://www.lesli.tech
|
|
24
|
+
Building a better future, one line of code at a time.
|
|
25
|
+
|
|
26
|
+
@contact hello@lesli.tech
|
|
27
|
+
@website https://lesli.tech
|
|
28
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
29
|
+
|
|
30
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
31
|
+
// ·
|
|
32
|
+
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
// · import vue tools
|
|
36
|
+
import { onMounted, ref } from "vue";
|
|
37
|
+
|
|
38
|
+
// · import store
|
|
39
|
+
import { useCloudObjectFileStore } from "Lesli/cloudobjects/stores/file.js";
|
|
40
|
+
import { useLayout } from "Lesli/shared/stores/layout";
|
|
41
|
+
|
|
42
|
+
// · implement store
|
|
43
|
+
const store = useCloudObjectFileStore();
|
|
44
|
+
const storeLayout = useLayout();
|
|
45
|
+
|
|
46
|
+
// · defining translations
|
|
47
|
+
const translations = {
|
|
48
|
+
core: {
|
|
49
|
+
shared: I18n.t("core.shared"),
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// . Controls whether the modal is displayed
|
|
54
|
+
const showModal = ref(false);
|
|
55
|
+
// . Stores the currently displayed file
|
|
56
|
+
const currentFile = ref(null);
|
|
57
|
+
// . Stores the index of the currently displayed file
|
|
58
|
+
const currentIndex = ref(0)
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @description function that is called when the user click on the new file button.
|
|
62
|
+
*/
|
|
63
|
+
const onClickNewFile = () => {
|
|
64
|
+
storeLayout.showFiles = !storeLayout.showFiles;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @description open the modal and set the current file and its index
|
|
69
|
+
*/
|
|
70
|
+
const openModal = (file) => {
|
|
71
|
+
currentFile.value = file
|
|
72
|
+
currentIndex.value = store.files.indexOf(file)
|
|
73
|
+
showModal.value = true
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @description display the previous image in the array of files
|
|
78
|
+
*/
|
|
79
|
+
const prevImage = () => {
|
|
80
|
+
if (currentIndex.value > 0) {
|
|
81
|
+
currentIndex.value -= 1
|
|
82
|
+
currentFile.value = store.files[currentIndex.value]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @description display the next image in the array of files
|
|
88
|
+
*/
|
|
89
|
+
const nextImage = () => {
|
|
90
|
+
if (currentIndex.value < store.files.length - 1) {
|
|
91
|
+
currentIndex.value += 1
|
|
92
|
+
currentFile.value = store.files[currentIndex.value]
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @description delete image and close modal
|
|
98
|
+
*/
|
|
99
|
+
const deleteImage = () => {
|
|
100
|
+
store.deleteFile(currentFile.value.id)
|
|
101
|
+
currentFile.value = null
|
|
102
|
+
currentIndex.value = 0
|
|
103
|
+
showModal.value = false
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
onMounted(() => {
|
|
107
|
+
// · fetch the files from server
|
|
108
|
+
store.fetchFiles();
|
|
109
|
+
});
|
|
110
|
+
</script>
|
|
111
|
+
|
|
112
|
+
<template>
|
|
113
|
+
<div class="grid-container">
|
|
114
|
+
<div class="file-container" v-for="file in store.files" :key="file">
|
|
115
|
+
<img
|
|
116
|
+
@click="openModal(file)"
|
|
117
|
+
:src="store.getUrl(file.id)"
|
|
118
|
+
:alt="file.name"
|
|
119
|
+
v-if="file.file_type == 'image'"
|
|
120
|
+
/>
|
|
121
|
+
<video controls v-else-if="file.file_type == 'video'">
|
|
122
|
+
<source :src="store.getUrl(file.id)" type="video/mp4" />
|
|
123
|
+
</video>
|
|
124
|
+
<iframe
|
|
125
|
+
v-else-if="file.file_type == 'document'"
|
|
126
|
+
id="preview-document"
|
|
127
|
+
:src="store.getUrl(file.id)"
|
|
128
|
+
frameborder="0"
|
|
129
|
+
></iframe>
|
|
130
|
+
|
|
131
|
+
<button
|
|
132
|
+
class="delete-button"
|
|
133
|
+
@click="store.deleteFile(file.id)"
|
|
134
|
+
type="button"
|
|
135
|
+
>
|
|
136
|
+
<span class="icon">
|
|
137
|
+
<span class="material-icons">delete</span>
|
|
138
|
+
</span>
|
|
139
|
+
</button>
|
|
140
|
+
</div>
|
|
141
|
+
<div class="add-button">
|
|
142
|
+
<button
|
|
143
|
+
type="button"
|
|
144
|
+
class="add-file button"
|
|
145
|
+
@click="onClickNewFile"
|
|
146
|
+
>
|
|
147
|
+
<span class="icon">
|
|
148
|
+
<span class="material-icons">add_box</span>
|
|
149
|
+
</span>
|
|
150
|
+
<span>
|
|
151
|
+
{{ translations.core.shared.view_title_new_file }}
|
|
152
|
+
</span>
|
|
153
|
+
</button>
|
|
154
|
+
</div>
|
|
155
|
+
|
|
156
|
+
<Teleport to="body">
|
|
157
|
+
<div v-if="showModal" @click="showModal = false" class="file-backdrop"></div>
|
|
158
|
+
<div v-if="showModal" class="file-modal">
|
|
159
|
+
<img
|
|
160
|
+
:src="store.getUrl(currentFile.id)"
|
|
161
|
+
:alt="currentFile.name"
|
|
162
|
+
v-if="currentFile.file_type == 'image'"
|
|
163
|
+
/>
|
|
164
|
+
|
|
165
|
+
<video controls v-else-if="currentFile.file_type == 'video'">
|
|
166
|
+
<source :src="store.getUrl(currentFile.id)" type="video/mp4" />
|
|
167
|
+
</video>
|
|
168
|
+
|
|
169
|
+
<iframe
|
|
170
|
+
v-else-if="currentFile.file_type == 'document'"
|
|
171
|
+
id="preview-document"
|
|
172
|
+
:src="store.getUrl(currentFile.id)"
|
|
173
|
+
frameborder="0"
|
|
174
|
+
></iframe>
|
|
175
|
+
<div class="buttons">
|
|
176
|
+
<button @click="deleteImage" class="button is-primary is-danger">
|
|
177
|
+
<span class="icon">
|
|
178
|
+
<span class="material-icons">
|
|
179
|
+
delete
|
|
180
|
+
</span>
|
|
181
|
+
</span>
|
|
182
|
+
<span>Delete</span>
|
|
183
|
+
</button>
|
|
184
|
+
<div class="nav-buttons">
|
|
185
|
+
|
|
186
|
+
<button @click="prevImage" class="button is-primary">
|
|
187
|
+
<span class="icon">
|
|
188
|
+
<span class="material-icons">
|
|
189
|
+
arrow_back
|
|
190
|
+
</span>
|
|
191
|
+
</span>
|
|
192
|
+
<span>Previous image</span>
|
|
193
|
+
</button>
|
|
194
|
+
<button @click="nextImage" class="button is-primary">
|
|
195
|
+
<span>Next image</span>
|
|
196
|
+
<span class="icon">
|
|
197
|
+
<span class="material-icons">
|
|
198
|
+
arrow_forward
|
|
199
|
+
</span>
|
|
200
|
+
</span>
|
|
201
|
+
|
|
202
|
+
</button>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
<button @click="showModal = false" class="button is-primary btn-close">
|
|
206
|
+
<span class="icon">
|
|
207
|
+
<span class="material-icons">
|
|
208
|
+
close
|
|
209
|
+
</span>
|
|
210
|
+
</span>
|
|
211
|
+
</button>
|
|
212
|
+
</div>
|
|
213
|
+
</Teleport>
|
|
214
|
+
</div>
|
|
215
|
+
</template>
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
/*
|
|
3
|
+
|
|
4
|
+
Lesli
|
|
5
|
+
|
|
6
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
7
|
+
|
|
8
|
+
This program is free software: you can redistribute it and/or modify
|
|
9
|
+
it under the terms of the GNU General Public License as published by
|
|
10
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
11
|
+
(at your option) any later version.
|
|
12
|
+
|
|
13
|
+
This program is distributed in the hope that it will be useful,
|
|
14
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
GNU General Public License for more details.
|
|
17
|
+
|
|
18
|
+
You should have received a copy of the GNU General Public License
|
|
19
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
20
|
+
|
|
21
|
+
Lesli · Your Smart Business Assistant.
|
|
22
|
+
|
|
23
|
+
Made with ♥ by https://www.lesli.tech
|
|
24
|
+
Building a better future, one line of code at a time.
|
|
25
|
+
|
|
26
|
+
@contact hello@lesli.tech
|
|
27
|
+
@website https://lesli.tech
|
|
28
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
29
|
+
|
|
30
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
31
|
+
// ·
|
|
32
|
+
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
// · import vue tools
|
|
37
|
+
import { onMounted, ref } from "vue"
|
|
38
|
+
|
|
39
|
+
// · import store
|
|
40
|
+
import { useCloudObjectFileStore } from "Lesli/cloudobjects/stores/file.js"
|
|
41
|
+
import { useLayout } from "Lesli/shared/stores/layout"
|
|
42
|
+
|
|
43
|
+
// · implement store
|
|
44
|
+
const store = useCloudObjectFileStore()
|
|
45
|
+
const storeLayout = useLayout()
|
|
46
|
+
|
|
47
|
+
// · defining translations
|
|
48
|
+
const translations = {
|
|
49
|
+
core: {
|
|
50
|
+
shared: I18n.t("core.shared"),
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// · columns of the table
|
|
55
|
+
const columns = [
|
|
56
|
+
{
|
|
57
|
+
field: "name",
|
|
58
|
+
label: translations.core.shared.column_files_name,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
field: "file_type",
|
|
62
|
+
label: translations.core.shared.column_files_file_type,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
field: "created_at",
|
|
66
|
+
label: translations.core.shared.column_created_at,
|
|
67
|
+
},
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @description function that is called when the user click on the new file button.
|
|
73
|
+
*/
|
|
74
|
+
const onClickNewFile = () => {
|
|
75
|
+
storeLayout.showFiles = !storeLayout.showFiles
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
onMounted(() => {
|
|
79
|
+
// · fetch the files from server
|
|
80
|
+
store.fetchFiles()
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<template>
|
|
86
|
+
|
|
87
|
+
<div class="is-flex is-justify-content-end mb-4">
|
|
88
|
+
<button class="button is-primary" type="button" @click="onClickNewFile">
|
|
89
|
+
<span >
|
|
90
|
+
{{ translations.core.shared.view_title_new_file }}
|
|
91
|
+
</span>
|
|
92
|
+
<span class="icon is-small">
|
|
93
|
+
<span class="material-icons">add</span>
|
|
94
|
+
</span>
|
|
95
|
+
</button>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<lesli-table :columns="columns" :records="store.files">
|
|
99
|
+
<template #options="record">
|
|
100
|
+
<a class="dropdown-item" :href="`${store.getUrl(record.value)}.json`" target="_blank">{{ translations.core.shared.view_btn_view_file }}</a>
|
|
101
|
+
<a class="dropdown-item" :href="`${store.getUrl(record.value)}.json?download=true`" download>{{ translations.core.shared.view_btn_download }}</a>
|
|
102
|
+
<a class="dropdown-item" @click="store.deleteFile(record.value)">{{ translations.core.shared.view_btn_delete }}</a>
|
|
103
|
+
</template>
|
|
104
|
+
</lesli-table>
|
|
105
|
+
|
|
106
|
+
</template>
|