lesli 5.0.13 → 5.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/lesli_manifest.js +3 -6
  3. data/app/assets/images/lesli/brand/app-icon.svg +45 -39
  4. data/app/assets/javascripts/lesli/application.js +1 -0
  5. data/app/controllers/lesli/abouts_controller.rb +16 -14
  6. data/app/controllers/lesli/application_controller.rb +13 -0
  7. data/app/controllers/lesli/application_devise_controller.rb +10 -12
  8. data/app/controllers/lesli/application_lesli_controller.rb +12 -11
  9. data/app/controllers/lesli/apps_controller.rb +6 -0
  10. data/app/controllers/lesli/roles_controller.rb +2 -2
  11. data/app/helpers/lesli/general_helper.rb +18 -5
  12. data/app/helpers/lesli/html_helper.rb +8 -0
  13. data/app/helpers/lesli/navigation_helper.rb +30 -11
  14. data/app/helpers/lesli/system_helper.rb +2 -2
  15. data/app/helpers/lesli/turbo_helper.rb +58 -0
  16. data/app/interfaces/lesli/customization_interface.rb +42 -0
  17. data/app/interfaces/lesli/requester_interface.rb +103 -0
  18. data/app/interfaces/lesli/responder_interface.rb +127 -0
  19. data/app/lib/date2.rb +1 -199
  20. data/app/lib/lesli/courier.rb +54 -0
  21. data/app/mailers/lesli/application_lesli_mailer.rb +32 -59
  22. data/app/mailers/lesli/devise_mailer.rb +16 -8
  23. data/app/models/concerns/account_initializer.rb +27 -68
  24. data/app/models/concerns/lesli/has_activities.rb +29 -0
  25. data/app/models/concerns/user_extensions.rb +34 -19
  26. data/app/models/concerns/user_security.rb +4 -4
  27. data/app/models/lesli/account.rb +13 -20
  28. data/{lib/scss/layouts/application-container.scss → app/models/lesli/item/activity.rb} +11 -8
  29. data/app/models/lesli/role/{power.rb → action.rb} +6 -4
  30. data/app/models/lesli/role.rb +7 -15
  31. data/app/models/lesli/shared/catalog.rb +20 -0
  32. data/app/models/lesli/shared/dashboard.rb +1 -1
  33. data/app/models/lesli/user/activity.rb +5 -0
  34. data/app/models/lesli/user/detail.rb +5 -5
  35. data/app/models/lesli/user/{log.rb → journal.rb} +3 -3
  36. data/app/models/lesli/user/{power.rb → role.rb} +2 -3
  37. data/app/models/lesli/user/session.rb +3 -4
  38. data/app/models/lesli/user.rb +50 -46
  39. data/app/operators/lesli/controller_operator.rb +3 -1
  40. data/app/operators/lesli/{role_descriptor_operator.rb → role_operator.rb} +51 -28
  41. data/app/operators/lesli/user_registration_operator.rb +3 -2
  42. data/app/services/lesli/application_lesli_service.rb +8 -4
  43. data/app/services/lesli/role/action_service.rb +58 -0
  44. data/app/services/lesli/role_service.rb +232 -0
  45. data/app/services/lesli/{user_session_service.rb → user/session_service.rb} +23 -14
  46. data/app/services/lesli/user_service.rb +85 -1
  47. data/app/views/lesli/apps/show.html.erb +52 -0
  48. data/app/views/lesli/layouts/application-devise.html.erb +5 -7
  49. data/app/views/lesli/layouts/application-lesli.html.erb +18 -24
  50. data/app/views/lesli/partials/_application-analytics.html.erb +2 -2
  51. data/app/views/lesli/partials/_application-data.html.erb +3 -77
  52. data/app/views/lesli/partials/_application-head.html.erb +7 -4
  53. data/app/views/lesli/partials/_application-lesli-annoouncements.html.erb +49 -0
  54. data/app/views/lesli/partials/_application-lesli-header.html.erb +73 -49
  55. data/app/views/lesli/partials/_application-lesli-javascript.html.erb +3 -16
  56. data/app/views/lesli/partials/_application-lesli-navigation.html.erb +12 -9
  57. data/app/views/lesli/partials/{_application-lesli-notices.html.erb → _application-lesli-notifications.html.erb} +10 -8
  58. data/app/views/lesli/partials/_application-lesli-scss.html.erb +1 -1
  59. data/app/views/lesli/partials/_application-lesli-sidebar.html.erb +1 -1
  60. data/app/views/lesli/partials/_application-public-javascript.html.erb +1 -4
  61. data/app/views/lesli/shared/dashboards/_show.html.erb +63 -0
  62. data/app/views/lesli/wrappers/_application-devise.html.erb +4 -6
  63. data/config/importmap.rb +14 -0
  64. data/config/initializers/lesli.rb +20 -12
  65. data/config/initializers/lesli_migration_helpers.rb +61 -0
  66. data/config/locales/translations.en.yml +1 -26
  67. data/config/locales/translations.es.yml +1 -26
  68. data/config/locales/translations.fr.yml +1 -26
  69. data/config/locales/translations.it.yml +1 -26
  70. data/config/locales/translations.pt.yml +1 -26
  71. data/config/routes.rb +3 -1
  72. data/db/migrate/v1/{0010000110_create_lesli_accounts.rb → 0000000110_create_lesli_accounts.rb} +13 -12
  73. data/db/migrate/v1/0000000210_create_lesli_roles.rb +65 -0
  74. data/db/migrate/v1/0000000310_create_lesli_users.rb +99 -0
  75. data/db/migrate/v1/{0010000610_create_lesli_system_controllers.rb → 0000100110_create_lesli_system_controllers.rb} +3 -3
  76. data/db/migrate/v1/{0010000710_create_lesli_system_controller_actions.rb → 0000100210_create_lesli_system_controller_actions.rb} +3 -4
  77. data/{lib/scss/layouts/application-content.scss → db/migrate/v1/0000110310_create_lesli_account_settings.rb} +8 -6
  78. data/{app/models/lesli/user/agent.rb → db/migrate/v1/0000110410_create_lesli_account_activities.rb} +3 -3
  79. data/db/migrate/v1/0000120210_create_lesli_role_actions.rb +45 -0
  80. data/db/migrate/v1/{0010001410_create_lesli_account_logs.rb → 0000120310_create_lesli_role_privileges.rb} +8 -8
  81. data/db/{tables/0010003810_create_user_shortcuts.rb → migrate/v1/0000130210_create_lesli_user_roles.rb} +9 -12
  82. data/db/migrate/v1/0000130310_create_lesli_user_sessions.rb +56 -0
  83. data/db/{seed/production.rb → migrate/v1/0000130410_create_lesli_user_activities.rb} +7 -4
  84. data/db/{tables/0010001110_create_account_locations.rb → migrate2/0000100510_create_lesli_account_locations.rb} +6 -6
  85. data/db/{tables/0010001510_create_account_currencies.rb → migrate2/0000100610_create_lesli_account_currencies.rb} +4 -4
  86. data/db/seed/{development/accounts.rb → accounts.rb} +6 -2
  87. data/db/seed/{production/users.rb → users.rb} +4 -10
  88. data/db/seed/{tools.rb → xyz.rb} +2 -7
  89. data/db/seeds.rb +3 -2
  90. data/db/structure/00000020_catalogs.json +0 -0
  91. data/lib/generators/{application_lesli_generator.rb → application_lesli_generator_base.rb} +4 -4
  92. data/lib/generators/lesli/spec/spec_generator.rb +2 -2
  93. data/lib/generators/lesli/view/USAGE +8 -0
  94. data/lib/generators/lesli/view/templates/spec-factory.template +17 -0
  95. data/lib/generators/lesli/view/templates/spec-model.template +70 -0
  96. data/lib/generators/lesli/view/view_generator.rb +25 -0
  97. data/lib/lesli/configuration.rb +7 -10
  98. data/lib/lesli/engine.rb +22 -3
  99. data/lib/lesli/r_spec.rb +5 -2
  100. data/lib/lesli/routing.rb +42 -9
  101. data/lib/lesli/version.rb +2 -2
  102. data/lib/lesli.rb +11 -0
  103. data/lib/migrate/common.rb +94 -0
  104. data/lib/migrate/items/action_structure.rb +51 -0
  105. data/{db/migrate/v1/0010001210_create_lesli_account_activities.rb → lib/migrate/items/activity_structure.rb} +18 -16
  106. data/lib/migrate/items/attachment_structure.rb +62 -0
  107. data/{app/views/lesli/partials/_application-lesli-engines.html.erb → lib/migrate/items/discussion_structure.rb} +19 -27
  108. data/lib/migrate/items/subscriber_structure.rb +49 -0
  109. data/lib/migrate/items/version_structure.rb +53 -0
  110. data/lib/migrate/shared/account_structure.rb +21 -0
  111. data/lib/migrate/shared/catalog_structure.rb +30 -0
  112. data/lib/migrate/shared/dashboard_structure.rb +54 -0
  113. data/lib/migrate/shared/setting_structure.rb +20 -0
  114. data/lib/rspec/config/spec_coverage.rb +95 -0
  115. data/{db/migrate/v1/0010001110_create_lesli_account_settings.rb → lib/rspec/factories/lesli_account.rb} +10 -7
  116. data/{db/seed/development.rb → lib/rspec/factories/lesli_role.rb} +30 -3
  117. data/{db/seed/test.rb → lib/rspec/factories/lesli_user.rb} +32 -3
  118. data/lib/rspec/fixtures/files/lesli-icon.png +0 -0
  119. data/lib/rspec/fixtures/files/test_file_1.docx +0 -0
  120. data/{db/tables/0010001610_create_account_currency_exchange_rates.rb → lib/rspec/helpers/lesli_helper.rb} +21 -21
  121. data/lib/rspec/helpers/rails_helper.rb +134 -0
  122. data/lib/rspec/helpers/response_request_helper.rb +214 -0
  123. data/lib/rspec/helpers/response_service_helper.rb +66 -0
  124. data/lib/rspec/helpers/spec_helper.rb +99 -0
  125. data/lib/rspec/lesli_api_tester.rb +133 -0
  126. data/lib/rspec/lesli_service_tester.rb +46 -0
  127. data/{db/tables/0010001410_create_account_files.rb → lib/rspec/testers/controller.rb} +31 -20
  128. data/lib/rspec/testers/model.rb +36 -0
  129. data/lib/rspec/testers/request.rb +84 -0
  130. data/lib/tasks/lesli/db.rake +5 -3
  131. data/lib/tasks/lesli/git.rake +28 -32
  132. data/lib/tasks/lesli/github.rake +89 -0
  133. data/lib/tasks/lesli_tasks.rake +3 -3
  134. data/readme.md +28 -17
  135. metadata +134 -394
  136. data/app/assets/fonts/lesli/Domine/Domine-Variable.ttf +0 -0
  137. data/app/assets/fonts/lesli/Domine/OFL.txt +0 -97
  138. data/app/assets/fonts/lesli/MaterialDesign/icons.woff2 +0 -0
  139. data/app/assets/fonts/lesli/Montserrat/Montserrat-Variable.ttf +0 -0
  140. data/app/assets/fonts/lesli/OpenSans/OpenSans-Variable.ttf +0 -0
  141. data/app/assets/fonts/lesli/Remix/remixicon.eot +0 -0
  142. data/app/assets/fonts/lesli/Remix/remixicon.glyph.json +0 -1
  143. data/app/assets/fonts/lesli/Remix/remixicon.svg +0 -7633
  144. data/app/assets/fonts/lesli/Remix/remixicon.symbol.svg +0 -11
  145. data/app/assets/fonts/lesli/Remix/remixicon.ttf +0 -0
  146. data/app/assets/fonts/lesli/Remix/remixicon.woff +0 -0
  147. data/app/assets/fonts/lesli/Remix/remixicon.woff2 +0 -0
  148. data/app/assets/fonts/lesli/Roboto/LICENSE.txt +0 -202
  149. data/app/assets/fonts/lesli/Roboto/Roboto-Black.ttf +0 -0
  150. data/app/assets/fonts/lesli/Roboto/Roboto-BlackItalic.ttf +0 -0
  151. data/app/assets/fonts/lesli/Roboto/Roboto-Bold.ttf +0 -0
  152. data/app/assets/fonts/lesli/Roboto/Roboto-BoldItalic.ttf +0 -0
  153. data/app/assets/fonts/lesli/Roboto/Roboto-Italic.ttf +0 -0
  154. data/app/assets/fonts/lesli/Roboto/Roboto-Light.ttf +0 -0
  155. data/app/assets/fonts/lesli/Roboto/Roboto-LightItalic.ttf +0 -0
  156. data/app/assets/fonts/lesli/Roboto/Roboto-Medium.ttf +0 -0
  157. data/app/assets/fonts/lesli/Roboto/Roboto-MediumItalic.ttf +0 -0
  158. data/app/assets/fonts/lesli/Roboto/Roboto-Regular.ttf +0 -0
  159. data/app/assets/fonts/lesli/Roboto/Roboto-Thin.ttf +0 -0
  160. data/app/assets/fonts/lesli/Roboto/Roboto-ThinItalic.ttf +0 -0
  161. data/app/assets/icons/lesli/engine-admin.svg +0 -1
  162. data/app/assets/icons/lesli/engine-audit.svg +0 -1
  163. data/app/assets/icons/lesli/engine-babel.svg +0 -1
  164. data/app/assets/icons/lesli/engine-bell.svg +0 -1
  165. data/app/assets/icons/lesli/engine-books.svg +0 -1
  166. data/app/assets/icons/lesli/engine-calendar.svg +0 -1
  167. data/app/assets/icons/lesli/engine-dashboard.svg +0 -1
  168. data/app/assets/icons/lesli/engine-dispatcher.svg +0 -1
  169. data/app/assets/icons/lesli/engine-focus.svg +0 -1
  170. data/app/assets/icons/lesli/engine-kb.svg +0 -1
  171. data/app/assets/icons/lesli/engine-leaf.svg +0 -1
  172. data/app/assets/icons/lesli/engine-lesli.svg +0 -1
  173. data/app/assets/icons/lesli/engine-letter.svg +0 -1
  174. data/app/assets/icons/lesli/engine-mailer.svg +0 -1
  175. data/app/assets/icons/lesli/engine-one.svg +0 -1
  176. data/app/assets/icons/lesli/engine-profile.svg +0 -1
  177. data/app/assets/icons/lesli/engine-proposal.svg +0 -1
  178. data/app/assets/icons/lesli/engine-scraper.svg +0 -1
  179. data/app/assets/icons/lesli/engine-security.svg +0 -1
  180. data/app/assets/icons/lesli/engine-shared.svg +0 -1
  181. data/app/assets/icons/lesli/engine-shield.svg +0 -1
  182. data/app/assets/icons/lesli/engine-storage.svg +0 -1
  183. data/app/assets/icons/lesli/engine-support.svg +0 -1
  184. data/app/assets/icons/lesli/engine-talk.svg +0 -1
  185. data/app/assets/icons/lesli/engine-team.svg +0 -1
  186. data/app/assets/icons/lesli/engine-time.svg +0 -1
  187. data/app/assets/icons/lesli/locale-en.svg +0 -1
  188. data/app/assets/icons/lesli/locale-es.svg +0 -1
  189. data/app/assets/icons/lesli/locale-fr.svg +0 -1
  190. data/app/assets/icons/lesli/locale-it.svg +0 -1
  191. data/app/assets/icons/lesli/locale-pt.svg +0 -1
  192. data/app/assets/icons/readme.md +0 -10
  193. data/app/assets/javascripts/lesli/templates/application.js +0 -14
  194. data/app/assets/javascripts/lesli/templates/public.js +0 -14
  195. data/app/assets/stylesheets/lesli/templates/application.css +0 -2918
  196. data/app/assets/stylesheets/lesli/templates/public.css +0 -1
  197. data/app/controllers/lesli/interfaces/application/authorization.rb +0 -107
  198. data/app/controllers/lesli/interfaces/application/customization.rb +0 -46
  199. data/app/controllers/lesli/interfaces/application/logger.rb +0 -134
  200. data/app/controllers/lesli/interfaces/application/requester.rb +0 -84
  201. data/app/controllers/lesli/interfaces/application/responder.rb +0 -132
  202. data/app/controllers/lesli/interfaces/controllers/actions.rb +0 -250
  203. data/app/controllers/lesli/interfaces/controllers/activities.rb +0 -215
  204. data/app/controllers/lesli/interfaces/controllers/discussions.rb +0 -270
  205. data/app/controllers/lesli/interfaces/controllers/files.rb +0 -467
  206. data/app/controllers/lesli/interfaces/controllers/subscribers.rb +0 -234
  207. data/app/lib/lesli/system.rb +0 -110
  208. data/app/models/lesli/cloud_object/action.rb +0 -70
  209. data/app/models/lesli/cloud_object/activity.rb +0 -311
  210. data/app/models/lesli/cloud_object/custom_field.rb +0 -158
  211. data/app/models/lesli/cloud_object/discussion.rb +0 -219
  212. data/app/models/lesli/cloud_object/subscriber.rb +0 -186
  213. data/app/operators/lesli/descriptor_privilege_operator.rb +0 -75
  214. data/app/views/lesli/emails/devise_mailer/confirmation_instructions.html.erb +0 -23
  215. data/app/views/lesli/emails/devise_mailer/reset_password_instructions.html.erb +0 -23
  216. data/app/views/lesli/partials/_application-lesli-icons.html.erb +0 -1
  217. data/config/initializers/devise.rb +0 -336
  218. data/db/seed/development/users.rb +0 -52
  219. data/db/seed/production/accounts.rb +0 -50
  220. data/db/structure/00000000_people.json +0 -34
  221. data/db/structure/00000003_actions.json +0 -14
  222. data/db/structure/00000004_activities.json +0 -20
  223. data/db/structure/00000005_discussions.json +0 -8
  224. data/db/structure/00000006_files.json +0 -32
  225. data/db/structure/00000007_subscribers.json +0 -11
  226. data/db/structure/00000501_dashboards.json +0 -14
  227. data/db/structure/00000502_dashboard_components.json +0 -23
  228. data/db/tables/0010003410_create_user_activities.rb +0 -51
  229. data/db/tables/0010003710_create_user_codes.rb +0 -43
  230. data/db/tables/0010004110_create_user_tokens.rb +0 -45
  231. data/db/tables/0010005610_create_role_activities.rb +0 -50
  232. data/db/tables/0010009010_create_feedbacks.rb +0 -56
  233. data/lib/mailer_previews/devise_mailer_preview.rb +0 -49
  234. data/lib/scss/cloud-objects/discussion.scss +0 -80
  235. data/lib/scss/cloud-objects/file.scss +0 -138
  236. data/lib/scss/components/keypad.scss +0 -109
  237. data/lib/scss/elements/autocomplete.scss +0 -72
  238. data/lib/scss/elements/card.scss +0 -37
  239. data/lib/scss/elements/empty.scss +0 -43
  240. data/lib/scss/elements/file-uploader.scss +0 -74
  241. data/lib/scss/elements/gallery.scss +0 -98
  242. data/lib/scss/elements/input-tag.scss +0 -73
  243. data/lib/scss/elements/loading.scss +0 -63
  244. data/lib/scss/elements/map.scss +0 -107
  245. data/lib/scss/elements/navbar.scss +0 -115
  246. data/lib/scss/elements/table.scss +0 -118
  247. data/lib/scss/elements/toolbar.scss +0 -66
  248. data/lib/scss/fonts/families.scss +0 -47
  249. data/lib/scss/fonts/mdicons.scss +0 -82
  250. data/lib/scss/fonts/remixicons.scss +0 -2602
  251. data/lib/scss/helpers/display.scss +0 -44
  252. data/lib/scss/helpers/tooltip.scss +0 -91
  253. data/lib/scss/layouts/application-announcements.scss +0 -40
  254. data/lib/scss/layouts/application-component.scss +0 -39
  255. data/lib/scss/layouts/application-engines.scss +0 -125
  256. data/lib/scss/layouts/application-footer.scss +0 -102
  257. data/lib/scss/layouts/application-header.scss +0 -91
  258. data/lib/scss/layouts/application-navigation.scss +0 -79
  259. data/lib/scss/layouts/application-search.scss +0 -71
  260. data/lib/scss/layouts/application-sidebar.scss +0 -219
  261. data/lib/scss/overrides/notification.scss +0 -75
  262. data/lib/scss/overrides/sweetalert.scss +0 -106
  263. data/lib/scss/pages/devise-simple.scss +0 -89
  264. data/lib/scss/pages/devise.scss +0 -179
  265. data/lib/scss/pages/invites.scss +0 -81
  266. data/lib/scss/panels/panel-announcements.scss +0 -56
  267. data/lib/scss/panels/panel-notification.scss +0 -67
  268. data/lib/scss/panels/panel-profile.scss +0 -62
  269. data/lib/scss/panels/panel-support-ticket.scss +0 -56
  270. data/lib/scss/panels/panel-tasks.scss +0 -41
  271. data/lib/scss/settings/variables.scss +0 -148
  272. data/lib/scss/shared/workflow-status-progress.scss +0 -135
  273. data/lib/scss/templates/application.scss +0 -127
  274. data/lib/scss/templates/component.scss +0 -39
  275. data/lib/scss/templates/dashboards.scss +0 -53
  276. data/lib/scss/templates/empty.scss +0 -42
  277. data/lib/scss/templates/pdf.scss +0 -45
  278. data/lib/scss/templates/public.scss +0 -72
  279. data/lib/vue/application.js +0 -285
  280. data/lib/vue/cloudobjects/discussion/content.vue +0 -62
  281. data/lib/vue/cloudobjects/discussion/element.vue +0 -170
  282. data/lib/vue/cloudobjects/discussion/filters.vue +0 -108
  283. data/lib/vue/cloudobjects/discussion/new.vue +0 -134
  284. data/lib/vue/cloudobjects/discussion.vue +0 -99
  285. data/lib/vue/cloudobjects/stores/discussion.js +0 -212
  286. data/lib/vue/layouts/application-announcements.vue +0 -78
  287. data/lib/vue/layouts/application-component.vue +0 -38
  288. data/lib/vue/layouts/application-container.vue +0 -48
  289. data/lib/vue/layouts/application-engines.vue +0 -66
  290. data/lib/vue/layouts/application-footer.vue +0 -123
  291. data/lib/vue/layouts/application-header.vue +0 -252
  292. data/lib/vue/layouts/application-navbar.vue +0 -110
  293. data/lib/vue/layouts/application-search.vue +0 -86
  294. data/lib/vue/layouts/application-sidebar.vue +0 -63
  295. data/lib/vue/pages/errors/app.js +0 -32
  296. data/lib/vue/pages/invites/app.js +0 -76
  297. data/lib/vue/pages/mfas/application.js +0 -77
  298. data/lib/vue/pages/onboarding/application.js +0 -45
  299. data/lib/vue/pages/onboarding/components/address.vue +0 -120
  300. data/lib/vue/pages/onboarding/components/buttons.vue +0 -67
  301. data/lib/vue/pages/onboarding/components/contact.vue +0 -148
  302. data/lib/vue/pages/onboarding/components/date-time.vue +0 -265
  303. data/lib/vue/pages/onboarding/components/finish.vue +0 -62
  304. data/lib/vue/pages/onboarding/components/general-info.vue +0 -93
  305. data/lib/vue/pages/onboarding/components/indicators.vue +0 -78
  306. data/lib/vue/pages/onboarding/components/welcome.vue +0 -66
  307. data/lib/vue/pages/onboarding/show.vue +0 -67
  308. data/lib/vue/pages/onboarding/store.js +0 -165
  309. data/lib/vue/pages/otps/application.js +0 -90
  310. data/lib/vue/pages/passes/application.js +0 -80
  311. data/lib/vue/pages/websites/application.js +0 -34
  312. data/lib/vue/panels/panel-announcements.vue +0 -248
  313. data/lib/vue/panels/panel-bell-notifications.vue +0 -102
  314. data/lib/vue/panels/panel-files.vue +0 -281
  315. data/lib/vue/panels/panel-profile.vue +0 -76
  316. data/lib/vue/panels/panel-support-tickets.vue +0 -163
  317. data/lib/vue/panels/panel-tasks.vue +0 -124
  318. data/lib/vue/panels/stores/bell-notifications.js +0 -46
  319. data/lib/vue/panels/stores/support-tickets.js +0 -103
  320. data/lib/vue/public.js +0 -83
  321. data/lib/vue/refactor/shared/cloudobjects/action.vue +0 -193
  322. data/lib/vue/refactor/shared/cloudobjects/file/grid.vue +0 -215
  323. data/lib/vue/refactor/shared/cloudobjects/file/list.vue +0 -106
  324. data/lib/vue/refactor/shared/cloudobjects/file.vue +0 -145
  325. data/lib/vue/refactor/shared/workflows2/apps/actions/form.vue +0 -232
  326. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/chatroom-form.vue +0 -103
  327. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/cloud-object-clone-form.vue +0 -125
  328. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/cloud-object-file-form.vue +0 -102
  329. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/email-form.vue +0 -190
  330. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/notification-form.vue +0 -124
  331. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/send-cloud-object-file.vue +0 -170
  332. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/task-form.vue +0 -258
  333. data/lib/vue/refactor/shared/workflows2/apps/actions/index.vue +0 -146
  334. data/lib/vue/refactor/shared/workflows2/apps/checks/form.vue +0 -200
  335. data/lib/vue/refactor/shared/workflows2/apps/checks/index.vue +0 -160
  336. data/lib/vue/refactor/shared/workflows2/apps/index.vue +0 -177
  337. data/lib/vue/refactor/shared/workflows2/apps/new.vue +0 -97
  338. data/lib/vue/refactor/shared/workflows2/apps/show.vue +0 -146
  339. data/lib/vue/refactor/shared/workflows2/components/associations.vue +0 -215
  340. data/lib/vue/refactor/shared/workflows2/components/chart.vue +0 -91
  341. data/lib/vue/refactor/shared/workflows2/components/workflow-form.vue +0 -466
  342. data/lib/vue/refactor/shared/workflows2/components/workflow-status-dropdown.vue +0 -129
  343. data/lib/vue/refactor/stores/cloudobjects/action.js +0 -181
  344. data/lib/vue/refactor/stores/cloudobjects/file.js +0 -205
  345. data/lib/vue/refactor/stores/entities/announcements.js +0 -75
  346. data/lib/vue/refactor/stores/entities/dashboard.js +0 -251
  347. data/lib/vue/refactor/stores/entities/workflow.js +0 -185
  348. data/lib/vue/refactor/stores/panels/announcements.js +0 -153
  349. data/lib/vue/refactor/stores/panels/notification.js +0 -114
  350. data/lib/vue/refactor/stores/panels/task.js +0 -66
  351. data/lib/vue/refactor/stores/panels/tickets.js +0 -129
  352. data/lib/vue/refactor/stores/role.js +0 -243
  353. data/lib/vue/refactor/stores/translations.json +0 -60
  354. data/lib/vue/refactor/stores/users.js +0 -98
  355. data/lib/vue/shared/dashboards/apps/edit.vue +0 -215
  356. data/lib/vue/shared/dashboards/apps/index.vue +0 -112
  357. data/lib/vue/shared/dashboards/apps/new.vue +0 -89
  358. data/lib/vue/shared/dashboards/apps/show.vue +0 -88
  359. data/lib/vue/shared/dashboards/components/form.vue +0 -246
  360. data/lib/vue/shared/services/firebase.js +0 -163
  361. data/lib/vue/shared/services/translator.js +0 -87
  362. data/lib/vue/shared/stores/command.js +0 -154
  363. data/lib/vue/shared/stores/dashboard.js +0 -253
  364. data/lib/vue/shared/stores/layout.js +0 -61
  365. data/lib/vue/shared/stores/systemController.js +0 -67
  366. data/lib/vue/shared/stores/users.js +0 -57
  367. data/lib/vue/stores/translations.json +0 -177
  368. data/lib/vue/translation.js +0 -45
  369. data/lib/webpack/base.js +0 -191
  370. data/lib/webpack/core.js +0 -93
  371. data/lib/webpack/engines.js +0 -167
  372. data/lib/webpack/root.js +0 -105
  373. data/lib/webpack/version.js +0 -78
  374. data/vendor/bulma/LICENSE +0 -21
  375. data/vendor/bulma/bulma.sass +0 -10
  376. data/vendor/bulma/css/bulma-rtl.css +0 -11851
  377. data/vendor/bulma/css/bulma-rtl.min.css +0 -1
  378. data/vendor/bulma/css/bulma.css +0 -11851
  379. data/vendor/bulma/css/bulma.min.css +0 -1
  380. data/vendor/bulma/sass/base/_all.sass +0 -6
  381. data/vendor/bulma/sass/base/animations.sass +0 -5
  382. data/vendor/bulma/sass/base/generic.sass +0 -145
  383. data/vendor/bulma/sass/base/helpers.sass +0 -1
  384. data/vendor/bulma/sass/base/minireset.sass +0 -79
  385. data/vendor/bulma/sass/components/_all.sass +0 -15
  386. data/vendor/bulma/sass/components/breadcrumb.sass +0 -77
  387. data/vendor/bulma/sass/components/card.sass +0 -103
  388. data/vendor/bulma/sass/components/dropdown.sass +0 -83
  389. data/vendor/bulma/sass/components/level.sass +0 -79
  390. data/vendor/bulma/sass/components/media.sass +0 -59
  391. data/vendor/bulma/sass/components/menu.sass +0 -59
  392. data/vendor/bulma/sass/components/message.sass +0 -101
  393. data/vendor/bulma/sass/components/modal.sass +0 -117
  394. data/vendor/bulma/sass/components/navbar.sass +0 -446
  395. data/vendor/bulma/sass/components/pagination.sass +0 -167
  396. data/vendor/bulma/sass/components/panel.sass +0 -121
  397. data/vendor/bulma/sass/components/tabs.sass +0 -176
  398. data/vendor/bulma/sass/elements/_all.sass +0 -16
  399. data/vendor/bulma/sass/elements/box.sass +0 -26
  400. data/vendor/bulma/sass/elements/button.sass +0 -357
  401. data/vendor/bulma/sass/elements/container.sass +0 -29
  402. data/vendor/bulma/sass/elements/content.sass +0 -162
  403. data/vendor/bulma/sass/elements/form.sass +0 -1
  404. data/vendor/bulma/sass/elements/icon.sass +0 -46
  405. data/vendor/bulma/sass/elements/image.sass +0 -73
  406. data/vendor/bulma/sass/elements/notification.sass +0 -52
  407. data/vendor/bulma/sass/elements/other.sass +0 -31
  408. data/vendor/bulma/sass/elements/progress.sass +0 -73
  409. data/vendor/bulma/sass/elements/table.sass +0 -134
  410. data/vendor/bulma/sass/elements/tag.sass +0 -140
  411. data/vendor/bulma/sass/elements/title.sass +0 -70
  412. data/vendor/bulma/sass/form/_all.sass +0 -9
  413. data/vendor/bulma/sass/form/checkbox-radio.sass +0 -22
  414. data/vendor/bulma/sass/form/file.sass +0 -184
  415. data/vendor/bulma/sass/form/input-textarea.sass +0 -66
  416. data/vendor/bulma/sass/form/select.sass +0 -88
  417. data/vendor/bulma/sass/form/shared.sass +0 -60
  418. data/vendor/bulma/sass/form/tools.sass +0 -215
  419. data/vendor/bulma/sass/grid/_all.sass +0 -5
  420. data/vendor/bulma/sass/grid/columns.sass +0 -513
  421. data/vendor/bulma/sass/grid/tiles.sass +0 -36
  422. data/vendor/bulma/sass/helpers/_all.sass +0 -12
  423. data/vendor/bulma/sass/helpers/color.sass +0 -39
  424. data/vendor/bulma/sass/helpers/flexbox.sass +0 -35
  425. data/vendor/bulma/sass/helpers/float.sass +0 -10
  426. data/vendor/bulma/sass/helpers/other.sass +0 -14
  427. data/vendor/bulma/sass/helpers/overflow.sass +0 -2
  428. data/vendor/bulma/sass/helpers/position.sass +0 -7
  429. data/vendor/bulma/sass/helpers/spacing.sass +0 -31
  430. data/vendor/bulma/sass/helpers/typography.sass +0 -103
  431. data/vendor/bulma/sass/helpers/visibility.sass +0 -122
  432. data/vendor/bulma/sass/layout/_all.sass +0 -6
  433. data/vendor/bulma/sass/layout/footer.sass +0 -11
  434. data/vendor/bulma/sass/layout/hero.sass +0 -153
  435. data/vendor/bulma/sass/layout/section.sass +0 -17
  436. data/vendor/bulma/sass/utilities/_all.sass +0 -9
  437. data/vendor/bulma/sass/utilities/animations.sass +0 -1
  438. data/vendor/bulma/sass/utilities/controls.sass +0 -49
  439. data/vendor/bulma/sass/utilities/derived-variables.sass +0 -114
  440. data/vendor/bulma/sass/utilities/extends.sass +0 -25
  441. data/vendor/bulma/sass/utilities/functions.sass +0 -135
  442. data/vendor/bulma/sass/utilities/initial-variables.sass +0 -79
  443. data/vendor/bulma/sass/utilities/mixins.sass +0 -303
  444. data/vendor/lesli-css/_index.scss +0 -34
  445. data/vendor/lesli-css/lesli.scss +0 -51
  446. data/vendor/lesli-css/license +0 -28
  447. data/vendor/lesli-css/src/base/fonts.scss +0 -50
  448. data/vendor/lesli-css/src/base/normalize.scss +0 -118
  449. data/vendor/lesli-css/src/components/blockquote.scss +0 -61
  450. data/vendor/lesli-css/src/components/columns.scss +0 -92
  451. data/vendor/lesli-css/src/components/container.scss +0 -47
  452. data/vendor/lesli-css/src/components/navigation.scss +0 -59
  453. data/vendor/lesli-css/src/functions/colors.scss +0 -184
  454. data/vendor/lesli-css/src/helpers/units.scss +0 -44
  455. data/vendor/lesli-css/src/mixins/breakpoint.scss +0 -184
  456. data/vendor/lesli-css/src/mixins/flex.scss +0 -80
  457. data/vendor/lesli-css/src/mixins/scrollbar.scss +0 -46
  458. data/vendor/lesli-css/src/settings/variables.scss +0 -26
  459. data/vendor/lesli-css/tests/base/normalize.spec.scss +0 -125
  460. data/vendor/lesli-css/tests/functions/colors.spec.scss +0 -117
  461. data/vendor/lesli-css/tests/mixins/breakpoint.spec.scss +0 -429
  462. data/vendor/lesli-css/tests/mixins/scrollbar.spec.scss +0 -82
  463. data/vendor/lesli-css/vendor/normalize.scss +0 -351
  464. data/vendor/remixicon/License +0 -201
  465. data/vendor/remixicon/fonts/remixicon.css +0 -2583
  466. /data/{vendor/lesli-css/src/components/grid.scss → app/assets/stylesheets/lesli/application.css} +0 -0
  467. /data/db/migrate/v1/{0010001010_create_lesli_account_details.rb → 0000110210_create_lesli_account_details.rb} +0 -0
  468. /data/db/structure/{00000008_custom_fields.json → 00000300_custom_fields.json} +0 -0
  469. /data/lib/assets/javascripts/lesli/{i18n.js → i18n_js} +0 -0
