lesli 5.0.13 → 5.0.15

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 (472) 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 +20 -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/abouts/welcome.html.erb +144 -0
  48. data/app/views/lesli/apps/show.html.erb +52 -0
  49. data/app/views/lesli/layouts/application-devise.html.erb +5 -7
  50. data/app/views/lesli/layouts/application-lesli.html.erb +18 -24
  51. data/app/views/lesli/layouts/application-public.html.erb +1 -2
  52. data/app/views/lesli/partials/_application-analytics.html.erb +2 -2
  53. data/app/views/lesli/partials/_application-data.html.erb +3 -77
  54. data/app/views/lesli/partials/_application-head.html.erb +7 -4
  55. data/app/views/lesli/partials/_application-lesli-annoouncements.html.erb +49 -0
  56. data/app/views/lesli/partials/_application-lesli-header.html.erb +73 -49
  57. data/app/views/lesli/partials/_application-lesli-javascript.html.erb +3 -16
  58. data/app/views/lesli/partials/_application-lesli-navigation.html.erb +12 -9
  59. data/app/views/lesli/partials/{_application-lesli-notices.html.erb → _application-lesli-notifications.html.erb} +10 -8
  60. data/app/views/lesli/partials/_application-lesli-scss.html.erb +1 -1
  61. data/app/views/lesli/partials/_application-lesli-sidebar.html.erb +1 -1
  62. data/app/views/lesli/partials/_application-public-javascript.html.erb +1 -4
  63. data/app/views/lesli/partials/_application-public-scss.html.erb +1 -1
  64. data/app/views/lesli/shared/dashboards/_show.html.erb +63 -0
  65. data/app/views/lesli/wrappers/_application-devise.html.erb +4 -6
  66. data/config/importmap.rb +14 -0
  67. data/config/initializers/lesli.rb +20 -12
  68. data/config/initializers/lesli_migration_helpers.rb +61 -0
  69. data/config/locales/translations.en.yml +1 -26
  70. data/config/locales/translations.es.yml +1 -26
  71. data/config/locales/translations.fr.yml +1 -26
  72. data/config/locales/translations.it.yml +1 -26
  73. data/config/locales/translations.pt.yml +1 -26
  74. data/config/routes.rb +3 -1
  75. data/db/migrate/v1/{0010000110_create_lesli_accounts.rb → 0000000110_create_lesli_accounts.rb} +13 -12
  76. data/db/migrate/v1/0000000210_create_lesli_roles.rb +65 -0
  77. data/db/migrate/v1/0000000310_create_lesli_users.rb +99 -0
  78. data/db/migrate/v1/{0010000610_create_lesli_system_controllers.rb → 0000100110_create_lesli_system_controllers.rb} +3 -3
  79. data/db/migrate/v1/{0010000710_create_lesli_system_controller_actions.rb → 0000100210_create_lesli_system_controller_actions.rb} +3 -4
  80. data/{lib/scss/layouts/application-content.scss → db/migrate/v1/0000110310_create_lesli_account_settings.rb} +8 -6
  81. data/{app/models/lesli/user/agent.rb → db/migrate/v1/0000110410_create_lesli_account_activities.rb} +3 -3
  82. data/db/migrate/v1/0000120210_create_lesli_role_actions.rb +45 -0
  83. data/db/migrate/v1/{0010001410_create_lesli_account_logs.rb → 0000120310_create_lesli_role_privileges.rb} +8 -8
  84. data/db/{tables/0010003810_create_user_shortcuts.rb → migrate/v1/0000130210_create_lesli_user_roles.rb} +9 -12
  85. data/db/migrate/v1/0000130310_create_lesli_user_sessions.rb +56 -0
  86. data/db/{seed/production.rb → migrate/v1/0000130410_create_lesli_user_activities.rb} +7 -4
  87. data/db/{tables/0010001110_create_account_locations.rb → migrate2/0000100510_create_lesli_account_locations.rb} +6 -6
  88. data/db/{tables/0010001510_create_account_currencies.rb → migrate2/0000100610_create_lesli_account_currencies.rb} +4 -4
  89. data/db/seed/{development/accounts.rb → accounts.rb} +6 -2
  90. data/db/seed/{production/users.rb → users.rb} +4 -10
  91. data/db/seed/{tools.rb → xyz.rb} +2 -7
  92. data/db/seeds.rb +3 -2
  93. data/db/structure/00000020_catalogs.json +0 -0
  94. data/lib/generators/{application_lesli_generator.rb → application_lesli_generator_base.rb} +4 -4
  95. data/lib/generators/lesli/spec/spec_generator.rb +2 -2
  96. data/lib/generators/lesli/view/USAGE +8 -0
  97. data/lib/generators/lesli/view/templates/spec-factory.template +17 -0
  98. data/lib/generators/lesli/view/templates/spec-model.template +70 -0
  99. data/lib/generators/lesli/view/view_generator.rb +25 -0
  100. data/lib/lesli/configuration.rb +7 -10
  101. data/lib/lesli/engine.rb +27 -3
  102. data/lib/lesli/r_spec.rb +5 -2
  103. data/lib/lesli/routing.rb +42 -9
  104. data/lib/lesli/version.rb +2 -2
  105. data/lib/lesli.rb +11 -0
  106. data/lib/migrate/common.rb +94 -0
  107. data/lib/migrate/items/action_structure.rb +51 -0
  108. data/{db/migrate/v1/0010001210_create_lesli_account_activities.rb → lib/migrate/items/activity_structure.rb} +18 -16
  109. data/lib/migrate/items/attachment_structure.rb +62 -0
  110. data/{app/views/lesli/partials/_application-lesli-engines.html.erb → lib/migrate/items/discussion_structure.rb} +19 -27
  111. data/lib/migrate/items/subscriber_structure.rb +49 -0
  112. data/lib/migrate/items/version_structure.rb +53 -0
  113. data/lib/migrate/shared/account_structure.rb +21 -0
  114. data/lib/migrate/shared/catalog_structure.rb +30 -0
  115. data/lib/migrate/shared/dashboard_structure.rb +54 -0
  116. data/lib/migrate/shared/setting_structure.rb +20 -0
  117. data/lib/rspec/config/spec_coverage.rb +95 -0
  118. data/{db/migrate/v1/0010001110_create_lesli_account_settings.rb → lib/rspec/factories/lesli_account.rb} +10 -7
  119. data/{db/seed/development.rb → lib/rspec/factories/lesli_role.rb} +30 -3
  120. data/{db/seed/test.rb → lib/rspec/factories/lesli_user.rb} +32 -3
  121. data/lib/rspec/fixtures/files/lesli-icon.png +0 -0
  122. data/lib/rspec/fixtures/files/test_file_1.docx +0 -0
  123. data/{db/tables/0010001610_create_account_currency_exchange_rates.rb → lib/rspec/helpers/lesli_helper.rb} +21 -21
  124. data/lib/rspec/helpers/rails_helper.rb +134 -0
  125. data/lib/rspec/helpers/response_request_helper.rb +214 -0
  126. data/lib/rspec/helpers/response_service_helper.rb +66 -0
  127. data/lib/rspec/helpers/spec_helper.rb +99 -0
  128. data/lib/rspec/lesli_api_tester.rb +133 -0
  129. data/lib/rspec/lesli_service_tester.rb +46 -0
  130. data/{db/tables/0010001410_create_account_files.rb → lib/rspec/testers/controller.rb} +31 -20
  131. data/lib/rspec/testers/model.rb +36 -0
  132. data/lib/rspec/testers/request.rb +84 -0
  133. data/lib/tasks/lesli/db.rake +5 -3
  134. data/lib/tasks/lesli/git.rake +28 -32
  135. data/lib/tasks/lesli/github.rake +89 -0
  136. data/lib/tasks/lesli_tasks.rake +3 -3
  137. data/readme.md +28 -17
  138. metadata +148 -393
  139. data/app/assets/fonts/lesli/Domine/Domine-Variable.ttf +0 -0
  140. data/app/assets/fonts/lesli/Domine/OFL.txt +0 -97
  141. data/app/assets/fonts/lesli/MaterialDesign/icons.woff2 +0 -0
  142. data/app/assets/fonts/lesli/Montserrat/Montserrat-Variable.ttf +0 -0
  143. data/app/assets/fonts/lesli/OpenSans/OpenSans-Variable.ttf +0 -0
  144. data/app/assets/fonts/lesli/Remix/remixicon.eot +0 -0
  145. data/app/assets/fonts/lesli/Remix/remixicon.glyph.json +0 -1
  146. data/app/assets/fonts/lesli/Remix/remixicon.svg +0 -7633
  147. data/app/assets/fonts/lesli/Remix/remixicon.symbol.svg +0 -11
  148. data/app/assets/fonts/lesli/Remix/remixicon.ttf +0 -0
  149. data/app/assets/fonts/lesli/Remix/remixicon.woff +0 -0
  150. data/app/assets/fonts/lesli/Remix/remixicon.woff2 +0 -0
  151. data/app/assets/fonts/lesli/Roboto/LICENSE.txt +0 -202
  152. data/app/assets/fonts/lesli/Roboto/Roboto-Black.ttf +0 -0
  153. data/app/assets/fonts/lesli/Roboto/Roboto-BlackItalic.ttf +0 -0
  154. data/app/assets/fonts/lesli/Roboto/Roboto-Bold.ttf +0 -0
  155. data/app/assets/fonts/lesli/Roboto/Roboto-BoldItalic.ttf +0 -0
  156. data/app/assets/fonts/lesli/Roboto/Roboto-Italic.ttf +0 -0
  157. data/app/assets/fonts/lesli/Roboto/Roboto-Light.ttf +0 -0
  158. data/app/assets/fonts/lesli/Roboto/Roboto-LightItalic.ttf +0 -0
  159. data/app/assets/fonts/lesli/Roboto/Roboto-Medium.ttf +0 -0
  160. data/app/assets/fonts/lesli/Roboto/Roboto-MediumItalic.ttf +0 -0
  161. data/app/assets/fonts/lesli/Roboto/Roboto-Regular.ttf +0 -0
  162. data/app/assets/fonts/lesli/Roboto/Roboto-Thin.ttf +0 -0
  163. data/app/assets/fonts/lesli/Roboto/Roboto-ThinItalic.ttf +0 -0
  164. data/app/assets/icons/lesli/engine-admin.svg +0 -1
  165. data/app/assets/icons/lesli/engine-audit.svg +0 -1
  166. data/app/assets/icons/lesli/engine-babel.svg +0 -1
  167. data/app/assets/icons/lesli/engine-bell.svg +0 -1
  168. data/app/assets/icons/lesli/engine-books.svg +0 -1
  169. data/app/assets/icons/lesli/engine-calendar.svg +0 -1
  170. data/app/assets/icons/lesli/engine-dashboard.svg +0 -1
  171. data/app/assets/icons/lesli/engine-dispatcher.svg +0 -1
  172. data/app/assets/icons/lesli/engine-focus.svg +0 -1
  173. data/app/assets/icons/lesli/engine-kb.svg +0 -1
  174. data/app/assets/icons/lesli/engine-leaf.svg +0 -1
  175. data/app/assets/icons/lesli/engine-lesli.svg +0 -1
  176. data/app/assets/icons/lesli/engine-letter.svg +0 -1
  177. data/app/assets/icons/lesli/engine-mailer.svg +0 -1
  178. data/app/assets/icons/lesli/engine-one.svg +0 -1
  179. data/app/assets/icons/lesli/engine-profile.svg +0 -1
  180. data/app/assets/icons/lesli/engine-proposal.svg +0 -1
  181. data/app/assets/icons/lesli/engine-scraper.svg +0 -1
  182. data/app/assets/icons/lesli/engine-security.svg +0 -1
  183. data/app/assets/icons/lesli/engine-shared.svg +0 -1
  184. data/app/assets/icons/lesli/engine-shield.svg +0 -1
  185. data/app/assets/icons/lesli/engine-storage.svg +0 -1
  186. data/app/assets/icons/lesli/engine-support.svg +0 -1
  187. data/app/assets/icons/lesli/engine-talk.svg +0 -1
  188. data/app/assets/icons/lesli/engine-team.svg +0 -1
  189. data/app/assets/icons/lesli/engine-time.svg +0 -1
  190. data/app/assets/icons/lesli/locale-en.svg +0 -1
  191. data/app/assets/icons/lesli/locale-es.svg +0 -1
  192. data/app/assets/icons/lesli/locale-fr.svg +0 -1
  193. data/app/assets/icons/lesli/locale-it.svg +0 -1
  194. data/app/assets/icons/lesli/locale-pt.svg +0 -1
  195. data/app/assets/icons/readme.md +0 -10
  196. data/app/assets/javascripts/lesli/templates/application.js +0 -14
  197. data/app/assets/javascripts/lesli/templates/public.js +0 -14
  198. data/app/assets/stylesheets/lesli/templates/application.css +0 -2918
  199. data/app/assets/stylesheets/lesli/templates/public.css +0 -1
  200. data/app/controllers/lesli/interfaces/application/authorization.rb +0 -107
  201. data/app/controllers/lesli/interfaces/application/customization.rb +0 -46
  202. data/app/controllers/lesli/interfaces/application/logger.rb +0 -134
  203. data/app/controllers/lesli/interfaces/application/requester.rb +0 -84
  204. data/app/controllers/lesli/interfaces/application/responder.rb +0 -132
  205. data/app/controllers/lesli/interfaces/controllers/actions.rb +0 -250
  206. data/app/controllers/lesli/interfaces/controllers/activities.rb +0 -215
  207. data/app/controllers/lesli/interfaces/controllers/discussions.rb +0 -270
  208. data/app/controllers/lesli/interfaces/controllers/files.rb +0 -467
  209. data/app/controllers/lesli/interfaces/controllers/subscribers.rb +0 -234
  210. data/app/lib/lesli/system.rb +0 -110
  211. data/app/models/lesli/cloud_object/action.rb +0 -70
  212. data/app/models/lesli/cloud_object/activity.rb +0 -311
  213. data/app/models/lesli/cloud_object/custom_field.rb +0 -158
  214. data/app/models/lesli/cloud_object/discussion.rb +0 -219
  215. data/app/models/lesli/cloud_object/subscriber.rb +0 -186
  216. data/app/operators/lesli/descriptor_privilege_operator.rb +0 -75
  217. data/app/views/lesli/emails/devise_mailer/confirmation_instructions.html.erb +0 -23
  218. data/app/views/lesli/emails/devise_mailer/reset_password_instructions.html.erb +0 -23
  219. data/app/views/lesli/partials/_application-lesli-icons.html.erb +0 -1
  220. data/config/initializers/devise.rb +0 -336
  221. data/db/seed/development/users.rb +0 -52
  222. data/db/seed/production/accounts.rb +0 -50
  223. data/db/structure/00000000_people.json +0 -34
  224. data/db/structure/00000003_actions.json +0 -14
  225. data/db/structure/00000004_activities.json +0 -20
  226. data/db/structure/00000005_discussions.json +0 -8
  227. data/db/structure/00000006_files.json +0 -32
  228. data/db/structure/00000007_subscribers.json +0 -11
  229. data/db/structure/00000501_dashboards.json +0 -14
  230. data/db/structure/00000502_dashboard_components.json +0 -23
  231. data/db/tables/0010003410_create_user_activities.rb +0 -51
  232. data/db/tables/0010003710_create_user_codes.rb +0 -43
  233. data/db/tables/0010004110_create_user_tokens.rb +0 -45
  234. data/db/tables/0010005610_create_role_activities.rb +0 -50
  235. data/db/tables/0010009010_create_feedbacks.rb +0 -56
  236. data/lib/mailer_previews/devise_mailer_preview.rb +0 -49
  237. data/lib/scss/cloud-objects/discussion.scss +0 -80
  238. data/lib/scss/cloud-objects/file.scss +0 -138
  239. data/lib/scss/components/keypad.scss +0 -109
  240. data/lib/scss/elements/autocomplete.scss +0 -72
  241. data/lib/scss/elements/card.scss +0 -37
  242. data/lib/scss/elements/empty.scss +0 -43
  243. data/lib/scss/elements/file-uploader.scss +0 -74
  244. data/lib/scss/elements/gallery.scss +0 -98
  245. data/lib/scss/elements/input-tag.scss +0 -73
  246. data/lib/scss/elements/loading.scss +0 -63
  247. data/lib/scss/elements/map.scss +0 -107
  248. data/lib/scss/elements/navbar.scss +0 -115
  249. data/lib/scss/elements/table.scss +0 -118
  250. data/lib/scss/elements/toolbar.scss +0 -66
  251. data/lib/scss/fonts/families.scss +0 -47
  252. data/lib/scss/fonts/mdicons.scss +0 -82
  253. data/lib/scss/fonts/remixicons.scss +0 -2602
  254. data/lib/scss/helpers/display.scss +0 -44
  255. data/lib/scss/helpers/tooltip.scss +0 -91
  256. data/lib/scss/layouts/application-announcements.scss +0 -40
  257. data/lib/scss/layouts/application-component.scss +0 -39
  258. data/lib/scss/layouts/application-engines.scss +0 -125
  259. data/lib/scss/layouts/application-footer.scss +0 -102
  260. data/lib/scss/layouts/application-header.scss +0 -91
  261. data/lib/scss/layouts/application-navigation.scss +0 -79
  262. data/lib/scss/layouts/application-search.scss +0 -71
  263. data/lib/scss/layouts/application-sidebar.scss +0 -219
  264. data/lib/scss/overrides/notification.scss +0 -75
  265. data/lib/scss/overrides/sweetalert.scss +0 -106
  266. data/lib/scss/pages/devise-simple.scss +0 -89
  267. data/lib/scss/pages/devise.scss +0 -179
  268. data/lib/scss/pages/invites.scss +0 -81
  269. data/lib/scss/panels/panel-announcements.scss +0 -56
  270. data/lib/scss/panels/panel-notification.scss +0 -67
  271. data/lib/scss/panels/panel-profile.scss +0 -62
  272. data/lib/scss/panels/panel-support-ticket.scss +0 -56
  273. data/lib/scss/panels/panel-tasks.scss +0 -41
  274. data/lib/scss/settings/variables.scss +0 -148
  275. data/lib/scss/shared/workflow-status-progress.scss +0 -135
  276. data/lib/scss/templates/application.scss +0 -127
  277. data/lib/scss/templates/component.scss +0 -39
  278. data/lib/scss/templates/dashboards.scss +0 -53
  279. data/lib/scss/templates/empty.scss +0 -42
  280. data/lib/scss/templates/pdf.scss +0 -45
  281. data/lib/scss/templates/public.scss +0 -72
  282. data/lib/vue/application.js +0 -285
  283. data/lib/vue/cloudobjects/discussion/content.vue +0 -62
  284. data/lib/vue/cloudobjects/discussion/element.vue +0 -170
  285. data/lib/vue/cloudobjects/discussion/filters.vue +0 -108
  286. data/lib/vue/cloudobjects/discussion/new.vue +0 -134
  287. data/lib/vue/cloudobjects/discussion.vue +0 -99
  288. data/lib/vue/cloudobjects/stores/discussion.js +0 -212
  289. data/lib/vue/layouts/application-announcements.vue +0 -78
  290. data/lib/vue/layouts/application-component.vue +0 -38
  291. data/lib/vue/layouts/application-container.vue +0 -48
  292. data/lib/vue/layouts/application-engines.vue +0 -66
  293. data/lib/vue/layouts/application-footer.vue +0 -123
  294. data/lib/vue/layouts/application-header.vue +0 -252
  295. data/lib/vue/layouts/application-navbar.vue +0 -110
  296. data/lib/vue/layouts/application-search.vue +0 -86
  297. data/lib/vue/layouts/application-sidebar.vue +0 -63
  298. data/lib/vue/pages/errors/app.js +0 -32
  299. data/lib/vue/pages/invites/app.js +0 -76
  300. data/lib/vue/pages/mfas/application.js +0 -77
  301. data/lib/vue/pages/onboarding/application.js +0 -45
  302. data/lib/vue/pages/onboarding/components/address.vue +0 -120
  303. data/lib/vue/pages/onboarding/components/buttons.vue +0 -67
  304. data/lib/vue/pages/onboarding/components/contact.vue +0 -148
  305. data/lib/vue/pages/onboarding/components/date-time.vue +0 -265
  306. data/lib/vue/pages/onboarding/components/finish.vue +0 -62
  307. data/lib/vue/pages/onboarding/components/general-info.vue +0 -93
  308. data/lib/vue/pages/onboarding/components/indicators.vue +0 -78
  309. data/lib/vue/pages/onboarding/components/welcome.vue +0 -66
  310. data/lib/vue/pages/onboarding/show.vue +0 -67
  311. data/lib/vue/pages/onboarding/store.js +0 -165
  312. data/lib/vue/pages/otps/application.js +0 -90
  313. data/lib/vue/pages/passes/application.js +0 -80
  314. data/lib/vue/pages/websites/application.js +0 -34
  315. data/lib/vue/panels/panel-announcements.vue +0 -248
  316. data/lib/vue/panels/panel-bell-notifications.vue +0 -102
  317. data/lib/vue/panels/panel-files.vue +0 -281
  318. data/lib/vue/panels/panel-profile.vue +0 -76
  319. data/lib/vue/panels/panel-support-tickets.vue +0 -163
  320. data/lib/vue/panels/panel-tasks.vue +0 -124
  321. data/lib/vue/panels/stores/bell-notifications.js +0 -46
  322. data/lib/vue/panels/stores/support-tickets.js +0 -103
  323. data/lib/vue/public.js +0 -83
  324. data/lib/vue/refactor/shared/cloudobjects/action.vue +0 -193
  325. data/lib/vue/refactor/shared/cloudobjects/file/grid.vue +0 -215
  326. data/lib/vue/refactor/shared/cloudobjects/file/list.vue +0 -106
  327. data/lib/vue/refactor/shared/cloudobjects/file.vue +0 -145
  328. data/lib/vue/refactor/shared/workflows2/apps/actions/form.vue +0 -232
  329. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/chatroom-form.vue +0 -103
  330. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/cloud-object-clone-form.vue +0 -125
  331. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/cloud-object-file-form.vue +0 -102
  332. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/email-form.vue +0 -190
  333. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/notification-form.vue +0 -124
  334. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/send-cloud-object-file.vue +0 -170
  335. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/task-form.vue +0 -258
  336. data/lib/vue/refactor/shared/workflows2/apps/actions/index.vue +0 -146
  337. data/lib/vue/refactor/shared/workflows2/apps/checks/form.vue +0 -200
  338. data/lib/vue/refactor/shared/workflows2/apps/checks/index.vue +0 -160
  339. data/lib/vue/refactor/shared/workflows2/apps/index.vue +0 -177
  340. data/lib/vue/refactor/shared/workflows2/apps/new.vue +0 -97
  341. data/lib/vue/refactor/shared/workflows2/apps/show.vue +0 -146
  342. data/lib/vue/refactor/shared/workflows2/components/associations.vue +0 -215
  343. data/lib/vue/refactor/shared/workflows2/components/chart.vue +0 -91
  344. data/lib/vue/refactor/shared/workflows2/components/workflow-form.vue +0 -466
  345. data/lib/vue/refactor/shared/workflows2/components/workflow-status-dropdown.vue +0 -129
  346. data/lib/vue/refactor/stores/cloudobjects/action.js +0 -181
  347. data/lib/vue/refactor/stores/cloudobjects/file.js +0 -205
  348. data/lib/vue/refactor/stores/entities/announcements.js +0 -75
  349. data/lib/vue/refactor/stores/entities/dashboard.js +0 -251
  350. data/lib/vue/refactor/stores/entities/workflow.js +0 -185
  351. data/lib/vue/refactor/stores/panels/announcements.js +0 -153
  352. data/lib/vue/refactor/stores/panels/notification.js +0 -114
  353. data/lib/vue/refactor/stores/panels/task.js +0 -66
  354. data/lib/vue/refactor/stores/panels/tickets.js +0 -129
  355. data/lib/vue/refactor/stores/role.js +0 -243
  356. data/lib/vue/refactor/stores/translations.json +0 -60
  357. data/lib/vue/refactor/stores/users.js +0 -98
  358. data/lib/vue/shared/dashboards/apps/edit.vue +0 -215
  359. data/lib/vue/shared/dashboards/apps/index.vue +0 -112
  360. data/lib/vue/shared/dashboards/apps/new.vue +0 -89
  361. data/lib/vue/shared/dashboards/apps/show.vue +0 -88
  362. data/lib/vue/shared/dashboards/components/form.vue +0 -246
  363. data/lib/vue/shared/services/firebase.js +0 -163
  364. data/lib/vue/shared/services/translator.js +0 -87
  365. data/lib/vue/shared/stores/command.js +0 -154
  366. data/lib/vue/shared/stores/dashboard.js +0 -253
  367. data/lib/vue/shared/stores/layout.js +0 -61
  368. data/lib/vue/shared/stores/systemController.js +0 -67
  369. data/lib/vue/shared/stores/users.js +0 -57
  370. data/lib/vue/stores/translations.json +0 -177
  371. data/lib/vue/translation.js +0 -45
  372. data/lib/webpack/base.js +0 -191
  373. data/lib/webpack/core.js +0 -93
  374. data/lib/webpack/engines.js +0 -167
  375. data/lib/webpack/root.js +0 -105
  376. data/lib/webpack/version.js +0 -78
  377. data/vendor/bulma/LICENSE +0 -21
  378. data/vendor/bulma/bulma.sass +0 -10
  379. data/vendor/bulma/css/bulma-rtl.css +0 -11851
  380. data/vendor/bulma/css/bulma-rtl.min.css +0 -1
  381. data/vendor/bulma/css/bulma.css +0 -11851
  382. data/vendor/bulma/css/bulma.min.css +0 -1
  383. data/vendor/bulma/sass/base/_all.sass +0 -6
  384. data/vendor/bulma/sass/base/animations.sass +0 -5
  385. data/vendor/bulma/sass/base/generic.sass +0 -145
  386. data/vendor/bulma/sass/base/helpers.sass +0 -1
  387. data/vendor/bulma/sass/base/minireset.sass +0 -79
  388. data/vendor/bulma/sass/components/_all.sass +0 -15
  389. data/vendor/bulma/sass/components/breadcrumb.sass +0 -77
  390. data/vendor/bulma/sass/components/card.sass +0 -103
  391. data/vendor/bulma/sass/components/dropdown.sass +0 -83
  392. data/vendor/bulma/sass/components/level.sass +0 -79
  393. data/vendor/bulma/sass/components/media.sass +0 -59
  394. data/vendor/bulma/sass/components/menu.sass +0 -59
  395. data/vendor/bulma/sass/components/message.sass +0 -101
  396. data/vendor/bulma/sass/components/modal.sass +0 -117
  397. data/vendor/bulma/sass/components/navbar.sass +0 -446
  398. data/vendor/bulma/sass/components/pagination.sass +0 -167
  399. data/vendor/bulma/sass/components/panel.sass +0 -121
  400. data/vendor/bulma/sass/components/tabs.sass +0 -176
  401. data/vendor/bulma/sass/elements/_all.sass +0 -16
  402. data/vendor/bulma/sass/elements/box.sass +0 -26
  403. data/vendor/bulma/sass/elements/button.sass +0 -357
  404. data/vendor/bulma/sass/elements/container.sass +0 -29
  405. data/vendor/bulma/sass/elements/content.sass +0 -162
  406. data/vendor/bulma/sass/elements/form.sass +0 -1
  407. data/vendor/bulma/sass/elements/icon.sass +0 -46
  408. data/vendor/bulma/sass/elements/image.sass +0 -73
  409. data/vendor/bulma/sass/elements/notification.sass +0 -52
  410. data/vendor/bulma/sass/elements/other.sass +0 -31
  411. data/vendor/bulma/sass/elements/progress.sass +0 -73
  412. data/vendor/bulma/sass/elements/table.sass +0 -134
  413. data/vendor/bulma/sass/elements/tag.sass +0 -140
  414. data/vendor/bulma/sass/elements/title.sass +0 -70
  415. data/vendor/bulma/sass/form/_all.sass +0 -9
  416. data/vendor/bulma/sass/form/checkbox-radio.sass +0 -22
  417. data/vendor/bulma/sass/form/file.sass +0 -184
  418. data/vendor/bulma/sass/form/input-textarea.sass +0 -66
  419. data/vendor/bulma/sass/form/select.sass +0 -88
  420. data/vendor/bulma/sass/form/shared.sass +0 -60
  421. data/vendor/bulma/sass/form/tools.sass +0 -215
  422. data/vendor/bulma/sass/grid/_all.sass +0 -5
  423. data/vendor/bulma/sass/grid/columns.sass +0 -513
  424. data/vendor/bulma/sass/grid/tiles.sass +0 -36
  425. data/vendor/bulma/sass/helpers/_all.sass +0 -12
  426. data/vendor/bulma/sass/helpers/color.sass +0 -39
  427. data/vendor/bulma/sass/helpers/flexbox.sass +0 -35
  428. data/vendor/bulma/sass/helpers/float.sass +0 -10
  429. data/vendor/bulma/sass/helpers/other.sass +0 -14
  430. data/vendor/bulma/sass/helpers/overflow.sass +0 -2
  431. data/vendor/bulma/sass/helpers/position.sass +0 -7
  432. data/vendor/bulma/sass/helpers/spacing.sass +0 -31
  433. data/vendor/bulma/sass/helpers/typography.sass +0 -103
  434. data/vendor/bulma/sass/helpers/visibility.sass +0 -122
  435. data/vendor/bulma/sass/layout/_all.sass +0 -6
  436. data/vendor/bulma/sass/layout/footer.sass +0 -11
  437. data/vendor/bulma/sass/layout/hero.sass +0 -153
  438. data/vendor/bulma/sass/layout/section.sass +0 -17
  439. data/vendor/bulma/sass/utilities/_all.sass +0 -9
  440. data/vendor/bulma/sass/utilities/animations.sass +0 -1
  441. data/vendor/bulma/sass/utilities/controls.sass +0 -49
  442. data/vendor/bulma/sass/utilities/derived-variables.sass +0 -114
  443. data/vendor/bulma/sass/utilities/extends.sass +0 -25
  444. data/vendor/bulma/sass/utilities/functions.sass +0 -135
  445. data/vendor/bulma/sass/utilities/initial-variables.sass +0 -79
  446. data/vendor/bulma/sass/utilities/mixins.sass +0 -303
  447. data/vendor/lesli-css/_index.scss +0 -34
  448. data/vendor/lesli-css/lesli.scss +0 -51
  449. data/vendor/lesli-css/license +0 -28
  450. data/vendor/lesli-css/src/base/fonts.scss +0 -50
  451. data/vendor/lesli-css/src/base/normalize.scss +0 -118
  452. data/vendor/lesli-css/src/components/blockquote.scss +0 -61
  453. data/vendor/lesli-css/src/components/columns.scss +0 -92
  454. data/vendor/lesli-css/src/components/container.scss +0 -47
  455. data/vendor/lesli-css/src/components/navigation.scss +0 -59
  456. data/vendor/lesli-css/src/functions/colors.scss +0 -184
  457. data/vendor/lesli-css/src/helpers/units.scss +0 -44
  458. data/vendor/lesli-css/src/mixins/breakpoint.scss +0 -184
  459. data/vendor/lesli-css/src/mixins/flex.scss +0 -80
  460. data/vendor/lesli-css/src/mixins/scrollbar.scss +0 -46
  461. data/vendor/lesli-css/src/settings/variables.scss +0 -26
  462. data/vendor/lesli-css/tests/base/normalize.spec.scss +0 -125
  463. data/vendor/lesli-css/tests/functions/colors.spec.scss +0 -117
  464. data/vendor/lesli-css/tests/mixins/breakpoint.spec.scss +0 -429
  465. data/vendor/lesli-css/tests/mixins/scrollbar.spec.scss +0 -82
  466. data/vendor/lesli-css/vendor/normalize.scss +0 -351
  467. data/vendor/remixicon/License +0 -201
  468. data/vendor/remixicon/fonts/remixicon.css +0 -2583
  469. /data/{vendor/lesli-css/src/components/grid.scss → app/assets/stylesheets/lesli/application.css} +0 -0
  470. /data/db/migrate/v1/{0010001010_create_lesli_account_details.rb → 0000110210_create_lesli_account_details.rb} +0 -0
  471. /data/db/structure/{00000008_custom_fields.json → 00000300_custom_fields.json} +0 -0
  472. /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