lesli 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +3 -0
  3. data/app/assets/config/lesli_manifest.js +53 -0
  4. data/app/assets/fonts/lesli/Domine/Domine-Bold.ttf +0 -0
  5. data/app/assets/fonts/lesli/Domine/Domine-Regular.ttf +0 -0
  6. data/app/assets/fonts/lesli/Domine/OFL.txt +95 -0
  7. data/app/assets/fonts/lesli/MaterialDesign/icons.woff2 +0 -0
  8. data/app/assets/fonts/lesli/Montserrat/Montserrat-Variable.ttf +0 -0
  9. data/app/assets/fonts/lesli/OpenSans/OpenSans-Variable.ttf +0 -0
  10. data/app/assets/fonts/lesli/Remix/remixicon.eot +0 -0
  11. data/app/assets/fonts/lesli/Remix/remixicon.glyph.json +1 -0
  12. data/app/assets/fonts/lesli/Remix/remixicon.svg +7633 -0
  13. data/app/assets/fonts/lesli/Remix/remixicon.symbol.svg +11 -0
  14. data/app/assets/fonts/lesli/Remix/remixicon.ttf +0 -0
  15. data/app/assets/fonts/lesli/Remix/remixicon.woff +0 -0
  16. data/app/assets/fonts/lesli/Remix/remixicon.woff2 +0 -0
  17. data/app/assets/fonts/lesli/Roboto/LICENSE.txt +202 -0
  18. data/app/assets/fonts/lesli/Roboto/Roboto-Black.ttf +0 -0
  19. data/app/assets/fonts/lesli/Roboto/Roboto-BlackItalic.ttf +0 -0
  20. data/app/assets/fonts/lesli/Roboto/Roboto-Bold.ttf +0 -0
  21. data/app/assets/fonts/lesli/Roboto/Roboto-BoldItalic.ttf +0 -0
  22. data/app/assets/fonts/lesli/Roboto/Roboto-Italic.ttf +0 -0
  23. data/app/assets/fonts/lesli/Roboto/Roboto-Light.ttf +0 -0
  24. data/app/assets/fonts/lesli/Roboto/Roboto-LightItalic.ttf +0 -0
  25. data/app/assets/fonts/lesli/Roboto/Roboto-Medium.ttf +0 -0
  26. data/app/assets/fonts/lesli/Roboto/Roboto-MediumItalic.ttf +0 -0
  27. data/app/assets/fonts/lesli/Roboto/Roboto-Regular.ttf +0 -0
  28. data/app/assets/fonts/lesli/Roboto/Roboto-Thin.ttf +0 -0
  29. data/app/assets/fonts/lesli/Roboto/Roboto-ThinItalic.ttf +0 -0
  30. data/app/assets/icons/lesli/cloud-admin.svg +1 -0
  31. data/app/assets/icons/lesli/cloud-audit.svg +1 -0
  32. data/app/assets/icons/lesli/cloud-babel.svg +1 -0
  33. data/app/assets/icons/lesli/cloud-bell.svg +1 -0
  34. data/app/assets/icons/lesli/cloud-books.svg +1 -0
  35. data/app/assets/icons/lesli/cloud-development.svg +1 -0
  36. data/app/assets/icons/lesli/cloud-dispatcher.svg +1 -0
  37. data/app/assets/icons/lesli/cloud-driver.svg +1 -0
  38. data/app/assets/icons/lesli/cloud-focus.svg +1 -0
  39. data/app/assets/icons/lesli/cloud-help.svg +1 -0
  40. data/app/assets/icons/lesli/cloud-kb.svg +1 -0
  41. data/app/assets/icons/lesli/cloud-leaf.svg +1 -0
  42. data/app/assets/icons/lesli/cloud-lesli.svg +1 -0
  43. data/app/assets/icons/lesli/cloud-mailer.svg +1 -0
  44. data/app/assets/icons/lesli/cloud-one.svg +1 -0
  45. data/app/assets/icons/lesli/cloud-profile.svg +1 -0
  46. data/app/assets/icons/lesli/cloud-proposal.svg +1 -0
  47. data/app/assets/icons/lesli/cloud-scraper.svg +1 -0
  48. data/app/assets/icons/lesli/cloud-shared.svg +1 -0
  49. data/app/assets/icons/lesli/cloud-storage.svg +1 -0
  50. data/app/assets/icons/lesli/cloud-talk.svg +1 -0
  51. data/app/assets/icons/lesli/cloud-team.svg +1 -0
  52. data/app/assets/icons/lesli/cloud-time.svg +1 -0
  53. data/app/assets/icons/lesli/cloud-vault.svg +1 -0
  54. data/app/assets/icons/lesli/cloud-word.svg +1 -0
  55. data/app/assets/icons/lesli/icon-module.svg +1 -0
  56. data/app/assets/icons/lesli/logo-android.svg +1 -0
  57. data/app/assets/icons/lesli/logo-bulma.svg +1 -0
  58. data/app/assets/icons/lesli/logo-ios.svg +1 -0
  59. data/app/assets/icons/lesli/logo-linux.svg +1 -0
  60. data/app/assets/icons/lesli/logo-mac.svg +1 -0
  61. data/app/assets/icons/lesli/logo-module.svg +1 -0
  62. data/app/assets/icons/lesli/logo-postgresql.svg +1 -0
  63. data/app/assets/icons/lesli/logo-rails.svg +1 -0
  64. data/app/assets/icons/lesli/logo-ruby.svg +1 -0
  65. data/app/assets/icons/lesli/logo-sass.svg +1 -0
  66. data/app/assets/icons/lesli/logo-vue.svg +1 -0
  67. data/app/assets/icons/lesli/logo-web.svg +1 -0
  68. data/app/assets/icons/lesli/logo-windows.svg +1 -0
  69. data/app/assets/icons/readme.md +10 -0
  70. data/app/assets/images/lesli/brand/app-auth.svg +9 -0
  71. data/app/assets/images/lesli/brand/app-icon.svg +42 -0
  72. data/app/assets/images/lesli/brand/app-logo.svg +4 -0
  73. data/app/assets/images/lesli/brand/favicon.png +0 -0
  74. data/app/assets/images/lesli/brand/favicon.svg +61 -0
  75. data/app/assets/images/lesli/brand/login-background.jpg +0 -0
  76. data/app/assets/javascripts/lesli/users/sessions.js +786 -0
  77. data/app/assets/stylesheets/lesli/users/confirmations.scss +34 -0
  78. data/app/assets/stylesheets/lesli/users/devise.scss +32 -0
  79. data/app/assets/stylesheets/lesli/users/oauth.scss +34 -0
  80. data/app/assets/stylesheets/lesli/users/passwords.scss +34 -0
  81. data/app/assets/stylesheets/lesli/users/registrations.scss +34 -0
  82. data/app/assets/stylesheets/lesli/users/sessions.scss +38 -0
  83. data/app/controllers/lesli/application_controller.rb +108 -0
  84. data/app/controllers/lesli/application_devise_controller.rb +54 -0
  85. data/app/controllers/lesli/application_lesli_controller.rb +61 -0
  86. data/app/controllers/lesli/interfaces/application/authorization.rb +107 -0
  87. data/app/controllers/lesli/interfaces/application/customization.rb +46 -0
  88. data/app/controllers/lesli/interfaces/application/logger.rb +133 -0
  89. data/app/controllers/lesli/interfaces/application/requester.rb +84 -0
  90. data/app/controllers/lesli/interfaces/application/responder.rb +132 -0
  91. data/app/controllers/lesli/profiles_controller.rb +60 -0
  92. data/app/controllers/users/confirmations_controller.rb +30 -0
  93. data/app/controllers/users/omniauth_callbacks_controller.rb +30 -0
  94. data/app/controllers/users/passwords_controller.rb +34 -0
  95. data/app/controllers/users/registrations_controller.rb +62 -0
  96. data/app/controllers/users/sessions_controller.rb +142 -0
  97. data/app/controllers/users/unlocks_controller.rb +30 -0
  98. data/app/helpers/lesli/assets_helper.rb +92 -0
  99. data/app/helpers/lesli/customization_helper.rb +84 -0
  100. data/app/helpers/lesli/general_helper.rb +83 -0
  101. data/app/helpers/lesli/navigation_helper.rb +349 -0
  102. data/app/helpers/lesli/profiles_helper.rb +4 -0
  103. data/app/helpers/lesli/system_helper.rb +57 -0
  104. data/app/lib/date2.rb +192 -0
  105. data/app/lib/lesli/system.rb +80 -0
  106. data/app/models/concerns/account_engines.rb +249 -0
  107. data/app/models/concerns/user_activities.rb +163 -0
  108. data/app/models/concerns/user_extensions.rb +129 -0
  109. data/app/models/concerns/user_guard.rb +278 -0
  110. data/app/models/concerns/user_polyfill.rb +134 -0
  111. data/app/models/lesli/account/log.rb +57 -0
  112. data/app/models/lesli/account.rb +76 -0
  113. data/app/models/lesli/application_lesli_record.rb +37 -0
  114. data/app/models/lesli/profile.rb +4 -0
  115. data/app/models/lesli/system_controller/action.rb +37 -0
  116. data/app/models/lesli/system_controller.rb +37 -0
  117. data/app/models/lesli/user/agent.rb +37 -0
  118. data/app/models/lesli/user/log.rb +38 -0
  119. data/app/models/lesli/user/request.rb +37 -0
  120. data/app/models/lesli/user/session.rb +105 -0
  121. data/app/models/lesli/user.rb +162 -0
  122. data/app/services/lesli/application_lesli_service.rb +168 -0
  123. data/app/services/lesli/user/session_service.rb +62 -0
  124. data/app/validators/lesli/application_lesli_validator.rb +67 -0
  125. data/app/validators/lesli/users_validator.rb +217 -0
  126. data/app/views/devise/confirmations/new.html.erb +16 -0
  127. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  128. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  129. data/app/views/devise/mailer/password_change.html.erb +3 -0
  130. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  131. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  132. data/app/views/devise/passwords/edit.html.erb +25 -0
  133. data/app/views/devise/passwords/new.html.erb +16 -0
  134. data/app/views/devise/registrations/edit.html.erb +43 -0
  135. data/app/views/devise/registrations/new.html.erb +29 -0
  136. data/app/views/devise/sessions/new.html.erb +178 -0
  137. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  138. data/app/views/devise/shared/_links.html.erb +25 -0
  139. data/app/views/devise/unlocks/new.html.erb +16 -0
  140. data/app/views/lesli/devise/sessions/_form.html.erb +17 -0
  141. data/app/views/lesli/devise/sessions/_session.html.erb +2 -0
  142. data/app/views/lesli/devise/sessions/edit.html.erb +10 -0
  143. data/app/views/lesli/devise/sessions/index.html.erb +14 -0
  144. data/app/views/lesli/devise/sessions/new.html.erb +9 -0
  145. data/app/views/lesli/devise/sessions/show.html.erb +10 -0
  146. data/app/views/lesli/layouts/application-devise.html.erb +58 -0
  147. data/app/views/lesli/layouts/application-lesli.html.erb +57 -0
  148. data/app/views/lesli/layouts/application-public.html.erb +59 -0
  149. data/app/views/lesli/partials/_application-analytics.html.erb +71 -0
  150. data/app/views/lesli/partials/_application-data.html.erb +102 -0
  151. data/app/views/lesli/partials/_application-head.html.erb +56 -0
  152. data/app/views/lesli/partials/_application-lesli-chatbox.html.erb +35 -0
  153. data/app/views/lesli/partials/_application-lesli-content.html.erb +35 -0
  154. data/app/views/lesli/partials/_application-lesli-engines.html.erb +83 -0
  155. data/app/views/lesli/partials/_application-lesli-footer.html.erb +82 -0
  156. data/app/views/lesli/partials/_application-lesli-header.html.erb +79 -0
  157. data/app/views/lesli/partials/_application-lesli-icons.html.erb +1 -0
  158. data/app/views/lesli/partials/_application-lesli-javascript.html.erb +57 -0
  159. data/app/views/lesli/partials/_application-lesli-navigation.html.erb +52 -0
  160. data/app/views/lesli/partials/_application-lesli-notices.html.erb +43 -0
  161. data/app/views/lesli/partials/_application-lesli-panels.html.erb +58 -0
  162. data/app/views/lesli/partials/_application-lesli-scss.html.erb +60 -0
  163. data/app/views/lesli/partials/_application-lesli-sidebar.html.erb +50 -0
  164. data/app/views/lesli/partials/_application-public-footer.html.erb +51 -0
  165. data/app/views/lesli/partials/_application-public-javascript.html.erb +51 -0
  166. data/app/views/lesli/partials/_application-public-scss.html.erb +35 -0
  167. data/app/views/lesli/profiles/_form.html.erb +17 -0
  168. data/app/views/lesli/profiles/_profile.html.erb +2 -0
  169. data/app/views/lesli/profiles/edit.html.erb +10 -0
  170. data/app/views/lesli/profiles/index.html.erb +14 -0
  171. data/app/views/lesli/profiles/new.html.erb +9 -0
  172. data/app/views/lesli/profiles/show.html.erb +10 -0
  173. data/app/views/lesli/wrappers/_application-auth.html.erb +65 -0
  174. data/config/initializers/devise.rb +334 -0
  175. data/config/initializers/lesli_defaults.rb +100 -0
  176. data/config/locales/devise.en.yml +65 -0
  177. data/config/routes.rb +52 -0
  178. data/db/migrate/v1.0/0010000110_create_lesli_accounts.rb +70 -0
  179. data/db/migrate/v1.0/0010000210_create_lesli_roles.rb +59 -0
  180. data/db/migrate/v1.0/0010000310_create_lesli_users.rb +97 -0
  181. data/db/migrate/v1.0/0010000610_create_lesli_system_controllers.rb +44 -0
  182. data/db/migrate/v1.0/0010000710_create_lesli_system_controller_actions.rb +43 -0
  183. data/db/migrate/v1.0/0010001210_create_lesli_account_activities.rb +50 -0
  184. data/db/migrate/v1.0/0010001310_create_lesli_account_logs.rb +45 -0
  185. data/db/migrate/v1.0/0010003210_create_lesli_user_sessions.rb +51 -0
  186. data/db/migrate/v1.0/0010003310_create_lesli_user_requests.rb +48 -0
  187. data/db/migrate/v1.0/0010003610_create_lesli_user_logs.rb +45 -0
  188. data/db/migrate/v1.0/0010004010_create_lesli_user_agents.rb +46 -0
  189. data/db/seed/development/accounts.rb +47 -0
  190. data/db/seed/development/users.rb +53 -0
  191. data/db/seed/development.rb +35 -0
  192. data/db/seed/production.rb +35 -0
  193. data/db/seed/test.rb +35 -0
  194. data/db/seed/tools.rb +60 -0
  195. data/db/seeds.rb +64 -0
  196. data/db/structure/00000000_locations.json +32 -0
  197. data/db/structure/00000000_people.json +34 -0
  198. data/db/structure/00000003_actions.json +14 -0
  199. data/db/structure/00000004_activities.json +20 -0
  200. data/db/structure/00000005_discussions.json +8 -0
  201. data/db/structure/00000006_files.json +32 -0
  202. data/db/structure/00000007_subscribers.json +11 -0
  203. data/db/structure/00000008_custom_fields.json +8 -0
  204. data/db/structure/00000201_workflows.json +17 -0
  205. data/db/structure/00000202_workflow_statuses.json +24 -0
  206. data/db/structure/00000203_workflow_associations.json +14 -0
  207. data/db/structure/00000204_workflow_actions.json +39 -0
  208. data/db/structure/00000205_workflow_checks.json +27 -0
  209. data/db/structure/00000301_custom_fields.json +38 -0
  210. data/db/structure/00000401_custom_validations.json +14 -0
  211. data/db/structure/00000402_custom_validation_rules.json +23 -0
  212. data/db/structure/00000403_custom_validation_fields.json +14 -0
  213. data/db/structure/00000501_dashboards.json +14 -0
  214. data/db/structure/00000502_dashboard_components.json +23 -0
  215. data/db/tables/0010001010_create_account_settings.rb +42 -0
  216. data/db/tables/0010001110_create_account_locations.rb +64 -0
  217. data/db/tables/0010001410_create_account_files.rb +52 -0
  218. data/db/tables/0010001510_create_account_currencies.rb +48 -0
  219. data/db/tables/0010001610_create_account_currency_exchange_rates.rb +54 -0
  220. data/db/tables/0010003010_create_user_details.rb +49 -0
  221. data/db/tables/0010003110_create_user_settings.rb +44 -0
  222. data/db/tables/0010003410_create_user_activities.rb +51 -0
  223. data/db/tables/0010003510_create_user_roles.rb +43 -0
  224. data/db/tables/0010003710_create_user_codes.rb +43 -0
  225. data/db/tables/0010003810_create_user_shortcuts.rb +46 -0
  226. data/db/tables/0010004110_create_user_tokens.rb +45 -0
  227. data/db/tables/0010005010_create_descriptors.rb +45 -0
  228. data/db/tables/0010005110_create_descriptor_privileges.rb +44 -0
  229. data/db/tables/0010005210_create_descriptor_activities.rb +51 -0
  230. data/db/tables/0010005510_create_role_descriptors.rb +44 -0
  231. data/db/tables/0010005610_create_role_activities.rb +50 -0
  232. data/db/tables/0010005710_create_role_privileges.rb +45 -0
  233. data/db/tables/0010009010_create_feedbacks.rb +56 -0
  234. data/lib/assets/javascripts/lesli/i18n.js +1095 -0
  235. data/lib/assets/javascripts/lesli/translations.js +15 -0
  236. data/lib/lesli/configuration.rb +45 -0
  237. data/lib/lesli/engine.rb +62 -0
  238. data/lib/lesli/version.rb +34 -0
  239. data/lib/lesli.rb +6 -0
  240. data/lib/sass/lesli/bulma/loader.scss +84 -0
  241. data/lib/sass/lesli/cloud-objects/discussion.scss +77 -0
  242. data/lib/sass/lesli/cloud-objects/file.scss +138 -0
  243. data/lib/sass/lesli/components/editor-richtext.scss +78 -0
  244. data/lib/sass/lesli/components/keypad.scss +109 -0
  245. data/lib/sass/lesli/devise/confirmations.scss.erb +75 -0
  246. data/lib/sass/lesli/devise/passwords.scss.erb +86 -0
  247. data/lib/sass/lesli/devise/registrations.scss.erb +50 -0
  248. data/lib/sass/lesli/devise/sessions.scss +36 -0
  249. data/lib/sass/lesli/elements/autocomplete.scss +72 -0
  250. data/lib/sass/lesli/elements/avatar.scss +48 -0
  251. data/lib/sass/lesli/elements/calendar.scss +47 -0
  252. data/lib/sass/lesli/elements/card.scss +37 -0
  253. data/lib/sass/lesli/elements/content.scss +37 -0
  254. data/lib/sass/lesli/elements/empty.scss +43 -0
  255. data/lib/sass/lesli/elements/file-uploader.scss +74 -0
  256. data/lib/sass/lesli/elements/form.scss +43 -0
  257. data/lib/sass/lesli/elements/gallery.scss +98 -0
  258. data/lib/sass/lesli/elements/header.scss +44 -0
  259. data/lib/sass/lesli/elements/input-tag.scss +73 -0
  260. data/lib/sass/lesli/elements/loading.scss +63 -0
  261. data/lib/sass/lesli/elements/map.scss +107 -0
  262. data/lib/sass/lesli/elements/msg.scss +77 -0
  263. data/lib/sass/lesli/elements/navbar.scss +115 -0
  264. data/lib/sass/lesli/elements/panel.scss +65 -0
  265. data/lib/sass/lesli/elements/tab.scss +48 -0
  266. data/lib/sass/lesli/elements/table.scss +118 -0
  267. data/lib/sass/lesli/elements/toggle.scss +102 -0
  268. data/lib/sass/lesli/elements/toolbar.scss +66 -0
  269. data/lib/sass/lesli/fonts/families.scss +47 -0
  270. data/lib/sass/lesli/fonts/mdicons.scss +84 -0
  271. data/lib/sass/lesli/fonts/remixicons.scss +2602 -0
  272. data/lib/sass/lesli/helpers/display.scss +44 -0
  273. data/lib/sass/lesli/helpers/tooltip.scss +91 -0
  274. data/lib/sass/lesli/layouts/application-announcements.scss +40 -0
  275. data/lib/sass/lesli/layouts/application-component.scss +50 -0
  276. data/lib/sass/lesli/layouts/application-engines.scss +155 -0
  277. data/lib/sass/lesli/layouts/application-footer.scss +102 -0
  278. data/lib/sass/lesli/layouts/application-header.scss +152 -0
  279. data/lib/sass/lesli/layouts/application-navbar.scss +61 -0
  280. data/lib/sass/lesli/layouts/application-search.scss +71 -0
  281. data/lib/sass/lesli/layouts/application-sidebar.scss +219 -0
  282. data/lib/sass/lesli/overrides/sweetalert.scss +106 -0
  283. data/lib/sass/lesli/pages/dashboards.scss +57 -0
  284. data/lib/sass/lesli/pages/invites.scss +81 -0
  285. data/lib/sass/lesli/pages/mfas.scss +36 -0
  286. data/lib/sass/lesli/pages/otps.scss +36 -0
  287. data/lib/sass/lesli/pages/passes.scss +35 -0
  288. data/lib/sass/lesli/panels/panel-announcements.scss +56 -0
  289. data/lib/sass/lesli/panels/panel-notification.scss +67 -0
  290. data/lib/sass/lesli/panels/panel-profile.scss +62 -0
  291. data/lib/sass/lesli/panels/panel-tasks.scss +41 -0
  292. data/lib/sass/lesli/panels/panel-ticket.scss +57 -0
  293. data/lib/sass/lesli/settings/variables.scss +148 -0
  294. data/lib/sass/lesli/shared/workflow-status-progress.scss +135 -0
  295. data/lib/sass/lesli/templates/application.scss +141 -0
  296. data/lib/sass/lesli/templates/dashboards.scss +32 -0
  297. data/lib/sass/lesli/templates/devise.scss +185 -0
  298. data/lib/sass/lesli/templates/empty.scss +42 -0
  299. data/lib/sass/lesli/templates/pdf.scss +45 -0
  300. data/lib/sass/lesli/templates/public.scss +71 -0
  301. data/lib/tasks/db.rb +75 -0
  302. data/lib/tasks/lesli/controllers.rake +103 -0
  303. data/lib/tasks/lesli_tasks.rake +23 -0
  304. data/lib/vue/application.js +269 -0
  305. data/lib/vue/apps/cloudobjects/action.vue +193 -0
  306. data/lib/vue/apps/cloudobjects/discussion/content.vue +60 -0
  307. data/lib/vue/apps/cloudobjects/discussion/element.vue +132 -0
  308. data/lib/vue/apps/cloudobjects/discussion/filters.vue +108 -0
  309. data/lib/vue/apps/cloudobjects/discussion/new.vue +130 -0
  310. data/lib/vue/apps/cloudobjects/discussion.vue +98 -0
  311. data/lib/vue/apps/cloudobjects/file/grid.vue +215 -0
  312. data/lib/vue/apps/cloudobjects/file/list.vue +106 -0
  313. data/lib/vue/apps/cloudobjects/file.vue +145 -0
  314. data/lib/vue/apps/dashboards/apps/edit.vue +105 -0
  315. data/lib/vue/apps/dashboards/apps/index.vue +114 -0
  316. data/lib/vue/apps/dashboards/apps/new.vue +89 -0
  317. data/lib/vue/apps/dashboards/apps/show.vue +76 -0
  318. data/lib/vue/apps/dashboards/components/form.vue +267 -0
  319. data/lib/vue/apps/dashboards/components/preview.vue +172 -0
  320. data/lib/vue/apps/workflows2/apps/actions/form.vue +232 -0
  321. data/lib/vue/apps/workflows2/apps/actions/forms/chatroom-form.vue +103 -0
  322. data/lib/vue/apps/workflows2/apps/actions/forms/cloud-object-clone-form.vue +125 -0
  323. data/lib/vue/apps/workflows2/apps/actions/forms/cloud-object-file-form.vue +102 -0
  324. data/lib/vue/apps/workflows2/apps/actions/forms/email-form.vue +190 -0
  325. data/lib/vue/apps/workflows2/apps/actions/forms/notification-form.vue +124 -0
  326. data/lib/vue/apps/workflows2/apps/actions/forms/send-cloud-object-file.vue +170 -0
  327. data/lib/vue/apps/workflows2/apps/actions/forms/task-form.vue +258 -0
  328. data/lib/vue/apps/workflows2/apps/actions/index.vue +146 -0
  329. data/lib/vue/apps/workflows2/apps/checks/form.vue +200 -0
  330. data/lib/vue/apps/workflows2/apps/checks/index.vue +160 -0
  331. data/lib/vue/apps/workflows2/apps/index.vue +177 -0
  332. data/lib/vue/apps/workflows2/apps/new.vue +97 -0
  333. data/lib/vue/apps/workflows2/apps/show.vue +146 -0
  334. data/lib/vue/apps/workflows2/components/associations.vue +215 -0
  335. data/lib/vue/apps/workflows2/components/chart.vue +91 -0
  336. data/lib/vue/apps/workflows2/components/workflow-form.vue +466 -0
  337. data/lib/vue/apps/workflows2/components/workflow-status-dropdown.vue +129 -0
  338. data/lib/vue/devise/confirmations.js +33 -0
  339. data/lib/vue/devise/passwords.js +137 -0
  340. data/lib/vue/devise/registrations.js +162 -0
  341. data/lib/vue/devise/sessions.js +143 -0
  342. data/lib/vue/layouts/application-announcements.vue +78 -0
  343. data/lib/vue/layouts/application-engines.vue +66 -0
  344. data/lib/vue/layouts/application-footer.vue +123 -0
  345. data/lib/vue/layouts/application-header.vue +213 -0
  346. data/lib/vue/layouts/application-navbar.vue +110 -0
  347. data/lib/vue/layouts/application-search.vue +86 -0
  348. data/lib/vue/layouts/application-sidebar.vue +63 -0
  349. data/lib/vue/layouts/dashboard-component.vue +62 -0
  350. data/lib/vue/pages/errors/app.js +32 -0
  351. data/lib/vue/pages/invites/app.js +76 -0
  352. data/lib/vue/pages/mfas/application.js +77 -0
  353. data/lib/vue/pages/onboarding/application.js +45 -0
  354. data/lib/vue/pages/onboarding/components/address.vue +120 -0
  355. data/lib/vue/pages/onboarding/components/buttons.vue +67 -0
  356. data/lib/vue/pages/onboarding/components/contact.vue +148 -0
  357. data/lib/vue/pages/onboarding/components/date-time.vue +265 -0
  358. data/lib/vue/pages/onboarding/components/finish.vue +62 -0
  359. data/lib/vue/pages/onboarding/components/general-info.vue +93 -0
  360. data/lib/vue/pages/onboarding/components/indicators.vue +78 -0
  361. data/lib/vue/pages/onboarding/components/welcome.vue +66 -0
  362. data/lib/vue/pages/onboarding/show.vue +67 -0
  363. data/lib/vue/pages/onboarding/store.js +165 -0
  364. data/lib/vue/pages/otps/application.js +90 -0
  365. data/lib/vue/pages/passes/application.js +80 -0
  366. data/lib/vue/pages/websites/application.js +34 -0
  367. data/lib/vue/panels/panel-announcements.vue +248 -0
  368. data/lib/vue/panels/panel-files.vue +281 -0
  369. data/lib/vue/panels/panel-notifications.vue +106 -0
  370. data/lib/vue/panels/panel-profile.vue +76 -0
  371. data/lib/vue/panels/panel-tasks.vue +124 -0
  372. data/lib/vue/panels/panel-tickets.vue +181 -0
  373. data/lib/vue/public.js +85 -0
  374. data/lib/vue/stores/announcements.js +75 -0
  375. data/lib/vue/stores/cloud-bell/notification.js +114 -0
  376. data/lib/vue/stores/cloudobjects/action.js +181 -0
  377. data/lib/vue/stores/cloudobjects/discussion.js +221 -0
  378. data/lib/vue/stores/cloudobjects/file.js +205 -0
  379. data/lib/vue/stores/dashboard.js +251 -0
  380. data/lib/vue/stores/firebase.js +163 -0
  381. data/lib/vue/stores/layout.js +60 -0
  382. data/lib/vue/stores/panels/announcements.js +153 -0
  383. data/lib/vue/stores/panels/task.js +66 -0
  384. data/lib/vue/stores/panels/tickets.js +129 -0
  385. data/lib/vue/stores/profile.js +90 -0
  386. data/lib/vue/stores/search.js +154 -0
  387. data/lib/vue/stores/services/translator.js +87 -0
  388. data/lib/vue/stores/workflow.js +185 -0
  389. data/lib/vue/stores/workflow2.js +345 -0
  390. data/lib/vue/stores/workflows/actions.js +327 -0
  391. data/lib/vue/stores/workflows/associations.js +130 -0
  392. data/lib/vue/stores/workflows/checks.js +210 -0
  393. data/lib/webpack/base.js +182 -0
  394. data/lib/webpack/core.js +80 -0
  395. data/lib/webpack/engines.js +162 -0
  396. data/license +674 -0
  397. data/readme.md +120 -0
  398. metadata +554 -0