@@ -0,0 +1,103 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module Lesli
34
+ module RequesterInterface
35
+
36
+ def set_path
37
+ @@engine_path = Lesli::Engine.routes.find_script_name({})
38
+ end
39
+
40
+ # Set the user language based on user_settings, session configuration or instance default locale
41
+ def set_locale
42
+ # get saved language in session, browser language or the default in config
43
+ # the session param is setted in settings controller through "get :language, to: "settings#language""
44
+ locale = session[:locale] || I18n.default_locale
45
+
46
+ # get user's preferred language
47
+ # IMPORTANT:
48
+ # Here it's not possible to use the methods provided by devise to check if user is
49
+ # authenticated "user_signed_in", due those methods redirects to the login controller
50
+ # if user is not authenticated; For some scenarios we need to have control of the behavior
51
+ # for not authenticated user requests, thats why here we go deeper and check if user is
52
+ # authenticated checking the warden storage
53
+ # locale = current_user.locale if warden.authenticated?
54
+
55
+ # language defined in the http header request
56
+ locale = request.headers["Require-Language"] unless request.headers["Require-Language"].blank?
57
+
58
+ # use default locale if requested language is not supported
59
+ locale = I18n.default_locale unless I18n.available_locales.include?(locale.to_sym)
60
+
61
+ # set the new locale
62
+ I18n.locale = locale
63
+ end
64
+
65
+ # Set default query params for:
66
+ def set_requester
67
+ @query = {
68
+ :search => params[:search] || nil,
69
+ :pagination => {
70
+ :perPage => (params[:perPage] ? params[:perPage].to_i : 12),
71
+ :page => (params[:page] ? params[:page].to_i : 1)
72
+ },
73
+ :order => {
74
+ :by => (params[:orderBy] || "id"),
75
+ :dir => (params[:order] || "desc")
76
+ }
77
+ }
78
+ end
79
+
80
+ def get_user_agent(as_string=true)
81
+
82
+ http_user_agent = request.env["HTTP_USER_AGENT"]
83
+
84
+ # parse user agent
85
+ user_agent = UserAgent.parse(http_user_agent)
86
+
87
+ user_agent_version = user_agent.version.to_a.first(2).join(".")
88
+
89
+ # return user agent as object
90
+ if as_string == false
91
+ return {
92
+ platform: user_agent.platform,
93
+ os: user_agent.os,
94
+ browser: user_agent.browser,
95
+ version: user_agent_version
96
+ }
97
+ end
98
+
99
+ # return user agent info as string
100
+ "#{user_agent.platform} #{user_agent.os} - #{user_agent.browser} #{user_agent_version}"
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,127 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Your Smart Business Assistant.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module Lesli
34
+ module ResponderInterface
35
+
36
+ # Return an standard http 200 respond
37
+ def respond_as_successful(payload = nil)
38
+ payload
39
+ end
40
+
41
+ # Usage example
42
+ # tasks = Task
43
+ # .joins(:detail)
44
+ # .page(query[:pagination][:page])
45
+ # .per(query[:pagination][:perPage])
46
+ #
47
+ # respond_with_pagination(tasks)
48
+ #
49
+ # IMPORTANT: It is strictly necessary to use the pagination methods
50
+ # to make this work properly
51
+ def respond_as_pagination(payload)
52
+ {
53
+ pagination: {
54
+ page: payload.current_page,
55
+ pages: payload.total_pages,
56
+ total: payload.total_count,
57
+ results: payload.length
58
+ },
59
+ records: payload
60
+ }
61
+ end
62
+
63
+
64
+
65
+
66
+ def respond_with_successful(payload = nil)
67
+ respond_with_http(200, respond_as_successful(payload))
68
+ end
69
+
70
+ def respond_with_pagination(payload)
71
+ respond_with_http(200, respond_as_pagination(payload))
72
+ end
73
+
74
+ # JSON not found response
75
+ def respond_with_not_found
76
+ respond_with_http(404, {
77
+ message: I18n.t("core.shared.messages_danger_not_found")
78
+ })
79
+ end
80
+
81
+ # JSON not found response
82
+ def respond_with_unauthorized(detail = {})
83
+ error_object = {}
84
+
85
+ error_object[:message] = I18n.t("core.shared.view_text_unauthorized_request")
86
+ error_object[:detail] = detail if Rails.env == "development"
87
+
88
+ error_object[:role] = "( #{current_user.lesliroles.map(&:name).join(', ')} )" if (Rails.env == "development") && !current_user.blank?
89
+
90
+ respond_to do |format|
91
+ format.json { render status: 401, json: error_object.to_json }
92
+ format.html { redirect_to "/401" } if Rails.env == "production"
93
+ format.html { render status: 401, json: error_object.to_json }
94
+ # format.xlsx { redirect_to "/401" } if Rails.env == "production"
95
+ # format.xlsx { render status: 401, json: error_object.to_json }
96
+ end
97
+ end
98
+
99
+ # JSON failure response due users has to perform an action
100
+ # example: respond_with_action({ :redirect => "telephone_confirmation" })
101
+ def respond_with_action(action, message = "Action Required")
102
+ respond_with_http(490, { :message => message, :action => action })
103
+ end
104
+
105
+ # JSON failure response
106
+ def respond_with_error(message = "", details = [])
107
+ # Message should be a String
108
+ message = "" unless message.instance_of?(String)
109
+
110
+ # TODO:
111
+ # check if active error and then:
112
+ # message = error message to sentence
113
+ # details = error array of messages
114
+ # check another types of errors and parse respond according
115
+ respond_with_http(400, { :message => message, :details => details })
116
+ end
117
+
118
+ # Respond with an standard http message
119
+ def respond_with_http(status, payload)
120
+ unless payload.nil?
121
+ return render(:status => status, content_type: "application/json", json: payload.to_json)
122
+ end
123
+
124
+ render(:status => status, content_type: "application/json", json: "")
125
+ end
126
+ end
127
+ end
data/app/lib/date2.rb CHANGED
@@ -1,200 +1,2 @@
1
- =begin
2
-
3
- Lesli
4
-
5
- Copyright (c) 2023, Lesli Technologies, S. A.
6
-
7
- This program is free software: you can redistribute it and/or modify
8
- it under the terms of the GNU General Public License as published by
9
- the Free Software Foundation, either version 3 of the License, or
10
- (at your option) any later version.
11
-
12
- This program is distributed in the hope that it will be useful,
13
- but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- GNU General Public License for more details.
16
-
17
- You should have received a copy of the GNU General Public License
18
- along with this program. If not, see http://www.gnu.org/licenses/.
19
-
20
- Lesli · Ruby on Rails SaaS Development Framework.
21
-
22
- Made with ♥ by https://www.lesli.tech
23
- Building a better future, one line of code at a time.
24
-
25
- @contact hello@lesli.tech
26
- @website https://www.lesli.tech
27
- @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
-
29
- // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
- // ·
31
- =end
32
-
33
- class Date2
34
-
35
- def initialize(datetime = Time.current, format = "%Y-%m-%d %H:%M:%S")
36
-
37
- # NOTE: user should be able to change this through settings table
38
- # get initial datetime configuration
39
- config = Lesli.config.datetime
40
-
41
-
42
- # NOTE: Do not modify settings here,
43
- # if you need a different date format you should change it in the config file
44
- # Check the docs for more information: /development/docs/rails-lib-time
45
-
46
- # configuration example
47
- # @settings = {
48
- # :time_zone => config[:time_zone],
49
- # :start_week_on => config[:start_week_on],
50
- # :format => {
51
- # :date => "%d.%m.%Y",
52
- # :time => "%H:%M %p", # 12 hours datetime format
53
- # :time => "%H:%M", # 24 hours datetime format (default)
54
- # :date_time => "%d.%m.%Y %I:%M %p", # 12 hours datetime format
55
- # :date_time => "%d.%m.%Y %H:%M", # 24 hours datetime format (default)
56
- # :date_words => "%A, %B %d, %Y",
57
- # :date_time_words => "%A, %B %d, %Y, %I:%M %p", # 12 hours datetime in words format
58
- # :date_time_words => "%A, %B %d, %Y, %H:%M" # 24 hours datetime in words format (default)
59
- # }
60
- # }
61
-
62
- @settings = {
63
- :time_zone => config[:time_zone],
64
- :start_week_on => config[:start_week_on],
65
- :format => {
66
- :date => "%d.%m.%Y",
67
- :time => "%H:%M",
68
- :date_time => config[:formats][:date_time],
69
- :date_words => "%A, %B %d, %Y",
70
- :date_time_words => "%A, %B %d, %Y, %I:%M %p", # 12 hours datetime in words format
71
- :date_time_words => "%A, %B %d, %Y, %H:%M" # 24 hours datetime in words format (default)
72
- }
73
- }
74
-
75
-
76
- # default date format
77
- @format = set_format(:date)
78
-
79
-
80
- # get a valid timezone
81
- @zone = ActiveSupport::TimeZone.new(@settings[:time_zone])
82
-
83
-
84
- # get datetime object from user params
85
- @datetime = parse_initial_datetime(datetime, format).in_time_zone(@zone)
86
-
87
- end
88
-
89
- # set date format and return Date2 instance
90
- def date
91
- set_format(:date)
92
- self
93
- end
94
-
95
- # set time format and return Date2 instance
96
- def time
97
- set_format(:time)
98
- self
99
- end
100
-
101
- # set date_time format and return Date2 instance
102
- def date_time
103
- set_format(:date_time)
104
- self
105
- end
106
-
107
- # set date_words format and return Date2 instance
108
- def date_words
109
- set_format(:date_words)
110
- self
111
- end
112
-
113
- # set date_time_words format and return Date2 instance
114
- def date_time_words
115
- set_format(:date_time_words)
116
- self
117
- end
118
-
119
- # return query string to get timestamps columns from database
120
- def db_timestamps table=""
121
-
122
- # avoid ambiguous columns
123
- table = table.concat(".") if table != ""
124
-
125
- # get right format for dates
126
- format = self.db_format
127
-
128
- "TO_CHAR(#{table}created_at at time zone 'utc' at time zone '#{@settings[:time_zone]}', '#{format}') as created_at_date, TO_CHAR(#{table}updated_at at time zone 'utc' at time zone '#{@settings[:time_zone]}', '#{format}') as updated_at_date"
129
-
130
- end
131
-
132
- # return query string to get a datetime column from database
133
- def db_column column, table=""
134
-
135
- # avoid ambiguous columns
136
- table = table.concat(".") if table != ""
137
-
138
- # get right format for dates
139
- format = self.db_format
140
-
141
- # compatibility for SQLite
142
- if ActiveRecord::Base.connection.adapter_name == "SQLite"
143
- return "strftime('#{format}', #{table}#{column}) as #{column}_string"
144
- end
145
-
146
- "TO_CHAR(#{table}#{column} at time zone 'utc' at time zone '#{@settings[:time_zone]}', '#{format}') as #{column}_string"
147
-
148
- end
149
-
150
- # convert a datetime object to string representation using defined format
151
- def to_s
152
- @datetime.strftime(@format)
153
- end
154
-
155
- def get
156
- @datetime
157
- end
158
-
159
- private
160
-
161
-
162
- # get datetime object or string datetime and return a datetime object
163
- def parse_initial_datetime datetime, format
164
-
165
- return datetime if datetime.is_a?(Time)
166
-
167
- if datetime.is_a?(::String) and datetime.size == 25 and datetime[10] == "T"
168
- return ::DateTime.iso8601(datetime)
169
- end
170
-
171
- return ::DateTime.strptime(datetime, format)
172
- end
173
-
174
-
175
- def set_format format
176
- @format = @settings[:format][format || :date]
177
- end
178
-
179
-
180
- def db_format
181
- format = @format
182
-
183
- # SQLite format dates are the same of ruby format
184
- return format if ActiveRecord::Base.connection.adapter_name == "SQLite"
185
-
186
- # Convert Ruby to postgresql date format
187
- format = format.gsub("%Y", "YYYY")
188
- format = format.gsub("%m", "MM")
189
- format = format.gsub("%d", "DD")
190
-
191
- # Convert Ruby to postgresql time format
192
- format = format.gsub("%H", "HH24") # 24 hours format
193
- format = format.gsub("%I", "HH12") # 12 hours format
194
- format = format.gsub("%p", "AM") # Meridian indicator (AM/PM)
195
- format = format.gsub("%M", "MI")
196
-
197
- format
198
- end
199
-
1
+ class Date2 < LesliDate::Formatter
200
2
  end
