lesli 5.0.12 → 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 (477) 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/images/lesli/brand/app-logo.png +0 -0
  5. data/app/assets/javascripts/lesli/application.js +1 -0
  6. data/app/controllers/lesli/abouts_controller.rb +16 -14
  7. data/app/controllers/lesli/application_controller.rb +14 -0
  8. data/app/controllers/lesli/application_devise_controller.rb +10 -12
  9. data/app/controllers/lesli/application_lesli_controller.rb +12 -11
  10. data/app/controllers/lesli/apps_controller.rb +6 -0
  11. data/app/controllers/lesli/roles_controller.rb +2 -2
  12. data/app/helpers/lesli/assets_helper.rb +24 -6
  13. data/app/helpers/lesli/general_helper.rb +18 -5
  14. data/app/helpers/lesli/html_helper.rb +8 -0
  15. data/app/helpers/lesli/navigation_helper.rb +43 -20
  16. data/app/helpers/lesli/system_helper.rb +2 -2
  17. data/app/helpers/lesli/turbo_helper.rb +58 -0
  18. data/app/interfaces/lesli/customization_interface.rb +42 -0
  19. data/app/interfaces/lesli/requester_interface.rb +103 -0
  20. data/app/interfaces/lesli/responder_interface.rb +127 -0
  21. data/app/lib/date2.rb +1 -191
  22. data/app/lib/lesli/courier.rb +54 -0
  23. data/app/mailers/lesli/application_lesli_mailer.rb +32 -59
  24. data/app/mailers/lesli/devise_mailer.rb +16 -8
  25. data/app/models/concerns/account_initializer.rb +27 -68
  26. data/app/models/concerns/lesli/has_activities.rb +29 -0
  27. data/app/models/concerns/user_extensions.rb +34 -13
  28. data/app/models/concerns/user_security.rb +4 -4
  29. data/app/models/lesli/account.rb +13 -20
  30. data/{lib/scss/layouts/application-container.scss → app/models/lesli/item/activity.rb} +11 -8
  31. data/app/models/lesli/role/{power.rb → action.rb} +6 -4
  32. data/app/models/lesli/role.rb +7 -15
  33. data/app/models/lesli/shared/catalog.rb +20 -0
  34. data/app/models/lesli/shared/dashboard.rb +1 -1
  35. data/app/models/lesli/user/activity.rb +5 -0
  36. data/app/models/lesli/user/detail.rb +5 -5
  37. data/app/models/lesli/user/{log.rb → journal.rb} +3 -3
  38. data/app/models/lesli/user/{power.rb → role.rb} +2 -3
  39. data/app/models/lesli/user/session.rb +3 -4
  40. data/app/models/lesli/user.rb +50 -46
  41. data/app/operators/lesli/controller_operator.rb +7 -2
  42. data/app/operators/lesli/{role_descriptor_operator.rb → role_operator.rb} +51 -28
  43. data/app/operators/lesli/user_registration_operator.rb +3 -2
  44. data/app/services/lesli/application_lesli_service.rb +8 -4
  45. data/app/services/lesli/role/action_service.rb +58 -0
  46. data/app/services/lesli/role_service.rb +232 -0
  47. data/app/services/lesli/{user_session_service.rb → user/session_service.rb} +23 -14
  48. data/app/services/lesli/user_service.rb +86 -2
  49. data/app/views/lesli/apps/show.html.erb +52 -0
  50. data/app/views/lesli/layouts/application-devise.html.erb +5 -7
  51. data/app/views/lesli/layouts/application-lesli.html.erb +18 -22
  52. data/app/views/lesli/partials/_application-analytics.html.erb +2 -2
  53. data/app/views/lesli/partials/_application-data.html.erb +5 -79
  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 +88 -39
  57. data/app/views/lesli/partials/_application-lesli-javascript.html.erb +5 -18
  58. data/app/views/lesli/partials/_application-lesli-navigation.html.erb +17 -7
  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 +3 -3
  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/shared/dashboards/_show.html.erb +63 -0
  64. data/app/views/lesli/wrappers/_application-devise-simple.erb +1 -1
  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 +27 -13
  68. data/config/initializers/lesli_migration_helpers.rb +61 -0
  69. data/config/locales/translations.en.yml +1 -24
  70. data/config/locales/translations.es.yml +1 -24
  71. data/config/locales/translations.fr.yml +1 -24
  72. data/config/locales/translations.it.yml +1 -24
  73. data/config/locales/translations.pt.yml +1 -24
  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/db/{seed/production.rb → migrate/v1/0000110310_create_lesli_account_settings.rb} +6 -3
  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/migrate/v1/0000130410_create_lesli_user_activities.rb +37 -0
  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_base.rb +164 -0
  95. data/lib/generators/lesli/spec/USAGE +8 -0
  96. data/lib/generators/lesli/spec/spec_generator.rb +25 -0
  97. data/lib/generators/lesli/spec/templates/spec-factory.template +17 -0
  98. data/lib/generators/lesli/spec/templates/spec-model.template +70 -0
  99. data/lib/generators/lesli/view/USAGE +8 -0
  100. data/lib/generators/lesli/view/templates/spec-factory.template +17 -0
  101. data/lib/generators/lesli/view/templates/spec-model.template +70 -0
  102. data/lib/generators/lesli/view/view_generator.rb +25 -0
  103. data/lib/lesli/configuration.rb +8 -11
  104. data/lib/lesli/engine.rb +24 -6
  105. data/lib/lesli/r_spec.rb +43 -0
  106. data/lib/lesli/routing.rb +90 -0
  107. data/lib/lesli/version.rb +2 -2
  108. data/lib/lesli.rb +13 -0
  109. data/lib/migrate/common.rb +94 -0
  110. data/lib/migrate/items/action_structure.rb +51 -0
  111. data/{db/migrate/v1/0010001210_create_lesli_account_activities.rb → lib/migrate/items/activity_structure.rb} +18 -16
  112. data/lib/migrate/items/attachment_structure.rb +62 -0
  113. data/{app/views/lesli/partials/_application-lesli-engines.html.erb → lib/migrate/items/discussion_structure.rb} +19 -27
  114. data/lib/migrate/items/subscriber_structure.rb +49 -0
  115. data/lib/migrate/items/version_structure.rb +53 -0
  116. data/lib/migrate/shared/account_structure.rb +21 -0
  117. data/lib/migrate/shared/catalog_structure.rb +30 -0
  118. data/lib/migrate/shared/dashboard_structure.rb +54 -0
  119. data/lib/migrate/shared/setting_structure.rb +20 -0
  120. data/lib/rspec/config/spec_coverage.rb +95 -0
  121. data/{db/migrate/v1/0010001110_create_lesli_account_settings.rb → lib/rspec/factories/lesli_account.rb} +10 -7
  122. data/{db/seed/development.rb → lib/rspec/factories/lesli_role.rb} +30 -3
  123. data/{db/seed/test.rb → lib/rspec/factories/lesli_user.rb} +32 -3
  124. data/lib/rspec/fixtures/files/lesli-icon.png +0 -0
  125. data/lib/rspec/fixtures/files/test_file_1.docx +0 -0
  126. data/{db/tables/0010001610_create_account_currency_exchange_rates.rb → lib/rspec/helpers/lesli_helper.rb} +21 -21
  127. data/lib/rspec/helpers/rails_helper.rb +134 -0
  128. data/lib/rspec/helpers/response_request_helper.rb +214 -0
  129. data/lib/rspec/helpers/response_service_helper.rb +66 -0
  130. data/lib/rspec/helpers/spec_helper.rb +99 -0
  131. data/lib/rspec/lesli_api_tester.rb +133 -0
  132. data/lib/rspec/lesli_service_tester.rb +46 -0
  133. data/{db/tables/0010001410_create_account_files.rb → lib/rspec/testers/controller.rb} +31 -20
  134. data/lib/rspec/testers/model.rb +36 -0
  135. data/lib/rspec/testers/request.rb +84 -0
  136. data/lib/tasks/lesli/db.rake +5 -3
  137. data/lib/tasks/lesli/git.rake +28 -32
  138. data/lib/tasks/lesli/github.rake +89 -0
  139. data/lib/tasks/lesli_tasks.rake +6 -6
  140. data/readme.md +28 -17
  141. metadata +132 -399
  142. data/app/assets/fonts/lesli/Domine/Domine-Variable.ttf +0 -0
  143. data/app/assets/fonts/lesli/Domine/OFL.txt +0 -97
  144. data/app/assets/fonts/lesli/MaterialDesign/icons.woff2 +0 -0
  145. data/app/assets/fonts/lesli/Montserrat/Montserrat-Variable.ttf +0 -0
  146. data/app/assets/fonts/lesli/OpenSans/OpenSans-Variable.ttf +0 -0
  147. data/app/assets/fonts/lesli/Remix/remixicon.eot +0 -0
  148. data/app/assets/fonts/lesli/Remix/remixicon.glyph.json +0 -1
  149. data/app/assets/fonts/lesli/Remix/remixicon.svg +0 -7633
  150. data/app/assets/fonts/lesli/Remix/remixicon.symbol.svg +0 -11
  151. data/app/assets/fonts/lesli/Remix/remixicon.ttf +0 -0
  152. data/app/assets/fonts/lesli/Remix/remixicon.woff +0 -0
  153. data/app/assets/fonts/lesli/Remix/remixicon.woff2 +0 -0
  154. data/app/assets/fonts/lesli/Roboto/LICENSE.txt +0 -202
  155. data/app/assets/fonts/lesli/Roboto/Roboto-Black.ttf +0 -0
  156. data/app/assets/fonts/lesli/Roboto/Roboto-BlackItalic.ttf +0 -0
  157. data/app/assets/fonts/lesli/Roboto/Roboto-Bold.ttf +0 -0
  158. data/app/assets/fonts/lesli/Roboto/Roboto-BoldItalic.ttf +0 -0
  159. data/app/assets/fonts/lesli/Roboto/Roboto-Italic.ttf +0 -0
  160. data/app/assets/fonts/lesli/Roboto/Roboto-Light.ttf +0 -0
  161. data/app/assets/fonts/lesli/Roboto/Roboto-LightItalic.ttf +0 -0
  162. data/app/assets/fonts/lesli/Roboto/Roboto-Medium.ttf +0 -0
  163. data/app/assets/fonts/lesli/Roboto/Roboto-MediumItalic.ttf +0 -0
  164. data/app/assets/fonts/lesli/Roboto/Roboto-Regular.ttf +0 -0
  165. data/app/assets/fonts/lesli/Roboto/Roboto-Thin.ttf +0 -0
  166. data/app/assets/fonts/lesli/Roboto/Roboto-ThinItalic.ttf +0 -0
  167. data/app/assets/icons/lesli/engine-admin.svg +0 -1
  168. data/app/assets/icons/lesli/engine-audit.svg +0 -1
  169. data/app/assets/icons/lesli/engine-babel.svg +0 -1
  170. data/app/assets/icons/lesli/engine-bell.svg +0 -1
  171. data/app/assets/icons/lesli/engine-books.svg +0 -1
  172. data/app/assets/icons/lesli/engine-calendar.svg +0 -1
  173. data/app/assets/icons/lesli/engine-dashboard.svg +0 -1
  174. data/app/assets/icons/lesli/engine-dispatcher.svg +0 -1
  175. data/app/assets/icons/lesli/engine-focus.svg +0 -1
  176. data/app/assets/icons/lesli/engine-kb.svg +0 -1
  177. data/app/assets/icons/lesli/engine-leaf.svg +0 -1
  178. data/app/assets/icons/lesli/engine-lesli.svg +0 -1
  179. data/app/assets/icons/lesli/engine-letter.svg +0 -1
  180. data/app/assets/icons/lesli/engine-mailer.svg +0 -1
  181. data/app/assets/icons/lesli/engine-one.svg +0 -1
  182. data/app/assets/icons/lesli/engine-profile.svg +0 -1
  183. data/app/assets/icons/lesli/engine-proposal.svg +0 -1
  184. data/app/assets/icons/lesli/engine-scraper.svg +0 -1
  185. data/app/assets/icons/lesli/engine-security.svg +0 -1
  186. data/app/assets/icons/lesli/engine-shared.svg +0 -1
  187. data/app/assets/icons/lesli/engine-shield.svg +0 -1
  188. data/app/assets/icons/lesli/engine-storage.svg +0 -1
  189. data/app/assets/icons/lesli/engine-support.svg +0 -1
  190. data/app/assets/icons/lesli/engine-talk.svg +0 -1
  191. data/app/assets/icons/lesli/engine-team.svg +0 -1
  192. data/app/assets/icons/lesli/engine-time.svg +0 -1
  193. data/app/assets/icons/lesli/locale-en.svg +0 -1
  194. data/app/assets/icons/lesli/locale-es.svg +0 -1
  195. data/app/assets/icons/lesli/locale-fr.svg +0 -1
  196. data/app/assets/icons/lesli/locale-it.svg +0 -1
  197. data/app/assets/icons/lesli/locale-pt.svg +0 -1
  198. data/app/assets/icons/readme.md +0 -10
  199. data/app/assets/stylesheets/lesli/templates/application.css +0 -23499
  200. data/app/assets/stylesheets/lesli/templates/public.css +0 -19098
  201. data/app/assets/stylesheets/lesli/users/confirmations.css +0 -19219
  202. data/app/assets/stylesheets/lesli/users/passwords.css +0 -19202
  203. data/app/assets/stylesheets/lesli/users/registrations.css +0 -19594
  204. data/app/assets/stylesheets/lesli/users/sessions.css +0 -19594
  205. data/app/controllers/lesli/interfaces/application/authorization.rb +0 -107
  206. data/app/controllers/lesli/interfaces/application/customization.rb +0 -46
  207. data/app/controllers/lesli/interfaces/application/logger.rb +0 -134
  208. data/app/controllers/lesli/interfaces/application/requester.rb +0 -84
  209. data/app/controllers/lesli/interfaces/application/responder.rb +0 -132
  210. data/app/controllers/lesli/interfaces/controllers/actions.rb +0 -250
  211. data/app/controllers/lesli/interfaces/controllers/activities.rb +0 -215
  212. data/app/controllers/lesli/interfaces/controllers/discussions.rb +0 -270
  213. data/app/controllers/lesli/interfaces/controllers/files.rb +0 -467
  214. data/app/controllers/lesli/interfaces/controllers/subscribers.rb +0 -234
  215. data/app/lib/lesli/system.rb +0 -98
  216. data/app/models/lesli/cloud_object/action.rb +0 -70
  217. data/app/models/lesli/cloud_object/activity.rb +0 -311
  218. data/app/models/lesli/cloud_object/custom_field.rb +0 -158
  219. data/app/models/lesli/cloud_object/discussion.rb +0 -219
  220. data/app/models/lesli/cloud_object/subscriber.rb +0 -186
  221. data/app/operators/lesli/descriptor_privilege_operator.rb +0 -75
  222. data/app/views/lesli/emails/devise_mailer/confirmation_instructions.html.erb +0 -23
  223. data/app/views/lesli/emails/devise_mailer/reset_password_instructions.html.erb +0 -23
  224. data/app/views/lesli/partials/_application-lesli-icons.html.erb +0 -1
  225. data/config/initializers/devise.rb +0 -336
  226. data/db/seed/development/users.rb +0 -52
  227. data/db/seed/production/accounts.rb +0 -50
  228. data/db/structure/00000000_people.json +0 -34
  229. data/db/structure/00000003_actions.json +0 -14
  230. data/db/structure/00000004_activities.json +0 -20
  231. data/db/structure/00000005_discussions.json +0 -8
  232. data/db/structure/00000006_files.json +0 -32
  233. data/db/structure/00000007_subscribers.json +0 -11
  234. data/db/structure/00000501_dashboards.json +0 -14
  235. data/db/structure/00000502_dashboard_components.json +0 -23
  236. data/db/tables/0010003410_create_user_activities.rb +0 -51
  237. data/db/tables/0010003710_create_user_codes.rb +0 -43
  238. data/db/tables/0010004110_create_user_tokens.rb +0 -45
  239. data/db/tables/0010005610_create_role_activities.rb +0 -50
  240. data/db/tables/0010009010_create_feedbacks.rb +0 -56
  241. data/lib/mailer_previews/devise_mailer_preview.rb +0 -49
  242. data/lib/scss/bulma/loader.scss +0 -92
  243. data/lib/scss/cloud-objects/discussion.scss +0 -80
  244. data/lib/scss/cloud-objects/file.scss +0 -138
  245. data/lib/scss/components/keypad.scss +0 -109
  246. data/lib/scss/elements/autocomplete.scss +0 -72
  247. data/lib/scss/elements/card.scss +0 -37
  248. data/lib/scss/elements/empty.scss +0 -43
  249. data/lib/scss/elements/file-uploader.scss +0 -74
  250. data/lib/scss/elements/gallery.scss +0 -98
  251. data/lib/scss/elements/input-tag.scss +0 -73
  252. data/lib/scss/elements/loading.scss +0 -63
  253. data/lib/scss/elements/map.scss +0 -107
  254. data/lib/scss/elements/navbar.scss +0 -115
  255. data/lib/scss/elements/table.scss +0 -118
  256. data/lib/scss/elements/toolbar.scss +0 -66
  257. data/lib/scss/fonts/families.scss +0 -47
  258. data/lib/scss/fonts/mdicons.scss +0 -82
  259. data/lib/scss/fonts/remixicons.scss +0 -2602
  260. data/lib/scss/helpers/display.scss +0 -44
  261. data/lib/scss/helpers/tooltip.scss +0 -91
  262. data/lib/scss/layouts/application-announcements.scss +0 -40
  263. data/lib/scss/layouts/application-component.scss +0 -39
  264. data/lib/scss/layouts/application-engines.scss +0 -125
  265. data/lib/scss/layouts/application-footer.scss +0 -102
  266. data/lib/scss/layouts/application-header.scss +0 -163
  267. data/lib/scss/layouts/application-navbar.scss +0 -62
  268. data/lib/scss/layouts/application-search.scss +0 -71
  269. data/lib/scss/layouts/application-sidebar.scss +0 -219
  270. data/lib/scss/overrides/notification.scss +0 -75
  271. data/lib/scss/overrides/sweetalert.scss +0 -106
  272. data/lib/scss/pages/devise-simple.scss +0 -89
  273. data/lib/scss/pages/devise.scss +0 -179
  274. data/lib/scss/pages/invites.scss +0 -81
  275. data/lib/scss/panels/panel-announcements.scss +0 -56
  276. data/lib/scss/panels/panel-notification.scss +0 -67
  277. data/lib/scss/panels/panel-profile.scss +0 -62
  278. data/lib/scss/panels/panel-support-ticket.scss +0 -56
  279. data/lib/scss/panels/panel-tasks.scss +0 -41
  280. data/lib/scss/settings/variables.scss +0 -148
  281. data/lib/scss/shared/workflow-status-progress.scss +0 -135
  282. data/lib/scss/templates/application.scss +0 -156
  283. data/lib/scss/templates/component.scss +0 -39
  284. data/lib/scss/templates/dashboards.scss +0 -53
  285. data/lib/scss/templates/empty.scss +0 -42
  286. data/lib/scss/templates/pdf.scss +0 -45
  287. data/lib/scss/templates/public.scss +0 -70
  288. data/lib/vue/application.js +0 -283
  289. data/lib/vue/cloudobjects/discussion/content.vue +0 -62
  290. data/lib/vue/cloudobjects/discussion/element.vue +0 -170
  291. data/lib/vue/cloudobjects/discussion/filters.vue +0 -108
  292. data/lib/vue/cloudobjects/discussion/new.vue +0 -134
  293. data/lib/vue/cloudobjects/discussion.vue +0 -99
  294. data/lib/vue/cloudobjects/stores/discussion.js +0 -212
  295. data/lib/vue/layouts/application-announcements.vue +0 -78
  296. data/lib/vue/layouts/application-component.vue +0 -38
  297. data/lib/vue/layouts/application-container.vue +0 -48
  298. data/lib/vue/layouts/application-engines.vue +0 -66
  299. data/lib/vue/layouts/application-footer.vue +0 -123
  300. data/lib/vue/layouts/application-header.vue +0 -231
  301. data/lib/vue/layouts/application-navbar.vue +0 -110
  302. data/lib/vue/layouts/application-search.vue +0 -86
  303. data/lib/vue/layouts/application-sidebar.vue +0 -63
  304. data/lib/vue/pages/errors/app.js +0 -32
  305. data/lib/vue/pages/invites/app.js +0 -76
  306. data/lib/vue/pages/mfas/application.js +0 -77
  307. data/lib/vue/pages/onboarding/application.js +0 -45
  308. data/lib/vue/pages/onboarding/components/address.vue +0 -120
  309. data/lib/vue/pages/onboarding/components/buttons.vue +0 -67
  310. data/lib/vue/pages/onboarding/components/contact.vue +0 -148
  311. data/lib/vue/pages/onboarding/components/date-time.vue +0 -265
  312. data/lib/vue/pages/onboarding/components/finish.vue +0 -62
  313. data/lib/vue/pages/onboarding/components/general-info.vue +0 -93
  314. data/lib/vue/pages/onboarding/components/indicators.vue +0 -78
  315. data/lib/vue/pages/onboarding/components/welcome.vue +0 -66
  316. data/lib/vue/pages/onboarding/show.vue +0 -67
  317. data/lib/vue/pages/onboarding/store.js +0 -165
  318. data/lib/vue/pages/otps/application.js +0 -90
  319. data/lib/vue/pages/passes/application.js +0 -80
  320. data/lib/vue/pages/websites/application.js +0 -34
  321. data/lib/vue/panels/panel-announcements.vue +0 -248
  322. data/lib/vue/panels/panel-bell-notifications.vue +0 -102
  323. data/lib/vue/panels/panel-files.vue +0 -281
  324. data/lib/vue/panels/panel-profile.vue +0 -76
  325. data/lib/vue/panels/panel-support-tickets.vue +0 -161
  326. data/lib/vue/panels/panel-tasks.vue +0 -124
  327. data/lib/vue/panels/stores/bell-notifications.js +0 -46
  328. data/lib/vue/panels/stores/support-tickets.js +0 -103
  329. data/lib/vue/public.js +0 -83
  330. data/lib/vue/refactor/shared/cloudobjects/action.vue +0 -193
  331. data/lib/vue/refactor/shared/cloudobjects/file/grid.vue +0 -215
  332. data/lib/vue/refactor/shared/cloudobjects/file/list.vue +0 -106
  333. data/lib/vue/refactor/shared/cloudobjects/file.vue +0 -145
  334. data/lib/vue/refactor/shared/workflows2/apps/actions/form.vue +0 -232
  335. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/chatroom-form.vue +0 -103
  336. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/cloud-object-clone-form.vue +0 -125
  337. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/cloud-object-file-form.vue +0 -102
  338. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/email-form.vue +0 -190
  339. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/notification-form.vue +0 -124
  340. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/send-cloud-object-file.vue +0 -170
  341. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/task-form.vue +0 -258
  342. data/lib/vue/refactor/shared/workflows2/apps/actions/index.vue +0 -146
  343. data/lib/vue/refactor/shared/workflows2/apps/checks/form.vue +0 -200
  344. data/lib/vue/refactor/shared/workflows2/apps/checks/index.vue +0 -160
  345. data/lib/vue/refactor/shared/workflows2/apps/index.vue +0 -177
  346. data/lib/vue/refactor/shared/workflows2/apps/new.vue +0 -97
  347. data/lib/vue/refactor/shared/workflows2/apps/show.vue +0 -146
  348. data/lib/vue/refactor/shared/workflows2/components/associations.vue +0 -215
  349. data/lib/vue/refactor/shared/workflows2/components/chart.vue +0 -91
  350. data/lib/vue/refactor/shared/workflows2/components/workflow-form.vue +0 -466
  351. data/lib/vue/refactor/shared/workflows2/components/workflow-status-dropdown.vue +0 -129
  352. data/lib/vue/refactor/stores/cloudobjects/action.js +0 -181
  353. data/lib/vue/refactor/stores/cloudobjects/file.js +0 -205
  354. data/lib/vue/refactor/stores/entities/announcements.js +0 -75
  355. data/lib/vue/refactor/stores/entities/dashboard.js +0 -251
  356. data/lib/vue/refactor/stores/entities/workflow.js +0 -185
  357. data/lib/vue/refactor/stores/panels/announcements.js +0 -153
  358. data/lib/vue/refactor/stores/panels/notification.js +0 -114
  359. data/lib/vue/refactor/stores/panels/task.js +0 -66
  360. data/lib/vue/refactor/stores/panels/tickets.js +0 -129
  361. data/lib/vue/refactor/stores/role.js +0 -243
  362. data/lib/vue/refactor/stores/translations.json +0 -60
  363. data/lib/vue/refactor/stores/users.js +0 -98
  364. data/lib/vue/shared/dashboards/apps/edit.vue +0 -215
  365. data/lib/vue/shared/dashboards/apps/index.vue +0 -112
  366. data/lib/vue/shared/dashboards/apps/new.vue +0 -89
  367. data/lib/vue/shared/dashboards/apps/show.vue +0 -88
  368. data/lib/vue/shared/dashboards/components/form.vue +0 -246
  369. data/lib/vue/shared/services/firebase.js +0 -163
  370. data/lib/vue/shared/services/translator.js +0 -87
  371. data/lib/vue/shared/stores/command.js +0 -154
  372. data/lib/vue/shared/stores/dashboard.js +0 -253
  373. data/lib/vue/shared/stores/layout.js +0 -61
  374. data/lib/vue/shared/stores/systemController.js +0 -67
  375. data/lib/vue/shared/stores/users.js +0 -57
  376. data/lib/vue/stores/translations.json +0 -167
  377. data/lib/vue/translation.js +0 -45
  378. data/lib/webpack/base.js +0 -186
  379. data/lib/webpack/core.js +0 -91
  380. data/lib/webpack/engines.js +0 -165
  381. data/lib/webpack/version.js +0 -41
  382. data/vendor/bulma/LICENSE +0 -21
  383. data/vendor/bulma/bulma.sass +0 -10
  384. data/vendor/bulma/css/bulma-rtl.css +0 -11851
  385. data/vendor/bulma/css/bulma-rtl.min.css +0 -1
  386. data/vendor/bulma/css/bulma.css +0 -11851
  387. data/vendor/bulma/css/bulma.min.css +0 -1
  388. data/vendor/bulma/sass/base/_all.sass +0 -6
  389. data/vendor/bulma/sass/base/animations.sass +0 -5
  390. data/vendor/bulma/sass/base/generic.sass +0 -145
  391. data/vendor/bulma/sass/base/helpers.sass +0 -1
  392. data/vendor/bulma/sass/base/minireset.sass +0 -79
  393. data/vendor/bulma/sass/components/_all.sass +0 -15
  394. data/vendor/bulma/sass/components/breadcrumb.sass +0 -77
  395. data/vendor/bulma/sass/components/card.sass +0 -103
  396. data/vendor/bulma/sass/components/dropdown.sass +0 -83
  397. data/vendor/bulma/sass/components/level.sass +0 -79
  398. data/vendor/bulma/sass/components/media.sass +0 -59
  399. data/vendor/bulma/sass/components/menu.sass +0 -59
  400. data/vendor/bulma/sass/components/message.sass +0 -101
  401. data/vendor/bulma/sass/components/modal.sass +0 -117
  402. data/vendor/bulma/sass/components/navbar.sass +0 -446
  403. data/vendor/bulma/sass/components/pagination.sass +0 -167
  404. data/vendor/bulma/sass/components/panel.sass +0 -121
  405. data/vendor/bulma/sass/components/tabs.sass +0 -176
  406. data/vendor/bulma/sass/elements/_all.sass +0 -16
  407. data/vendor/bulma/sass/elements/box.sass +0 -26
  408. data/vendor/bulma/sass/elements/button.sass +0 -357
  409. data/vendor/bulma/sass/elements/container.sass +0 -29
  410. data/vendor/bulma/sass/elements/content.sass +0 -162
  411. data/vendor/bulma/sass/elements/form.sass +0 -1
  412. data/vendor/bulma/sass/elements/icon.sass +0 -46
  413. data/vendor/bulma/sass/elements/image.sass +0 -73
  414. data/vendor/bulma/sass/elements/notification.sass +0 -52
  415. data/vendor/bulma/sass/elements/other.sass +0 -31
  416. data/vendor/bulma/sass/elements/progress.sass +0 -73
  417. data/vendor/bulma/sass/elements/table.sass +0 -134
  418. data/vendor/bulma/sass/elements/tag.sass +0 -140
  419. data/vendor/bulma/sass/elements/title.sass +0 -70
  420. data/vendor/bulma/sass/form/_all.sass +0 -9
  421. data/vendor/bulma/sass/form/checkbox-radio.sass +0 -22
  422. data/vendor/bulma/sass/form/file.sass +0 -184
  423. data/vendor/bulma/sass/form/input-textarea.sass +0 -66
  424. data/vendor/bulma/sass/form/select.sass +0 -88
  425. data/vendor/bulma/sass/form/shared.sass +0 -60
  426. data/vendor/bulma/sass/form/tools.sass +0 -215
  427. data/vendor/bulma/sass/grid/_all.sass +0 -5
  428. data/vendor/bulma/sass/grid/columns.sass +0 -513
  429. data/vendor/bulma/sass/grid/tiles.sass +0 -36
  430. data/vendor/bulma/sass/helpers/_all.sass +0 -12
  431. data/vendor/bulma/sass/helpers/color.sass +0 -39
  432. data/vendor/bulma/sass/helpers/flexbox.sass +0 -35
  433. data/vendor/bulma/sass/helpers/float.sass +0 -10
  434. data/vendor/bulma/sass/helpers/other.sass +0 -14
  435. data/vendor/bulma/sass/helpers/overflow.sass +0 -2
  436. data/vendor/bulma/sass/helpers/position.sass +0 -7
  437. data/vendor/bulma/sass/helpers/spacing.sass +0 -31
  438. data/vendor/bulma/sass/helpers/typography.sass +0 -103
  439. data/vendor/bulma/sass/helpers/visibility.sass +0 -122
  440. data/vendor/bulma/sass/layout/_all.sass +0 -6
  441. data/vendor/bulma/sass/layout/footer.sass +0 -11
  442. data/vendor/bulma/sass/layout/hero.sass +0 -153
  443. data/vendor/bulma/sass/layout/section.sass +0 -17
  444. data/vendor/bulma/sass/utilities/_all.sass +0 -9
  445. data/vendor/bulma/sass/utilities/animations.sass +0 -1
  446. data/vendor/bulma/sass/utilities/controls.sass +0 -49
  447. data/vendor/bulma/sass/utilities/derived-variables.sass +0 -114
  448. data/vendor/bulma/sass/utilities/extends.sass +0 -25
  449. data/vendor/bulma/sass/utilities/functions.sass +0 -135
  450. data/vendor/bulma/sass/utilities/initial-variables.sass +0 -79
  451. data/vendor/bulma/sass/utilities/mixins.sass +0 -303
  452. data/vendor/lesli-css/_index.scss +0 -34
  453. data/vendor/lesli-css/lesli.scss +0 -51
  454. data/vendor/lesli-css/license +0 -28
  455. data/vendor/lesli-css/src/base/fonts.scss +0 -50
  456. data/vendor/lesli-css/src/base/normalize.scss +0 -118
  457. data/vendor/lesli-css/src/components/blockquote.scss +0 -61
  458. data/vendor/lesli-css/src/components/columns.scss +0 -92
  459. data/vendor/lesli-css/src/components/container.scss +0 -47
  460. data/vendor/lesli-css/src/components/navigation.scss +0 -59
  461. data/vendor/lesli-css/src/functions/colors.scss +0 -184
  462. data/vendor/lesli-css/src/helpers/units.scss +0 -44
  463. data/vendor/lesli-css/src/mixins/breakpoint.scss +0 -184
  464. data/vendor/lesli-css/src/mixins/flex.scss +0 -80
  465. data/vendor/lesli-css/src/mixins/scrollbar.scss +0 -46
  466. data/vendor/lesli-css/src/settings/variables.scss +0 -26
  467. data/vendor/lesli-css/tests/base/normalize.spec.scss +0 -125
  468. data/vendor/lesli-css/tests/functions/colors.spec.scss +0 -117
  469. data/vendor/lesli-css/tests/mixins/breakpoint.spec.scss +0 -429
  470. data/vendor/lesli-css/tests/mixins/scrollbar.spec.scss +0 -82
  471. data/vendor/lesli-css/vendor/normalize.scss +0 -351
  472. data/vendor/remixicon/License +0 -201
  473. data/vendor/remixicon/fonts/remixicon.css +0 -2583
  474. /data/{vendor/lesli-css/src/components/grid.scss → app/assets/stylesheets/lesli/application.css} +0 -0
  475. /data/db/migrate/v1/{0010001010_create_lesli_account_details.rb → 0000110210_create_lesli_account_details.rb} +0 -0
  476. /data/db/structure/{00000008_custom_fields.json → 00000300_custom_fields.json} +0 -0
  477. /data/lib/assets/javascripts/lesli/{i18n.js → i18n_js} +0 -0