@@ -0,0 +1,349 @@
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
+
32
+ =end
33
+
34
+ module Lesli
35
+ module NavigationHelper
36
+ # Prints a html link inside a list item
37
+ def navigation_item(path, label, icon = nil, reload: false)
38
+ # default vue router links for single page applications
39
+ html_element = "router-link"
40
+ html_options = { to: path }
41
+
42
+ # if reload is nedeed, we use a standard "a" tag
43
+ if reload
44
+ html_element = "a"
45
+ html_options = { href: path }
46
+ end
47
+
48
+ content_tag(:li) do
49
+ content_tag(html_element, html_options) do
50
+ # print a simple menu item (without icon)
51
+ concat content_tag(:span, label, class: "text iconless") unless icon
52
+
53
+ # print a full menu item if icon was requested
54
+ if icon
55
+ concat content_tag("span", nil, class: [icon, "icono"])
56
+ concat content_tag(:span, label, class: "text")
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ # Prints a separator line
63
+ def navigation_separator
64
+ content_tag(:li) do
65
+ content_tag(:hr)
66
+ end
67
+ end
68
+
69
+ # 00.00 System administration
70
+ def navigation_engine_admin(title: "Administration", subtitle: "Users, privileges, access roles.")
71
+ navigation_engine_item(title, subtitle, "admin", lesli_admin.root_path, controller_path.include?("lesli_admin"))
72
+ end
73
+
74
+ # ADMINISTRATION
75
+
76
+ # 01.01 Team engine
77
+ def navigation_engine_team(title: "Team", subtitle: "Human Resources Management")
78
+ return unless defined? CloudTeam
79
+
80
+ navigation_engine_item(title, subtitle, "team", cloud_team.root_path,
81
+ controller_path.include?("cloud_team"))
82
+ end
83
+
84
+ # SALES & MARKETING
85
+
86
+ # 02.03 Drop engine
87
+ def navigation_engine_word(title: "Word", subtitle: "Content Management System")
88
+ return unless defined? CloudWord
89
+
90
+ navigation_engine_item(title, subtitle, "word", cloud_word.root_path,
91
+ controller_path.include?("cloud_word"))
92
+ end
93
+
94
+ # 02.04 House engine
95
+ def navigation_engine_house(title: "House", subtitle: "cloud_house/house-logo.svg")
96
+ return unless defined? CloudHouse
97
+
98
+ navigation_engine_item(title, subtitle, "house", cloud_house.root_path,
99
+ controller_path.include?("cloud_house"))
100
+ end
101
+
102
+ # 02.05 Mailer engine
103
+ def navigation_engine_mailer(title: "Mailer", subtitle: "Email automation system")
104
+ return unless defined? CloudMailer
105
+
106
+ navigation_engine_item(title, subtitle, "mailer", cloud_mailer.root_path,
107
+ controller_path.include?("cloud_mailer"))
108
+ end
109
+
110
+ # 02.08 Proposal engine
111
+ def navigation_engine_proposal(title: "Proposal", subtitle: "cloud_proposal/proposal-logo.svg")
112
+ return unless defined? CloudProposal
113
+
114
+ navigation_engine_item(title, subtitle, "proposal", cloud_proposal.root_path,
115
+ controller_path.include?("cloud_proposal"))
116
+ end
117
+
118
+ # PRODUCTIVITY & TEAMWORK
119
+
120
+ # 03.01 Driver engine
121
+ def navigation_engine_driver(title: "Driver", subtitle: "Calendar")
122
+ return unless defined? CloudDriver
123
+
124
+ navigation_engine_item(title, subtitle, "driver", cloud_driver.root_path,
125
+ controller_path.include?("cloud_driver"))
126
+ end
127
+
128
+ # 03.02 Work engine
129
+ def navigation_engine_work(title: "Work", subtitle: "Dynamic Project Management")
130
+ return unless defined? CloudWork
131
+
132
+ navigation_engine_item(title, subtitle, "work", cloud_work.root_path,
133
+ controller_path.include?("cloud_work"))
134
+ end
135
+
136
+ # 03.03 Focus engine
137
+ def navigation_engine_focus(title: "Tasks", subtitle: "Task Management")
138
+ return unless defined? CloudFocus
139
+
140
+ navigation_engine_item(title, subtitle, "focus", cloud_focus.root_path,
141
+ controller_path.include?("cloud_focus"))
142
+ end
143
+
144
+ # 03.05 Text engine
145
+ def navigation_engine_text(title: "Text", subtitle: "cloud_text/text-logo.svg")
146
+ return unless defined? CloudText
147
+
148
+ navigation_engine_item(title, subtitle, "text", cloud_text.root_path,
149
+ controller_path.include?("cloud_text"))
150
+ end
151
+
152
+ # 03.07 Social engine
153
+ def navigation_engine_social(title: "Social", subtitle: "Team social network")
154
+ return unless defined? CloudSocial
155
+
156
+ navigation_engine_item(title, subtitle, "social", cloud_social.root_path,
157
+ controller_path.include?("cloud_social"))
158
+ end
159
+
160
+ # 03.08 Bell engine
161
+ def navigation_engine_bell(title: "Notifications", subtitle: "Announcements and notifications")
162
+ return unless defined? LesliBell
163
+
164
+ navigation_engine_item(title, subtitle, "bell", lesli_bell.root_path,
165
+ controller_path.include?("lesli_bell"))
166
+ end
167
+
168
+ # 03.09 Time engine
169
+ def navigation_engine_time(title: "Time managment", subtitle: "Track your time")
170
+ return unless defined? CloudTime
171
+
172
+ navigation_engine_item(title, subtitle, "time", cloud_time.root_path,
173
+ controller_path.include?("cloud_time"))
174
+ end
175
+
176
+ # 03.10 Talk engine
177
+ def navigation_engine_talk(title: "Talk", subtitle: "Real-time communication")
178
+ return unless defined? CloudTalk
179
+
180
+ navigation_engine_item(title, subtitle, "talk", cloud_talk.root_path,
181
+ controller_path.include?("cloud_talk"))
182
+ end
183
+
184
+ # 03.11 Storage engine
185
+ def navigation_engine_storage(title: "Storage", subtitle: "Cloud files management")
186
+ return unless defined? CloudStorage
187
+
188
+ navigation_engine_item(title, subtitle, "storage", cloud_storage.root_path,
189
+ controller_path.include?("cloud_storage"))
190
+ end
191
+
192
+ # FINANCE
193
+
194
+ # 04.01 Books engine
195
+ def navigation_engine_books(title: "Books", subtitle: "cloud_books/books-logo.svg")
196
+ return unless defined? CloudBooks
197
+
198
+ navigation_engine_item(title, subtitle, "books", cloud_books.root_path,
199
+ controller_path.include?("cloud_books"))
200
+ end
201
+
202
+ # 04.03 Things engine
203
+ def navigation_engine_things(title: "Things", subtitle: "cloud_things/things-logo.svg")
204
+ return unless defined? CloudThings
205
+
206
+ navigation_engine_item(title, subtitle, "things", cloud_things.root_path,
207
+ controller_path.include?("cloud_things"))
208
+ end
209
+
210
+ # 04.05 Realty engine
211
+ def navigation_engine_realty(title: "Realty", subtitle: "cloud_realty/realty-logo.svg")
212
+ return unless defined? CloudRealty
213
+
214
+ navigation_engine_item(title, subtitle, "realty", cloud_realty.root_path,
215
+ controller_path.include?("cloud_realty"))
216
+ end
217
+
218
+ # ANALYTICS
219
+
220
+ # 05.04 Insights engine
221
+ def navigation_engine_insights(title: "Insights", subtitle: "cloud_insights/insights-logo.svg")
222
+ return unless defined? CloudInsights
223
+
224
+ navigation_engine_item(title, subtitle, "insights", cloud_insights.root_path,
225
+ controller_path.include?("cloud_insights"))
226
+ end
227
+
228
+ # INTELLIGENCE
229
+
230
+ # 06.06 Scraper engine
231
+ def navigation_engine_scraper(title: "Scraper", subtitle: "Scraper")
232
+ return unless defined? CloudScraper
233
+
234
+ navigation_engine_item(title, subtitle, "scraper", cloud_scraper.root_path,
235
+ controller_path.include?("cloud_scraper"))
236
+ end
237
+
238
+ # IT & HELP DESK
239
+
240
+ # 07.01 Kb engine
241
+ def navigation_engine_kb(title: "Kb", subtitle: "cloud_kb/kb-logo.svg")
242
+ return unless defined? CloudKb
243
+
244
+ navigation_engine_item(title, subtitle, "kb", cloud_kb.root_path, controller_path.include?("cloud_kb"))
245
+ end
246
+
247
+ # 07.02 Help engine
248
+ def navigation_engine_help(title: "Help", subtitle: "Support Ticket System")
249
+ return unless defined? CloudHelp
250
+
251
+ navigation_engine_item(title, subtitle, "help", cloud_help.root_path,
252
+ controller_path.include?("cloud_help"))
253
+ end
254
+
255
+ # 07.03 Portal engine
256
+ def navigation_engine_portal(title: "Portal", subtitle: "cloud_portal/portal-logo.svg")
257
+ return unless defined? CloudPortal
258
+
259
+ navigation_engine_item(title, subtitle, "portal", cloud_portal.root_path,
260
+ controller_path.include?("cloud_portal"))
261
+ end
262
+
263
+ # 07.05 Shared engine
264
+ def navigation_engine_shared(title: "Shared", subtitle: "Shared & Open resources")
265
+ return unless defined? CloudShared
266
+
267
+ navigation_engine_item(title, subtitle, "shared", cloud_shared.root_path,
268
+ controller_path.include?("cloud_shared"))
269
+ end
270
+
271
+ # SECURITY & PRIVACY
272
+
273
+ # 08.01 Vault engine
274
+ def navigation_engine_vault(title: "Vault", subtitle: "")
275
+ return unless defined? LesliVault
276
+
277
+ navigation_engine_item(title, subtitle, "vault", lesli_vault.root_path,
278
+ controller_path.include?("lesli_vault"))
279
+ end
280
+
281
+ # 08.03 Audit engine
282
+ def navigation_engine_audit(title: "Audit", subtitle: "Activity, logs, security and more")
283
+ return unless defined? CloudAudit
284
+
285
+ navigation_engine_item(title, subtitle, "audit", cloud_audit.root_path,
286
+ controller_path.include?("cloud_audit"))
287
+ end
288
+
289
+ # INTEGRATIONS
290
+
291
+ # 09.01 Babel engine
292
+ def navigation_engine_babel(title: "Babel", subtitle: "Translations")
293
+ return unless defined? LesliBabel
294
+
295
+ navigation_engine_item(title, subtitle, "babel", lesli_babel.root_path,
296
+ controller_path.include?("lesli_babel"))
297
+ end
298
+
299
+ # 09.02 Dispatcher engine
300
+ def navigation_engine_dispatcher(title: "Dispatcher", subtitle: "cloud_dispatcher/dispatcher-logo.svg")
301
+ return unless defined? CloudDispatcher
302
+
303
+ navigation_engine_item(title, subtitle, "api", cloud_dispatcher.root_path,
304
+ controller_path.include?("cloud_dispatcher"))
305
+ end
306
+
307
+ # 09.03 Federation engine
308
+ def navigation_engine_federation(title: "Federation", subtitle: "cloud_federation/federation-logo.svg")
309
+ return unless defined? CloudFederation
310
+
311
+ navigation_engine_item(title, subtitle, "federation", cloud_federation.root_path,
312
+ controller_path.include?("cloud_federation"))
313
+ end
314
+
315
+ # 09.04 One engine
316
+ def navigation_engine_one(title: "One", subtitle: "Cloud Enterprise Resource Management")
317
+ return unless defined? CloudOne
318
+
319
+ navigation_engine_item(title, subtitle, "one", cloud_one.root_path,
320
+ controller_path.include?("cloud_one"))
321
+ end
322
+
323
+ # 09.06 Development engine
324
+ def navigation_engine_development(title: "Dev", subtitle: "Development notes")
325
+ return unless defined? CloudDevelopment
326
+
327
+ navigation_engine_item(title, subtitle, "development", cloud_development.root_path,
328
+ controller_path.include?("cloud_development"))
329
+ end
330
+
331
+ private
332
+
333
+ # build a html link for an engine path
334
+ def navigation_engine_item(title, subtitle, icon, path, is_active)
335
+ # get hidden modules if there are modules to hide
336
+ modules_hidden = [] # Rails.application.config.lesli.dig(:modules_hidden) || []
337
+
338
+ # stop rendering module navigation if need to hide the module
339
+ return nil if modules_hidden.include?(path)
340
+
341
+ # render module navigation item :)
342
+ content_tag(:a, href: path, class: is_active ? "is-active" : nil) do
343
+ lesli_svg("cloud-#{icon}") << content_tag(:div) do
344
+ content_tag(:span, title) << content_tag(:p, subtitle)
345
+ end
346
+ end
347
+ end
348
+ end
349
+ end
@@ -0,0 +1,4 @@
1
+ module Lesli
2
+ module ProfilesHelper
3
+ end
4
+ end
@@ -0,0 +1,57 @@
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.dev
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module Lesli
34
+ module SystemHelper
35
+ # return the engine code of the controller that is handling the http request
36
+ def lesli_controller
37
+ controller_path.split("/")[0]
38
+ end
39
+
40
+ # retun the code of the instance builder engine
41
+ # example: lesli_cloud, deutsche_leibrenten, mitwerken_cloud
42
+ def lesli_instance_code
43
+ return "lesli"
44
+ Lesli::System.instance[:code]
45
+ end
46
+
47
+ # return the information about the current engine
48
+ def lesli_engine(property = nil)
49
+ Lesli::System.engine(lesli_controller.camelize, property)
50
+ end
51
+
52
+ # return true if the controller requested belongs to the administration area
53
+ def is_lesli_onboarding?
54
+ lesli_controller == "onboardings"
55
+ end
56
+ end
57
+ end
data/app/lib/date2.rb ADDED
@@ -0,0 +1,192 @@
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
+
192
+ end
@@ -0,0 +1,80 @@
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
+
32
+ =end
33
+
34
+ module Lesli
35
+ class System
36
+ ENGINES = {}
37
+
38
+ # engine("LesliAdmin")
39
+ # engine("LesliAdmin", "name")
40
+ def self.engine(engine, property=nil)
41
+
42
+ engines() if ENGINES.empty?
43
+
44
+ # return specific property if requested
45
+ return ENGINES[engine][property] unless property.blank?
46
+
47
+ # return the engine info
48
+ return ENGINES[engine]
49
+ end
50
+
51
+ def self.engines
52
+
53
+ return ENGINES unless ENGINES.empty?
54
+
55
+ # due we do not know the engine mounted path we have to look up for it every
56
+ # time we load the html view so we can use the dynamic route from the main rails app
57
+ # we use this in the url plugin
58
+ ["Lesli", "LesliAdmin", "LesliBabel"].each do |engine|
59
+ next unless Object.const_defined?(engine)
60
+ ENGINES[engine]= {
61
+ :code => engine.underscore,
62
+ :name => lesli_engine_name(engine),
63
+ :path => "#{engine}::Engine".constantize.routes.find_script_name({}),
64
+ :dir => Gem::Specification.find_by_name(engine.underscore).gem_dir
65
+ }
66
+ end
67
+
68
+ ENGINES
69
+ end
70
+
71
+ private
72
+
73
+ # Prints the name of the engine
74
+ def self.lesli_engine_name engine
75
+ name = engine.camelcase
76
+ return "Lesli" if name == "Lesli"
77
+ name.sub("Lesli", "")
78
+ end
79
+ end
80
+ end