@@ -0,0 +1,54 @@
1
+ module Lesli
2
+ class Courier
3
+
4
+ # Store the module_name (e.g., :lesli_support as LesliSupport)
5
+ def initialize(module_name, on_error=nil)
6
+ @module_name = module_name.to_s.camelize
7
+ @on_error=on_error
8
+ end
9
+
10
+ # Dynamically determine the class to call (e.g., :ticket_service as TicketService)
11
+ def from(service_name, *args)
12
+ @service_params = args
13
+ @service_name = service_name.to_s.camelize
14
+ self
15
+ end
16
+
17
+ # Store the method name to call on the service (e.g., :index_with_deadline)
18
+ def call(method_name, *args)
19
+ @method_params = args
20
+ @method_name = method_name
21
+ self.execute
22
+ end
23
+
24
+ private
25
+
26
+ # Execute the final call to the service, either with or without params
27
+ def execute
28
+
29
+ module_name = "#{@module_name}"
30
+
31
+ # Look up the module and class dynamically
32
+ return @on_error unless Object.const_defined?(module_name)
33
+
34
+ module_service_name = "#{@module_name}::#{@service_name}"
35
+
36
+ return @on_error unless Object.const_defined?(module_service_name)
37
+
38
+ # Create a reference of the module service object
39
+ module_service_class = module_service_name.constantize
40
+
41
+ # Instantiate the service class with or without arguments
42
+ module_service_instance = module_service_class.new(*@service_params.to_a)
43
+
44
+ # Check if the method is defined on the service instance
45
+ return @on_error unless module_service_instance.respond_to?(@method_name)
46
+
47
+ # Dynamically call the method on the service instance
48
+ module_service_instance.send(@method_name)
49
+
50
+ rescue
51
+ return @on_error
52
+ end
53
+ end
54
+ end
@@ -34,61 +34,31 @@ module Lesli
34
34
  class ApplicationLesliMailer < ActionMailer::Base
