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.
Files changed (398) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +3 -0
  3. data/app/assets/config/lesli_manifest.js +53 -0
  4. data/app/assets/fonts/lesli/Domine/Domine-Bold.ttf +0 -0
  5. data/app/assets/fonts/lesli/Domine/Domine-Regular.ttf +0 -0
  6. data/app/assets/fonts/lesli/Domine/OFL.txt +95 -0
  7. data/app/assets/fonts/lesli/MaterialDesign/icons.woff2 +0 -0
  8. data/app/assets/fonts/lesli/Montserrat/Montserrat-Variable.ttf +0 -0
  9. data/app/assets/fonts/lesli/OpenSans/OpenSans-Variable.ttf +0 -0
  10. data/app/assets/fonts/lesli/Remix/remixicon.eot +0 -0
  11. data/app/assets/fonts/lesli/Remix/remixicon.glyph.json +1 -0
  12. data/app/assets/fonts/lesli/Remix/remixicon.svg +7633 -0
  13. data/app/assets/fonts/lesli/Remix/remixicon.symbol.svg +11 -0
  14. data/app/assets/fonts/lesli/Remix/remixicon.ttf +0 -0
  15. data/app/assets/fonts/lesli/Remix/remixicon.woff +0 -0
  16. data/app/assets/fonts/lesli/Remix/remixicon.woff2 +0 -0
  17. data/app/assets/fonts/lesli/Roboto/LICENSE.txt +202 -0
  18. data/app/assets/fonts/lesli/Roboto/Roboto-Black.ttf +0 -0
  19. data/app/assets/fonts/lesli/Roboto/Roboto-BlackItalic.ttf +0 -0
  20. data/app/assets/fonts/lesli/Roboto/Roboto-Bold.ttf +0 -0
  21. data/app/assets/fonts/lesli/Roboto/Roboto-BoldItalic.ttf +0 -0
  22. data/app/assets/fonts/lesli/Roboto/Roboto-Italic.ttf +0 -0
  23. data/app/assets/fonts/lesli/Roboto/Roboto-Light.ttf +0 -0
  24. data/app/assets/fonts/lesli/Roboto/Roboto-LightItalic.ttf +0 -0
  25. data/app/assets/fonts/lesli/Roboto/Roboto-Medium.ttf +0 -0
  26. data/app/assets/fonts/lesli/Roboto/Roboto-MediumItalic.ttf +0 -0
  27. data/app/assets/fonts/lesli/Roboto/Roboto-Regular.ttf +0 -0
  28. data/app/assets/fonts/lesli/Roboto/Roboto-Thin.ttf +0 -0
  29. data/app/assets/fonts/lesli/Roboto/Roboto-ThinItalic.ttf +0 -0
  30. data/app/assets/icons/lesli/cloud-admin.svg +1 -0
  31. data/app/assets/icons/lesli/cloud-audit.svg +1 -0
  32. data/app/assets/icons/lesli/cloud-babel.svg +1 -0
  33. data/app/assets/icons/lesli/cloud-bell.svg +1 -0
  34. data/app/assets/icons/lesli/cloud-books.svg +1 -0
  35. data/app/assets/icons/lesli/cloud-development.svg +1 -0
  36. data/app/assets/icons/lesli/cloud-dispatcher.svg +1 -0
  37. data/app/assets/icons/lesli/cloud-driver.svg +1 -0
  38. data/app/assets/icons/lesli/cloud-focus.svg +1 -0
  39. data/app/assets/icons/lesli/cloud-help.svg +1 -0
  40. data/app/assets/icons/lesli/cloud-kb.svg +1 -0
  41. data/app/assets/icons/lesli/cloud-leaf.svg +1 -0
  42. data/app/assets/icons/lesli/cloud-lesli.svg +1 -0
  43. data/app/assets/icons/lesli/cloud-mailer.svg +1 -0
  44. data/app/assets/icons/lesli/cloud-one.svg +1 -0
  45. data/app/assets/icons/lesli/cloud-profile.svg +1 -0
  46. data/app/assets/icons/lesli/cloud-proposal.svg +1 -0
  47. data/app/assets/icons/lesli/cloud-scraper.svg +1 -0
  48. data/app/assets/icons/lesli/cloud-shared.svg +1 -0
  49. data/app/assets/icons/lesli/cloud-storage.svg +1 -0
  50. data/app/assets/icons/lesli/cloud-talk.svg +1 -0
  51. data/app/assets/icons/lesli/cloud-team.svg +1 -0
  52. data/app/assets/icons/lesli/cloud-time.svg +1 -0
  53. data/app/assets/icons/lesli/cloud-vault.svg +1 -0
  54. data/app/assets/icons/lesli/cloud-word.svg +1 -0
  55. data/app/assets/icons/lesli/icon-module.svg +1 -0
  56. data/app/assets/icons/lesli/logo-android.svg +1 -0
  57. data/app/assets/icons/lesli/logo-bulma.svg +1 -0
  58. data/app/assets/icons/lesli/logo-ios.svg +1 -0
  59. data/app/assets/icons/lesli/logo-linux.svg +1 -0
  60. data/app/assets/icons/lesli/logo-mac.svg +1 -0
  61. data/app/assets/icons/lesli/logo-module.svg +1 -0
  62. data/app/assets/icons/lesli/logo-postgresql.svg +1 -0
  63. data/app/assets/icons/lesli/logo-rails.svg +1 -0
  64. data/app/assets/icons/lesli/logo-ruby.svg +1 -0
  65. data/app/assets/icons/lesli/logo-sass.svg +1 -0
  66. data/app/assets/icons/lesli/logo-vue.svg +1 -0
  67. data/app/assets/icons/lesli/logo-web.svg +1 -0
  68. data/app/assets/icons/lesli/logo-windows.svg +1 -0
  69. data/app/assets/icons/readme.md +10 -0
  70. data/app/assets/images/lesli/brand/app-auth.svg +9 -0
  71. data/app/assets/images/lesli/brand/app-icon.svg +42 -0
  72. data/app/assets/images/lesli/brand/app-logo.svg +4 -0
  73. data/app/assets/images/lesli/brand/favicon.png +0 -0
  74. data/app/assets/images/lesli/brand/favicon.svg +61 -0
  75. data/app/assets/images/lesli/brand/login-background.jpg +0 -0
  76. data/app/assets/javascripts/lesli/users/sessions.js +786 -0
  77. data/app/assets/stylesheets/lesli/users/confirmations.scss +34 -0
  78. data/app/assets/stylesheets/lesli/users/devise.scss +32 -0
  79. data/app/assets/stylesheets/lesli/users/oauth.scss +34 -0
  80. data/app/assets/stylesheets/lesli/users/passwords.scss +34 -0
  81. data/app/assets/stylesheets/lesli/users/registrations.scss +34 -0
  82. data/app/assets/stylesheets/lesli/users/sessions.scss +38 -0
  83. data/app/controllers/lesli/application_controller.rb +108 -0
  84. data/app/controllers/lesli/application_devise_controller.rb +54 -0
  85. data/app/controllers/lesli/application_lesli_controller.rb +61 -0
  86. data/app/controllers/lesli/interfaces/application/authorization.rb +107 -0
  87. data/app/controllers/lesli/interfaces/application/customization.rb +46 -0
  88. data/app/controllers/lesli/interfaces/application/logger.rb +133 -0
  89. data/app/controllers/lesli/interfaces/application/requester.rb +84 -0
  90. data/app/controllers/lesli/interfaces/application/responder.rb +132 -0
  91. data/app/controllers/lesli/profiles_controller.rb +60 -0
  92. data/app/controllers/users/confirmations_controller.rb +30 -0
  93. data/app/controllers/users/omniauth_callbacks_controller.rb +30 -0
  94. data/app/controllers/users/passwords_controller.rb +34 -0
  95. data/app/controllers/users/registrations_controller.rb +62 -0
  96. data/app/controllers/users/sessions_controller.rb +142 -0
  97. data/app/controllers/users/unlocks_controller.rb +30 -0
  98. data/app/helpers/lesli/assets_helper.rb +92 -0
  99. data/app/helpers/lesli/customization_helper.rb +84 -0
  100. data/app/helpers/lesli/general_helper.rb +83 -0
  101. data/app/helpers/lesli/navigation_helper.rb +349 -0
  102. data/app/helpers/lesli/profiles_helper.rb +4 -0
  103. data/app/helpers/lesli/system_helper.rb +57 -0
  104. data/app/lib/date2.rb +192 -0
  105. data/app/lib/lesli/system.rb +80 -0
  106. data/app/models/concerns/account_engines.rb +249 -0
  107. data/app/models/concerns/user_activities.rb +163 -0
  108. data/app/models/concerns/user_extensions.rb +129 -0
  109. data/app/models/concerns/user_guard.rb +278 -0
  110. data/app/models/concerns/user_polyfill.rb +134 -0
  111. data/app/models/lesli/account/log.rb +57 -0
  112. data/app/models/lesli/account.rb +76 -0
  113. data/app/models/lesli/application_lesli_record.rb +37 -0
  114. data/app/models/lesli/profile.rb +4 -0
  115. data/app/models/lesli/system_controller/action.rb +37 -0
  116. data/app/models/lesli/system_controller.rb +37 -0
  117. data/app/models/lesli/user/agent.rb +37 -0
  118. data/app/models/lesli/user/log.rb +38 -0
  119. data/app/models/lesli/user/request.rb +37 -0
  120. data/app/models/lesli/user/session.rb +105 -0
  121. data/app/models/lesli/user.rb +162 -0
  122. data/app/services/lesli/application_lesli_service.rb +168 -0
  123. data/app/services/lesli/user/session_service.rb +62 -0
  124. data/app/validators/lesli/application_lesli_validator.rb +67 -0
  125. data/app/validators/lesli/users_validator.rb +217 -0
  126. data/app/views/devise/confirmations/new.html.erb +16 -0
  127. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  128. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  129. data/app/views/devise/mailer/password_change.html.erb +3 -0
  130. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  131. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  132. data/app/views/devise/passwords/edit.html.erb +25 -0
  133. data/app/views/devise/passwords/new.html.erb +16 -0
  134. data/app/views/devise/registrations/edit.html.erb +43 -0
  135. data/app/views/devise/registrations/new.html.erb +29 -0
  136. data/app/views/devise/sessions/new.html.erb +178 -0
  137. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  138. data/app/views/devise/shared/_links.html.erb +25 -0
  139. data/app/views/devise/unlocks/new.html.erb +16 -0
  140. data/app/views/lesli/devise/sessions/_form.html.erb +17 -0
  141. data/app/views/lesli/devise/sessions/_session.html.erb +2 -0
  142. data/app/views/lesli/devise/sessions/edit.html.erb +10 -0
  143. data/app/views/lesli/devise/sessions/index.html.erb +14 -0
  144. data/app/views/lesli/devise/sessions/new.html.erb +9 -0
  145. data/app/views/lesli/devise/sessions/show.html.erb +10 -0
  146. data/app/views/lesli/layouts/application-devise.html.erb +58 -0
  147. data/app/views/lesli/layouts/application-lesli.html.erb +57 -0
  148. data/app/views/lesli/layouts/application-public.html.erb +59 -0
  149. data/app/views/lesli/partials/_application-analytics.html.erb +71 -0
  150. data/app/views/lesli/partials/_application-data.html.erb +102 -0
  151. data/app/views/lesli/partials/_application-head.html.erb +56 -0
  152. data/app/views/lesli/partials/_application-lesli-chatbox.html.erb +35 -0
  153. data/app/views/lesli/partials/_application-lesli-content.html.erb +35 -0
  154. data/app/views/lesli/partials/_application-lesli-engines.html.erb +83 -0
  155. data/app/views/lesli/partials/_application-lesli-footer.html.erb +82 -0
  156. data/app/views/lesli/partials/_application-lesli-header.html.erb +79 -0
  157. data/app/views/lesli/partials/_application-lesli-icons.html.erb +1 -0
  158. data/app/views/lesli/partials/_application-lesli-javascript.html.erb +57 -0
  159. data/app/views/lesli/partials/_application-lesli-navigation.html.erb +52 -0
  160. data/app/views/lesli/partials/_application-lesli-notices.html.erb +43 -0
  161. data/app/views/lesli/partials/_application-lesli-panels.html.erb +58 -0
  162. data/app/views/lesli/partials/_application-lesli-scss.html.erb +60 -0
  163. data/app/views/lesli/partials/_application-lesli-sidebar.html.erb +50 -0
  164. data/app/views/lesli/partials/_application-public-footer.html.erb +51 -0
  165. data/app/views/lesli/partials/_application-public-javascript.html.erb +51 -0
  166. data/app/views/lesli/partials/_application-public-scss.html.erb +35 -0
  167. data/app/views/lesli/profiles/_form.html.erb +17 -0
  168. data/app/views/lesli/profiles/_profile.html.erb +2 -0
  169. data/app/views/lesli/profiles/edit.html.erb +10 -0
  170. data/app/views/lesli/profiles/index.html.erb +14 -0
  171. data/app/views/lesli/profiles/new.html.erb +9 -0
  172. data/app/views/lesli/profiles/show.html.erb +10 -0
  173. data/app/views/lesli/wrappers/_application-auth.html.erb +65 -0
  174. data/config/initializers/devise.rb +334 -0
  175. data/config/initializers/lesli_defaults.rb +100 -0
  176. data/config/locales/devise.en.yml +65 -0
  177. data/config/routes.rb +52 -0
  178. data/db/migrate/v1.0/0010000110_create_lesli_accounts.rb +70 -0
  179. data/db/migrate/v1.0/0010000210_create_lesli_roles.rb +59 -0
  180. data/db/migrate/v1.0/0010000310_create_lesli_users.rb +97 -0
  181. data/db/migrate/v1.0/0010000610_create_lesli_system_controllers.rb +44 -0
  182. data/db/migrate/v1.0/0010000710_create_lesli_system_controller_actions.rb +43 -0
  183. data/db/migrate/v1.0/0010001210_create_lesli_account_activities.rb +50 -0
  184. data/db/migrate/v1.0/0010001310_create_lesli_account_logs.rb +45 -0
  185. data/db/migrate/v1.0/0010003210_create_lesli_user_sessions.rb +51 -0
  186. data/db/migrate/v1.0/0010003310_create_lesli_user_requests.rb +48 -0
  187. data/db/migrate/v1.0/0010003610_create_lesli_user_logs.rb +45 -0
  188. data/db/migrate/v1.0/0010004010_create_lesli_user_agents.rb +46 -0
  189. data/db/seed/development/accounts.rb +47 -0
  190. data/db/seed/development/users.rb +53 -0
  191. data/db/seed/development.rb +35 -0
  192. data/db/seed/production.rb +35 -0
  193. data/db/seed/test.rb +35 -0
  194. data/db/seed/tools.rb +60 -0
  195. data/db/seeds.rb +64 -0
  196. data/db/structure/00000000_locations.json +32 -0
  197. data/db/structure/00000000_people.json +34 -0
  198. data/db/structure/00000003_actions.json +14 -0
  199. data/db/structure/00000004_activities.json +20 -0
  200. data/db/structure/00000005_discussions.json +8 -0
  201. data/db/structure/00000006_files.json +32 -0
  202. data/db/structure/00000007_subscribers.json +11 -0
  203. data/db/structure/00000008_custom_fields.json +8 -0
  204. data/db/structure/00000201_workflows.json +17 -0
  205. data/db/structure/00000202_workflow_statuses.json +24 -0
  206. data/db/structure/00000203_workflow_associations.json +14 -0
  207. data/db/structure/00000204_workflow_actions.json +39 -0
  208. data/db/structure/00000205_workflow_checks.json +27 -0
  209. data/db/structure/00000301_custom_fields.json +38 -0
  210. data/db/structure/00000401_custom_validations.json +14 -0
  211. data/db/structure/00000402_custom_validation_rules.json +23 -0
  212. data/db/structure/00000403_custom_validation_fields.json +14 -0
  213. data/db/structure/00000501_dashboards.json +14 -0
  214. data/db/structure/00000502_dashboard_components.json +23 -0
  215. data/db/tables/0010001010_create_account_settings.rb +42 -0
  216. data/db/tables/0010001110_create_account_locations.rb +64 -0
  217. data/db/tables/0010001410_create_account_files.rb +52 -0
  218. data/db/tables/0010001510_create_account_currencies.rb +48 -0
  219. data/db/tables/0010001610_create_account_currency_exchange_rates.rb +54 -0
  220. data/db/tables/0010003010_create_user_details.rb +49 -0
  221. data/db/tables/0010003110_create_user_settings.rb +44 -0
  222. data/db/tables/0010003410_create_user_activities.rb +51 -0
  223. data/db/tables/0010003510_create_user_roles.rb +43 -0
  224. data/db/tables/0010003710_create_user_codes.rb +43 -0
  225. data/db/tables/0010003810_create_user_shortcuts.rb +46 -0
  226. data/db/tables/0010004110_create_user_tokens.rb +45 -0
  227. data/db/tables/0010005010_create_descriptors.rb +45 -0
  228. data/db/tables/0010005110_create_descriptor_privileges.rb +44 -0
  229. data/db/tables/0010005210_create_descriptor_activities.rb +51 -0
  230. data/db/tables/0010005510_create_role_descriptors.rb +44 -0
  231. data/db/tables/0010005610_create_role_activities.rb +50 -0
  232. data/db/tables/0010005710_create_role_privileges.rb +45 -0
  233. data/db/tables/0010009010_create_feedbacks.rb +56 -0
  234. data/lib/assets/javascripts/lesli/i18n.js +1095 -0
  235. data/lib/assets/javascripts/lesli/translations.js +15 -0
  236. data/lib/lesli/configuration.rb +45 -0
  237. data/lib/lesli/engine.rb +62 -0
  238. data/lib/lesli/version.rb +34 -0
  239. data/lib/lesli.rb +6 -0
  240. data/lib/sass/lesli/bulma/loader.scss +84 -0
  241. data/lib/sass/lesli/cloud-objects/discussion.scss +77 -0
  242. data/lib/sass/lesli/cloud-objects/file.scss +138 -0
  243. data/lib/sass/lesli/components/editor-richtext.scss +78 -0
  244. data/lib/sass/lesli/components/keypad.scss +109 -0
  245. data/lib/sass/lesli/devise/confirmations.scss.erb +75 -0
  246. data/lib/sass/lesli/devise/passwords.scss.erb +86 -0
  247. data/lib/sass/lesli/devise/registrations.scss.erb +50 -0
  248. data/lib/sass/lesli/devise/sessions.scss +36 -0
  249. data/lib/sass/lesli/elements/autocomplete.scss +72 -0
  250. data/lib/sass/lesli/elements/avatar.scss +48 -0
  251. data/lib/sass/lesli/elements/calendar.scss +47 -0
  252. data/lib/sass/lesli/elements/card.scss +37 -0
  253. data/lib/sass/lesli/elements/content.scss +37 -0
  254. data/lib/sass/lesli/elements/empty.scss +43 -0
  255. data/lib/sass/lesli/elements/file-uploader.scss +74 -0
  256. data/lib/sass/lesli/elements/form.scss +43 -0
  257. data/lib/sass/lesli/elements/gallery.scss +98 -0
  258. data/lib/sass/lesli/elements/header.scss +44 -0
  259. data/lib/sass/lesli/elements/input-tag.scss +73 -0
  260. data/lib/sass/lesli/elements/loading.scss +63 -0
  261. data/lib/sass/lesli/elements/map.scss +107 -0
  262. data/lib/sass/lesli/elements/msg.scss +77 -0
  263. data/lib/sass/lesli/elements/navbar.scss +115 -0
  264. data/lib/sass/lesli/elements/panel.scss +65 -0
  265. data/lib/sass/lesli/elements/tab.scss +48 -0
  266. data/lib/sass/lesli/elements/table.scss +118 -0
  267. data/lib/sass/lesli/elements/toggle.scss +102 -0
  268. data/lib/sass/lesli/elements/toolbar.scss +66 -0
  269. data/lib/sass/lesli/fonts/families.scss +47 -0
  270. data/lib/sass/lesli/fonts/mdicons.scss +84 -0
  271. data/lib/sass/lesli/fonts/remixicons.scss +2602 -0
  272. data/lib/sass/lesli/helpers/display.scss +44 -0
  273. data/lib/sass/lesli/helpers/tooltip.scss +91 -0
  274. data/lib/sass/lesli/layouts/application-announcements.scss +40 -0
  275. data/lib/sass/lesli/layouts/application-component.scss +50 -0
  276. data/lib/sass/lesli/layouts/application-engines.scss +155 -0
  277. data/lib/sass/lesli/layouts/application-footer.scss +102 -0
  278. data/lib/sass/lesli/layouts/application-header.scss +152 -0
  279. data/lib/sass/lesli/layouts/application-navbar.scss +61 -0
  280. data/lib/sass/lesli/layouts/application-search.scss +71 -0
  281. data/lib/sass/lesli/layouts/application-sidebar.scss +219 -0
  282. data/lib/sass/lesli/overrides/sweetalert.scss +106 -0
  283. data/lib/sass/lesli/pages/dashboards.scss +57 -0
  284. data/lib/sass/lesli/pages/invites.scss +81 -0
  285. data/lib/sass/lesli/pages/mfas.scss +36 -0
  286. data/lib/sass/lesli/pages/otps.scss +36 -0
  287. data/lib/sass/lesli/pages/passes.scss +35 -0
  288. data/lib/sass/lesli/panels/panel-announcements.scss +56 -0
  289. data/lib/sass/lesli/panels/panel-notification.scss +67 -0
  290. data/lib/sass/lesli/panels/panel-profile.scss +62 -0
  291. data/lib/sass/lesli/panels/panel-tasks.scss +41 -0
  292. data/lib/sass/lesli/panels/panel-ticket.scss +57 -0
  293. data/lib/sass/lesli/settings/variables.scss +148 -0
  294. data/lib/sass/lesli/shared/workflow-status-progress.scss +135 -0
  295. data/lib/sass/lesli/templates/application.scss +141 -0
  296. data/lib/sass/lesli/templates/dashboards.scss +32 -0
  297. data/lib/sass/lesli/templates/devise.scss +185 -0
  298. data/lib/sass/lesli/templates/empty.scss +42 -0
  299. data/lib/sass/lesli/templates/pdf.scss +45 -0
  300. data/lib/sass/lesli/templates/public.scss +71 -0
  301. data/lib/tasks/db.rb +75 -0
  302. data/lib/tasks/lesli/controllers.rake +103 -0
  303. data/lib/tasks/lesli_tasks.rake +23 -0
  304. data/lib/vue/application.js +269 -0
  305. data/lib/vue/apps/cloudobjects/action.vue +193 -0
  306. data/lib/vue/apps/cloudobjects/discussion/content.vue +60 -0
  307. data/lib/vue/apps/cloudobjects/discussion/element.vue +132 -0
  308. data/lib/vue/apps/cloudobjects/discussion/filters.vue +108 -0
  309. data/lib/vue/apps/cloudobjects/discussion/new.vue +130 -0
  310. data/lib/vue/apps/cloudobjects/discussion.vue +98 -0
  311. data/lib/vue/apps/cloudobjects/file/grid.vue +215 -0
  312. data/lib/vue/apps/cloudobjects/file/list.vue +106 -0
  313. data/lib/vue/apps/cloudobjects/file.vue +145 -0
  314. data/lib/vue/apps/dashboards/apps/edit.vue +105 -0
  315. data/lib/vue/apps/dashboards/apps/index.vue +114 -0
  316. data/lib/vue/apps/dashboards/apps/new.vue +89 -0
  317. data/lib/vue/apps/dashboards/apps/show.vue +76 -0
  318. data/lib/vue/apps/dashboards/components/form.vue +267 -0
  319. data/lib/vue/apps/dashboards/components/preview.vue +172 -0
  320. data/lib/vue/apps/workflows2/apps/actions/form.vue +232 -0
  321. data/lib/vue/apps/workflows2/apps/actions/forms/chatroom-form.vue +103 -0
  322. data/lib/vue/apps/workflows2/apps/actions/forms/cloud-object-clone-form.vue +125 -0
  323. data/lib/vue/apps/workflows2/apps/actions/forms/cloud-object-file-form.vue +102 -0
  324. data/lib/vue/apps/workflows2/apps/actions/forms/email-form.vue +190 -0
  325. data/lib/vue/apps/workflows2/apps/actions/forms/notification-form.vue +124 -0
  326. data/lib/vue/apps/workflows2/apps/actions/forms/send-cloud-object-file.vue +170 -0
  327. data/lib/vue/apps/workflows2/apps/actions/forms/task-form.vue +258 -0
  328. data/lib/vue/apps/workflows2/apps/actions/index.vue +146 -0
  329. data/lib/vue/apps/workflows2/apps/checks/form.vue +200 -0
  330. data/lib/vue/apps/workflows2/apps/checks/index.vue +160 -0
  331. data/lib/vue/apps/workflows2/apps/index.vue +177 -0
  332. data/lib/vue/apps/workflows2/apps/new.vue +97 -0
  333. data/lib/vue/apps/workflows2/apps/show.vue +146 -0
  334. data/lib/vue/apps/workflows2/components/associations.vue +215 -0
  335. data/lib/vue/apps/workflows2/components/chart.vue +91 -0
  336. data/lib/vue/apps/workflows2/components/workflow-form.vue +466 -0
  337. data/lib/vue/apps/workflows2/components/workflow-status-dropdown.vue +129 -0
  338. data/lib/vue/devise/confirmations.js +33 -0
  339. data/lib/vue/devise/passwords.js +137 -0
  340. data/lib/vue/devise/registrations.js +162 -0
  341. data/lib/vue/devise/sessions.js +143 -0
  342. data/lib/vue/layouts/application-announcements.vue +78 -0
  343. data/lib/vue/layouts/application-engines.vue +66 -0
  344. data/lib/vue/layouts/application-footer.vue +123 -0
  345. data/lib/vue/layouts/application-header.vue +213 -0
  346. data/lib/vue/layouts/application-navbar.vue +110 -0
  347. data/lib/vue/layouts/application-search.vue +86 -0
  348. data/lib/vue/layouts/application-sidebar.vue +63 -0
  349. data/lib/vue/layouts/dashboard-component.vue +62 -0
  350. data/lib/vue/pages/errors/app.js +32 -0
  351. data/lib/vue/pages/invites/app.js +76 -0
  352. data/lib/vue/pages/mfas/application.js +77 -0
  353. data/lib/vue/pages/onboarding/application.js +45 -0
  354. data/lib/vue/pages/onboarding/components/address.vue +120 -0
  355. data/lib/vue/pages/onboarding/components/buttons.vue +67 -0
  356. data/lib/vue/pages/onboarding/components/contact.vue +148 -0
  357. data/lib/vue/pages/onboarding/components/date-time.vue +265 -0
  358. data/lib/vue/pages/onboarding/components/finish.vue +62 -0
  359. data/lib/vue/pages/onboarding/components/general-info.vue +93 -0
  360. data/lib/vue/pages/onboarding/components/indicators.vue +78 -0
  361. data/lib/vue/pages/onboarding/components/welcome.vue +66 -0
  362. data/lib/vue/pages/onboarding/show.vue +67 -0
  363. data/lib/vue/pages/onboarding/store.js +165 -0
  364. data/lib/vue/pages/otps/application.js +90 -0
  365. data/lib/vue/pages/passes/application.js +80 -0
  366. data/lib/vue/pages/websites/application.js +34 -0
  367. data/lib/vue/panels/panel-announcements.vue +248 -0
  368. data/lib/vue/panels/panel-files.vue +281 -0
  369. data/lib/vue/panels/panel-notifications.vue +106 -0
  370. data/lib/vue/panels/panel-profile.vue +76 -0
  371. data/lib/vue/panels/panel-tasks.vue +124 -0
  372. data/lib/vue/panels/panel-tickets.vue +181 -0
  373. data/lib/vue/public.js +85 -0
  374. data/lib/vue/stores/announcements.js +75 -0
  375. data/lib/vue/stores/cloud-bell/notification.js +114 -0
  376. data/lib/vue/stores/cloudobjects/action.js +181 -0
  377. data/lib/vue/stores/cloudobjects/discussion.js +221 -0
  378. data/lib/vue/stores/cloudobjects/file.js +205 -0
  379. data/lib/vue/stores/dashboard.js +251 -0
  380. data/lib/vue/stores/firebase.js +163 -0
  381. data/lib/vue/stores/layout.js +60 -0
  382. data/lib/vue/stores/panels/announcements.js +153 -0
  383. data/lib/vue/stores/panels/task.js +66 -0
  384. data/lib/vue/stores/panels/tickets.js +129 -0
  385. data/lib/vue/stores/profile.js +90 -0
  386. data/lib/vue/stores/search.js +154 -0
  387. data/lib/vue/stores/services/translator.js +87 -0
  388. data/lib/vue/stores/workflow.js +185 -0
  389. data/lib/vue/stores/workflow2.js +345 -0
  390. data/lib/vue/stores/workflows/actions.js +327 -0
  391. data/lib/vue/stores/workflows/associations.js +130 -0
  392. data/lib/vue/stores/workflows/checks.js +210 -0
  393. data/lib/webpack/base.js +182 -0
  394. data/lib/webpack/core.js +80 -0
  395. data/lib/webpack/engines.js +162 -0
  396. data/license +674 -0
  397. data/readme.md +120 -0
  398. 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
+ })