@@ -0,0 +1,42 @@
1
+ module Lesli
2
+ module CustomizationInterface
3
+
4
+ # set customization only for lesli_cloud instance
5
+ def set_customizer
6
+ =begin
7
+ # @account is only for html and pdf requests
8
+ return unless request.format.html? || request.format.pdf?
9
+
10
+ # return unless Lesli.instance[:code] == "lesli_cloud"
11
+
12
+ @lesli[:customization] = {}
13
+
14
+ logos = {}
15
+ # logo_identifiers = Account::File.file_types.keys
16
+ # custom_logos = current_user.account.files.where("file_type in (?)", logo_identifiers).order(id: :desc).all
17
+ # logo_identifiers.each do |logo_identifier|
18
+ # custom_logo = custom_logos.find { |logo| logo.file_type == logo_identifier}
19
+ # next unless custom_logo
20
+
21
+ # custom_logo_url = "/administration/account/files/#{custom_logo.id}"
22
+ # custo_logo_url = custom_logo.attachment_url if custom_logo.attachment_identifier
23
+ # custom_logo_url = custom_logo.attachment_public_url if custom_logo.attachment_public_identifier
24
+
25
+ # logos[logo_identifier.to_sym] = custom_logo_url
26
+ # end
27
+ @lesli[:customization][:logos] = logos
28
+
29
+ colors = {}
30
+ # color_identifiers = ::Account::Setting.theme_settings_keys
31
+ # custom_colors = current_user.account.settings.where("name in (?)", color_identifiers).all
32
+ # color_identifiers.each do |color_identifier|
33
+ # custom_color = custom_colors.find { |color| color.name == color_identifier}
34
+ # next unless custom_color
35
+
36
+ # colors[color_identifier.to_sym] = custom_color.value
37
+ # end
38
+ @lesli[:customization][:colors] = colors
39
+ =end
40
+ end
41
+ end
42
+ end
@@ -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,192 +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
- "TO_CHAR(#{table}#{column} at time zone 'utc' at time zone '#{@settings[:time_zone]}', '#{format}') as #{column}_string"
142
-
143
- end
144
-
145
- # convert a datetime object to string representation using defined format
146
- def to_s
147
- @datetime.strftime(@format)
148
- end
149
-
150
- def get
151
- @datetime
152
- end
153
-
154
- private
155
-
156
-
157
- # get datetime object or string datetime and return a datetime object
158
- def parse_initial_datetime datetime, format
159
-
160
- return datetime if datetime.is_a?(Time)
161
-
162
- if datetime.is_a?(::String) and datetime.size == 25 and datetime[10] == "T"
163
- return ::DateTime.iso8601(datetime)
164
- end
165
-
166
- return ::DateTime.strptime(datetime, format)
167
- end
168
-
169
-
170
- def set_format format
171
- @format = @settings[:format][format || :date]
172
- end
173
-
174
-
175
- def db_format
176
- format = @format
177
-
178
- # Convert Ruby to postgresql date format
179
- format = format.gsub("%Y", "YYYY")
180
- format = format.gsub("%m", "MM")
181
- format = format.gsub("%d", "DD")
182
-
183
- # Convert Ruby to postgresql time format
184
- format = format.gsub("%H", "HH24") # 24 hours format
185
- format = format.gsub("%I", "HH12") # 12 hours format
186
- format = format.gsub("%p", "AM") # Meridian indicator (AM/PM)
187
- format = format.gsub("%M", "MI")
188
-
189
- format
190
- end
191
-
1
+ class Date2 < LesliDate::Formatter
192
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}",