35
35
 
36
36
  # Set a dynamic template according to the engine that is sending the email
37
- # this is equivalent to: default template_path: -> { "engine_name/emails" }
38
- =begin
39
- default(
40
-
41
- from: -> {
42
-
43
- instance = Rails.application.config.lesli.dig(:instance)
44
-
45
- # add custom email name for emails sent from www.lesli.cloud
46
- if instance[:code] == 'lesli_cloud'
47
- return email_address_with_name(
48
- Rails.configuration.lesli.dig(:env, :action_mailer, :default_options_from),
49
- "Lesli"
50
- )
51
- end
52
-
53
- Rails.configuration.lesli.dig(:env, :action_mailer, :default_options_from)
54
-
55
- },
56
-
57
- template_path: -> {
58
-
59
- instance = Rails.application.config.lesli.dig(:instance)
60
-
61
- # get class that is executing the mailer
62
- module_info = self.class.name.split("::")
63
-
64
- # mailers from engines
65
- if module_info.length > 1
66
- return "#{ instance[:code] }/emails/#{(module_info[0].underscore)}/#{ module_info[1].underscore }"
67
- end
68
-
69
- # mailers from core
70
- return "#{ instance[:code] }/emails/#{ module_info[0].underscore }"
37
+ default(template_path: Lesli.config.mailer.dig(:templates))
71
38
 
72
- }
73
-
74
- )
75
- =end
76
39
  #after_action :log_mail_requests
77
40
 
78
- #default(template_path: "lesli/emails/devise_mailer")
79
-
80
41
  def initialize
81
42
 
82
43
  super
83
44
 
84
- # some @email data is defined on: LesliMails/src/partials/data.html
85
-
86
- @email = {}
45
+ @app = {}
87
46
  @custom = {}
88
- @params = {
89
- :host => default_url_options[:host] || ""
90
- }
47
+ @params = {}
48
+ end
91
49
 
50
+ def build_url(path, params = {})
51
+ default_url = Rails.application.config.action_mailer.default_url_options
52
+ host = default_url[:host].to_s.sub(/\Ahttps?:\/\//, "")
53
+ scheme = default_url[:protocol]&.delete(":") || "http"
54
+
55
+ URI::Generic.build(
56
+ scheme: scheme,
57
+ host: host,
58
+ port: default_url[:port],
59
+ path: path,
60
+ query: params.to_query.presence
61
+ ).to_s
92
62
  end
93
63
 
94
64
  protected
@@ -97,6 +67,8 @@ module Lesli
97
67
 
98
68
  @params = @params.merge(params)
99
69
 
70
+ build_app_from_params(params)
71
+
100
72
  mail(
101
73
  to: to,
102
74
  subject: subject,
@@ -109,21 +81,20 @@ module Lesli
109
81
 
110
82
  def build_app_from_params(params)
111
83
 
112
- @app[:host] = default_url_options[:host]
113
- # @app[:company] = {
114
- # id: 0,
115
- # name: "",
116
- # tag_line: "",
117
- # }
118
-
119
- # return if params[:user].blank? || params[:user].class.name != "User"
84
+ @app[:host] = build_url("/")
85
+ @app[:company] = {
86
+ id: 0,
87
+ name: "",
88
+ tag_line: "",
89
+ }
120
90
 
121
- # @app[:company] = {
122
- # id: params[:user].account.id,
123
- # name: params[:user].account.company_name,
124
- # tag_line: params[:user].account.company_tag_line,
125
- # }
91
+ return if params[:user].blank? || params[:user].class.name != "Lesli::User"
126
92
 
93
+ @app[:company] = {
94
+ id: params[:user].account.id,
95
+ name: params[:user].account.name,
96
+ #tag_line: params[:user].account.company_tag_line,
97
+ }
127
98
  end
128
99
 
129
100
  def build_customization_from_params(params)
@@ -174,6 +145,8 @@ module Lesli
174
145
  }
175
146
  end
176
147
 
148
+ if defined? LesliMailer
149
+ end
177
150
  # TODO: Save template path and view used within the email
178
151
  Account::Log.log_email(
179
152
  "#{self.class.to_s}/#{self.action_name}",
@@ -1,23 +1,21 @@
1
1
  module Lesli
2
2
  class DeviseMailer < ApplicationLesliMailer
3
3
 
4
- default(template_path: "lesli/emails/devise_mailer")
5
-
6
4
  # Sends an email with instructions to allow the user reset the password
7
5
  def reset_password_instructions(user, token, opts = {})
8
6
 
9
7
  # defaults for new accounts/users
10
- email_template = "reset_password_instructions"
8
+ email_template = "devise/reset_password_instructions"
11
9
  email_subject = I18n.t("core.users/confirmations.mailer_email_verification")
12
10
 
13
11
  # email parameters
14
12
  params = {
15
- url: "/password/edit?reset_password_token=#{token}",
16
- user_name: user.full_name
13
+ url: build_url("/password/edit", { reset_password_token: token}),
14
+ full_name: user.full_name
17
15
  }
18
16
 
19
17
  # send email
20
- pp email(
18
+ email(
21
19
  params,
22
20
  to: user.email,
23
21
  subject: email_subject,
@@ -29,7 +27,7 @@ module Lesli
29
27
  def confirmation_instructions(user, token, opts = {})
30
28
 
31
29
  # defaults for new accounts/users
32
- email_template = "confirmation_instructions"
30
+ email_template = "devise/confirmation_instructions"
33
31
  email_subject = I18n.t("core.users/confirmations.mailer_email_verification")
34
32
 
35
33
  # # custom email and subject if user is changin his email address
@@ -44,7 +42,7 @@ module Lesli
44
42
 
45
43
  # email parameters
46
44
  params = {
47
- url: "/confirmation?confirmation_token=#{token}"
45
+ url: build_url("/confirmation", { confirmation_token: token})
48
46
  }
49
47
 
50
48
  # send email
@@ -55,5 +53,15 @@ module Lesli
55
53
  template_name: email_template
56
54
  )
57
55
  end
56
+
57
+ def welcome(user)
58
+ email_recipient = user.unconfirmed_email || user.email
59
+ email(
60
+ { :user => user },
61
+ to: email_recipient,
62
+ subject: "test",
63
+ template_name: "devise/welcome"
64
+ )
65
+ end
58
66
  end
59
67
  end