lesli 5.0.13 → 5.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/lesli_manifest.js +3 -6
  3. data/app/assets/images/lesli/brand/app-icon.svg +45 -39
  4. data/app/assets/javascripts/lesli/application.js +1 -0
  5. data/app/controllers/lesli/abouts_controller.rb +16 -14
  6. data/app/controllers/lesli/application_controller.rb +13 -0
  7. data/app/controllers/lesli/application_devise_controller.rb +10 -12
  8. data/app/controllers/lesli/application_lesli_controller.rb +12 -11
  9. data/app/controllers/lesli/apps_controller.rb +6 -0
  10. data/app/controllers/lesli/roles_controller.rb +2 -2
  11. data/app/helpers/lesli/general_helper.rb +18 -5
  12. data/app/helpers/lesli/html_helper.rb +8 -0
  13. data/app/helpers/lesli/navigation_helper.rb +30 -11
  14. data/app/helpers/lesli/system_helper.rb +2 -2
  15. data/app/helpers/lesli/turbo_helper.rb +58 -0
  16. data/app/interfaces/lesli/customization_interface.rb +42 -0
  17. data/app/interfaces/lesli/requester_interface.rb +103 -0
  18. data/app/interfaces/lesli/responder_interface.rb +127 -0
  19. data/app/lib/date2.rb +1 -199
  20. data/app/lib/lesli/courier.rb +54 -0
  21. data/app/mailers/lesli/application_lesli_mailer.rb +32 -59
  22. data/app/mailers/lesli/devise_mailer.rb +16 -8
  23. data/app/models/concerns/account_initializer.rb +27 -68
  24. data/app/models/concerns/lesli/has_activities.rb +29 -0
  25. data/app/models/concerns/user_extensions.rb +34 -19
  26. data/app/models/concerns/user_security.rb +4 -4
  27. data/app/models/lesli/account.rb +13 -20
  28. data/{lib/scss/layouts/application-container.scss → app/models/lesli/item/activity.rb} +11 -8
  29. data/app/models/lesli/role/{power.rb → action.rb} +6 -4
  30. data/app/models/lesli/role.rb +7 -15
  31. data/app/models/lesli/shared/catalog.rb +20 -0
  32. data/app/models/lesli/shared/dashboard.rb +1 -1
  33. data/app/models/lesli/user/activity.rb +5 -0
  34. data/app/models/lesli/user/detail.rb +5 -5
  35. data/app/models/lesli/user/{log.rb → journal.rb} +3 -3
  36. data/app/models/lesli/user/{power.rb → role.rb} +2 -3
  37. data/app/models/lesli/user/session.rb +3 -4
  38. data/app/models/lesli/user.rb +50 -46
  39. data/app/operators/lesli/controller_operator.rb +3 -1
  40. data/app/operators/lesli/{role_descriptor_operator.rb → role_operator.rb} +51 -28
  41. data/app/operators/lesli/user_registration_operator.rb +3 -2
  42. data/app/services/lesli/application_lesli_service.rb +8 -4
  43. data/app/services/lesli/role/action_service.rb +58 -0
  44. data/app/services/lesli/role_service.rb +232 -0
  45. data/app/services/lesli/{user_session_service.rb → user/session_service.rb} +23 -14
  46. data/app/services/lesli/user_service.rb +85 -1
  47. data/app/views/lesli/apps/show.html.erb +52 -0
  48. data/app/views/lesli/layouts/application-devise.html.erb +5 -7
  49. data/app/views/lesli/layouts/application-lesli.html.erb +18 -24
  50. data/app/views/lesli/partials/_application-analytics.html.erb +2 -2
  51. data/app/views/lesli/partials/_application-data.html.erb +3 -77
  52. data/app/views/lesli/partials/_application-head.html.erb +7 -4
  53. data/app/views/lesli/partials/_application-lesli-annoouncements.html.erb +49 -0
  54. data/app/views/lesli/partials/_application-lesli-header.html.erb +73 -49
  55. data/app/views/lesli/partials/_application-lesli-javascript.html.erb +3 -16
  56. data/app/views/lesli/partials/_application-lesli-navigation.html.erb +12 -9
  57. data/app/views/lesli/partials/{_application-lesli-notices.html.erb → _application-lesli-notifications.html.erb} +10 -8
  58. data/app/views/lesli/partials/_application-lesli-scss.html.erb +1 -1
  59. data/app/views/lesli/partials/_application-lesli-sidebar.html.erb +1 -1
  60. data/app/views/lesli/partials/_application-public-javascript.html.erb +1 -4
  61. data/app/views/lesli/shared/dashboards/_show.html.erb +63 -0
  62. data/app/views/lesli/wrappers/_application-devise.html.erb +4 -6
  63. data/config/importmap.rb +14 -0
  64. data/config/initializers/lesli.rb +20 -12
  65. data/config/initializers/lesli_migration_helpers.rb +61 -0
  66. data/config/locales/translations.en.yml +1 -26
  67. data/config/locales/translations.es.yml +1 -26
  68. data/config/locales/translations.fr.yml +1 -26
  69. data/config/locales/translations.it.yml +1 -26
  70. data/config/locales/translations.pt.yml +1 -26
  71. data/config/routes.rb +3 -1
  72. data/db/migrate/v1/{0010000110_create_lesli_accounts.rb → 0000000110_create_lesli_accounts.rb} +13 -12
  73. data/db/migrate/v1/0000000210_create_lesli_roles.rb +65 -0
  74. data/db/migrate/v1/0000000310_create_lesli_users.rb +99 -0
  75. data/db/migrate/v1/{0010000610_create_lesli_system_controllers.rb → 0000100110_create_lesli_system_controllers.rb} +3 -3
  76. data/db/migrate/v1/{0010000710_create_lesli_system_controller_actions.rb → 0000100210_create_lesli_system_controller_actions.rb} +3 -4
  77. data/{lib/scss/layouts/application-content.scss → db/migrate/v1/0000110310_create_lesli_account_settings.rb} +8 -6
  78. data/{app/models/lesli/user/agent.rb → db/migrate/v1/0000110410_create_lesli_account_activities.rb} +3 -3
  79. data/db/migrate/v1/0000120210_create_lesli_role_actions.rb +45 -0
  80. data/db/migrate/v1/{0010001410_create_lesli_account_logs.rb → 0000120310_create_lesli_role_privileges.rb} +8 -8
  81. data/db/{tables/0010003810_create_user_shortcuts.rb → migrate/v1/0000130210_create_lesli_user_roles.rb} +9 -12
  82. data/db/migrate/v1/0000130310_create_lesli_user_sessions.rb +56 -0
  83. data/db/{seed/production.rb → migrate/v1/0000130410_create_lesli_user_activities.rb} +7 -4
  84. data/db/{tables/0010001110_create_account_locations.rb → migrate2/0000100510_create_lesli_account_locations.rb} +6 -6
  85. data/db/{tables/0010001510_create_account_currencies.rb → migrate2/0000100610_create_lesli_account_currencies.rb} +4 -4
  86. data/db/seed/{development/accounts.rb → accounts.rb} +6 -2
  87. data/db/seed/{production/users.rb → users.rb} +4 -10
  88. data/db/seed/{tools.rb → xyz.rb} +2 -7
  89. data/db/seeds.rb +3 -2
  90. data/db/structure/00000020_catalogs.json +0 -0
  91. data/lib/generators/{application_lesli_generator.rb → application_lesli_generator_base.rb} +4 -4
  92. data/lib/generators/lesli/spec/spec_generator.rb +2 -2
  93. data/lib/generators/lesli/view/USAGE +8 -0
  94. data/lib/generators/lesli/view/templates/spec-factory.template +17 -0
  95. data/lib/generators/lesli/view/templates/spec-model.template +70 -0
  96. data/lib/generators/lesli/view/view_generator.rb +25 -0
  97. data/lib/lesli/configuration.rb +7 -10
  98. data/lib/lesli/engine.rb +22 -3
  99. data/lib/lesli/r_spec.rb +5 -2
  100. data/lib/lesli/routing.rb +42 -9
  101. data/lib/lesli/version.rb +2 -2
  102. data/lib/lesli.rb +11 -0
  103. data/lib/migrate/common.rb +94 -0
  104. data/lib/migrate/items/action_structure.rb +51 -0
  105. data/{db/migrate/v1/0010001210_create_lesli_account_activities.rb → lib/migrate/items/activity_structure.rb} +18 -16
  106. data/lib/migrate/items/attachment_structure.rb +62 -0
  107. data/{app/views/lesli/partials/_application-lesli-engines.html.erb → lib/migrate/items/discussion_structure.rb} +19 -27
  108. data/lib/migrate/items/subscriber_structure.rb +49 -0
  109. data/lib/migrate/items/version_structure.rb +53 -0
  110. data/lib/migrate/shared/account_structure.rb +21 -0
  111. data/lib/migrate/shared/catalog_structure.rb +30 -0
  112. data/lib/migrate/shared/dashboard_structure.rb +54 -0
  113. data/lib/migrate/shared/setting_structure.rb +20 -0
  114. data/lib/rspec/config/spec_coverage.rb +95 -0
  115. data/{db/migrate/v1/0010001110_create_lesli_account_settings.rb → lib/rspec/factories/lesli_account.rb} +10 -7
  116. data/{db/seed/development.rb → lib/rspec/factories/lesli_role.rb} +30 -3
  117. data/{db/seed/test.rb → lib/rspec/factories/lesli_user.rb} +32 -3
  118. data/lib/rspec/fixtures/files/lesli-icon.png +0 -0
  119. data/lib/rspec/fixtures/files/test_file_1.docx +0 -0
  120. data/{db/tables/0010001610_create_account_currency_exchange_rates.rb → lib/rspec/helpers/lesli_helper.rb} +21 -21
  121. data/lib/rspec/helpers/rails_helper.rb +134 -0
  122. data/lib/rspec/helpers/response_request_helper.rb +214 -0
  123. data/lib/rspec/helpers/response_service_helper.rb +66 -0
  124. data/lib/rspec/helpers/spec_helper.rb +99 -0
  125. data/lib/rspec/lesli_api_tester.rb +133 -0
  126. data/lib/rspec/lesli_service_tester.rb +46 -0
  127. data/{db/tables/0010001410_create_account_files.rb → lib/rspec/testers/controller.rb} +31 -20
  128. data/lib/rspec/testers/model.rb +36 -0
  129. data/lib/rspec/testers/request.rb +84 -0
  130. data/lib/tasks/lesli/db.rake +5 -3
  131. data/lib/tasks/lesli/git.rake +28 -32
  132. data/lib/tasks/lesli/github.rake +89 -0
  133. data/lib/tasks/lesli_tasks.rake +3 -3
  134. data/readme.md +28 -17
  135. metadata +134 -394
  136. data/app/assets/fonts/lesli/Domine/Domine-Variable.ttf +0 -0
  137. data/app/assets/fonts/lesli/Domine/OFL.txt +0 -97
  138. data/app/assets/fonts/lesli/MaterialDesign/icons.woff2 +0 -0
  139. data/app/assets/fonts/lesli/Montserrat/Montserrat-Variable.ttf +0 -0
  140. data/app/assets/fonts/lesli/OpenSans/OpenSans-Variable.ttf +0 -0
  141. data/app/assets/fonts/lesli/Remix/remixicon.eot +0 -0
  142. data/app/assets/fonts/lesli/Remix/remixicon.glyph.json +0 -1
  143. data/app/assets/fonts/lesli/Remix/remixicon.svg +0 -7633
  144. data/app/assets/fonts/lesli/Remix/remixicon.symbol.svg +0 -11
  145. data/app/assets/fonts/lesli/Remix/remixicon.ttf +0 -0
  146. data/app/assets/fonts/lesli/Remix/remixicon.woff +0 -0
  147. data/app/assets/fonts/lesli/Remix/remixicon.woff2 +0 -0
  148. data/app/assets/fonts/lesli/Roboto/LICENSE.txt +0 -202
  149. data/app/assets/fonts/lesli/Roboto/Roboto-Black.ttf +0 -0
  150. data/app/assets/fonts/lesli/Roboto/Roboto-BlackItalic.ttf +0 -0
  151. data/app/assets/fonts/lesli/Roboto/Roboto-Bold.ttf +0 -0
  152. data/app/assets/fonts/lesli/Roboto/Roboto-BoldItalic.ttf +0 -0
  153. data/app/assets/fonts/lesli/Roboto/Roboto-Italic.ttf +0 -0
  154. data/app/assets/fonts/lesli/Roboto/Roboto-Light.ttf +0 -0
  155. data/app/assets/fonts/lesli/Roboto/Roboto-LightItalic.ttf +0 -0
  156. data/app/assets/fonts/lesli/Roboto/Roboto-Medium.ttf +0 -0
  157. data/app/assets/fonts/lesli/Roboto/Roboto-MediumItalic.ttf +0 -0
  158. data/app/assets/fonts/lesli/Roboto/Roboto-Regular.ttf +0 -0
  159. data/app/assets/fonts/lesli/Roboto/Roboto-Thin.ttf +0 -0
  160. data/app/assets/fonts/lesli/Roboto/Roboto-ThinItalic.ttf +0 -0
  161. data/app/assets/icons/lesli/engine-admin.svg +0 -1
  162. data/app/assets/icons/lesli/engine-audit.svg +0 -1
  163. data/app/assets/icons/lesli/engine-babel.svg +0 -1
  164. data/app/assets/icons/lesli/engine-bell.svg +0 -1
  165. data/app/assets/icons/lesli/engine-books.svg +0 -1
  166. data/app/assets/icons/lesli/engine-calendar.svg +0 -1
  167. data/app/assets/icons/lesli/engine-dashboard.svg +0 -1
  168. data/app/assets/icons/lesli/engine-dispatcher.svg +0 -1
  169. data/app/assets/icons/lesli/engine-focus.svg +0 -1
  170. data/app/assets/icons/lesli/engine-kb.svg +0 -1
  171. data/app/assets/icons/lesli/engine-leaf.svg +0 -1
  172. data/app/assets/icons/lesli/engine-lesli.svg +0 -1
  173. data/app/assets/icons/lesli/engine-letter.svg +0 -1
  174. data/app/assets/icons/lesli/engine-mailer.svg +0 -1
  175. data/app/assets/icons/lesli/engine-one.svg +0 -1
  176. data/app/assets/icons/lesli/engine-profile.svg +0 -1
  177. data/app/assets/icons/lesli/engine-proposal.svg +0 -1
  178. data/app/assets/icons/lesli/engine-scraper.svg +0 -1
  179. data/app/assets/icons/lesli/engine-security.svg +0 -1
  180. data/app/assets/icons/lesli/engine-shared.svg +0 -1
  181. data/app/assets/icons/lesli/engine-shield.svg +0 -1
  182. data/app/assets/icons/lesli/engine-storage.svg +0 -1
  183. data/app/assets/icons/lesli/engine-support.svg +0 -1
  184. data/app/assets/icons/lesli/engine-talk.svg +0 -1
  185. data/app/assets/icons/lesli/engine-team.svg +0 -1
  186. data/app/assets/icons/lesli/engine-time.svg +0 -1
  187. data/app/assets/icons/lesli/locale-en.svg +0 -1
  188. data/app/assets/icons/lesli/locale-es.svg +0 -1
  189. data/app/assets/icons/lesli/locale-fr.svg +0 -1
  190. data/app/assets/icons/lesli/locale-it.svg +0 -1
  191. data/app/assets/icons/lesli/locale-pt.svg +0 -1
  192. data/app/assets/icons/readme.md +0 -10
  193. data/app/assets/javascripts/lesli/templates/application.js +0 -14
  194. data/app/assets/javascripts/lesli/templates/public.js +0 -14
  195. data/app/assets/stylesheets/lesli/templates/application.css +0 -2918
  196. data/app/assets/stylesheets/lesli/templates/public.css +0 -1
  197. data/app/controllers/lesli/interfaces/application/authorization.rb +0 -107
  198. data/app/controllers/lesli/interfaces/application/customization.rb +0 -46
  199. data/app/controllers/lesli/interfaces/application/logger.rb +0 -134
  200. data/app/controllers/lesli/interfaces/application/requester.rb +0 -84
  201. data/app/controllers/lesli/interfaces/application/responder.rb +0 -132
  202. data/app/controllers/lesli/interfaces/controllers/actions.rb +0 -250
  203. data/app/controllers/lesli/interfaces/controllers/activities.rb +0 -215
  204. data/app/controllers/lesli/interfaces/controllers/discussions.rb +0 -270
  205. data/app/controllers/lesli/interfaces/controllers/files.rb +0 -467
  206. data/app/controllers/lesli/interfaces/controllers/subscribers.rb +0 -234
  207. data/app/lib/lesli/system.rb +0 -110
  208. data/app/models/lesli/cloud_object/action.rb +0 -70
  209. data/app/models/lesli/cloud_object/activity.rb +0 -311
  210. data/app/models/lesli/cloud_object/custom_field.rb +0 -158
  211. data/app/models/lesli/cloud_object/discussion.rb +0 -219
  212. data/app/models/lesli/cloud_object/subscriber.rb +0 -186
  213. data/app/operators/lesli/descriptor_privilege_operator.rb +0 -75
  214. data/app/views/lesli/emails/devise_mailer/confirmation_instructions.html.erb +0 -23
  215. data/app/views/lesli/emails/devise_mailer/reset_password_instructions.html.erb +0 -23
  216. data/app/views/lesli/partials/_application-lesli-icons.html.erb +0 -1
  217. data/config/initializers/devise.rb +0 -336
  218. data/db/seed/development/users.rb +0 -52
  219. data/db/seed/production/accounts.rb +0 -50
  220. data/db/structure/00000000_people.json +0 -34
  221. data/db/structure/00000003_actions.json +0 -14
  222. data/db/structure/00000004_activities.json +0 -20
  223. data/db/structure/00000005_discussions.json +0 -8
  224. data/db/structure/00000006_files.json +0 -32
  225. data/db/structure/00000007_subscribers.json +0 -11
  226. data/db/structure/00000501_dashboards.json +0 -14
  227. data/db/structure/00000502_dashboard_components.json +0 -23
  228. data/db/tables/0010003410_create_user_activities.rb +0 -51
  229. data/db/tables/0010003710_create_user_codes.rb +0 -43
  230. data/db/tables/0010004110_create_user_tokens.rb +0 -45
  231. data/db/tables/0010005610_create_role_activities.rb +0 -50
  232. data/db/tables/0010009010_create_feedbacks.rb +0 -56
  233. data/lib/mailer_previews/devise_mailer_preview.rb +0 -49
  234. data/lib/scss/cloud-objects/discussion.scss +0 -80
  235. data/lib/scss/cloud-objects/file.scss +0 -138
  236. data/lib/scss/components/keypad.scss +0 -109
  237. data/lib/scss/elements/autocomplete.scss +0 -72
  238. data/lib/scss/elements/card.scss +0 -37
  239. data/lib/scss/elements/empty.scss +0 -43
  240. data/lib/scss/elements/file-uploader.scss +0 -74
  241. data/lib/scss/elements/gallery.scss +0 -98
  242. data/lib/scss/elements/input-tag.scss +0 -73
  243. data/lib/scss/elements/loading.scss +0 -63
  244. data/lib/scss/elements/map.scss +0 -107
  245. data/lib/scss/elements/navbar.scss +0 -115
  246. data/lib/scss/elements/table.scss +0 -118
  247. data/lib/scss/elements/toolbar.scss +0 -66
  248. data/lib/scss/fonts/families.scss +0 -47
  249. data/lib/scss/fonts/mdicons.scss +0 -82
  250. data/lib/scss/fonts/remixicons.scss +0 -2602
  251. data/lib/scss/helpers/display.scss +0 -44
  252. data/lib/scss/helpers/tooltip.scss +0 -91
  253. data/lib/scss/layouts/application-announcements.scss +0 -40
  254. data/lib/scss/layouts/application-component.scss +0 -39
  255. data/lib/scss/layouts/application-engines.scss +0 -125
  256. data/lib/scss/layouts/application-footer.scss +0 -102
  257. data/lib/scss/layouts/application-header.scss +0 -91
  258. data/lib/scss/layouts/application-navigation.scss +0 -79
  259. data/lib/scss/layouts/application-search.scss +0 -71
  260. data/lib/scss/layouts/application-sidebar.scss +0 -219
  261. data/lib/scss/overrides/notification.scss +0 -75
  262. data/lib/scss/overrides/sweetalert.scss +0 -106
  263. data/lib/scss/pages/devise-simple.scss +0 -89
  264. data/lib/scss/pages/devise.scss +0 -179
  265. data/lib/scss/pages/invites.scss +0 -81
  266. data/lib/scss/panels/panel-announcements.scss +0 -56
  267. data/lib/scss/panels/panel-notification.scss +0 -67
  268. data/lib/scss/panels/panel-profile.scss +0 -62
  269. data/lib/scss/panels/panel-support-ticket.scss +0 -56
  270. data/lib/scss/panels/panel-tasks.scss +0 -41
  271. data/lib/scss/settings/variables.scss +0 -148
  272. data/lib/scss/shared/workflow-status-progress.scss +0 -135
  273. data/lib/scss/templates/application.scss +0 -127
  274. data/lib/scss/templates/component.scss +0 -39
  275. data/lib/scss/templates/dashboards.scss +0 -53
  276. data/lib/scss/templates/empty.scss +0 -42
  277. data/lib/scss/templates/pdf.scss +0 -45
  278. data/lib/scss/templates/public.scss +0 -72
  279. data/lib/vue/application.js +0 -285
  280. data/lib/vue/cloudobjects/discussion/content.vue +0 -62
  281. data/lib/vue/cloudobjects/discussion/element.vue +0 -170
  282. data/lib/vue/cloudobjects/discussion/filters.vue +0 -108
  283. data/lib/vue/cloudobjects/discussion/new.vue +0 -134
  284. data/lib/vue/cloudobjects/discussion.vue +0 -99
  285. data/lib/vue/cloudobjects/stores/discussion.js +0 -212
  286. data/lib/vue/layouts/application-announcements.vue +0 -78
  287. data/lib/vue/layouts/application-component.vue +0 -38
  288. data/lib/vue/layouts/application-container.vue +0 -48
  289. data/lib/vue/layouts/application-engines.vue +0 -66
  290. data/lib/vue/layouts/application-footer.vue +0 -123
  291. data/lib/vue/layouts/application-header.vue +0 -252
  292. data/lib/vue/layouts/application-navbar.vue +0 -110
  293. data/lib/vue/layouts/application-search.vue +0 -86
  294. data/lib/vue/layouts/application-sidebar.vue +0 -63
  295. data/lib/vue/pages/errors/app.js +0 -32
  296. data/lib/vue/pages/invites/app.js +0 -76
  297. data/lib/vue/pages/mfas/application.js +0 -77
  298. data/lib/vue/pages/onboarding/application.js +0 -45
  299. data/lib/vue/pages/onboarding/components/address.vue +0 -120
  300. data/lib/vue/pages/onboarding/components/buttons.vue +0 -67
  301. data/lib/vue/pages/onboarding/components/contact.vue +0 -148
  302. data/lib/vue/pages/onboarding/components/date-time.vue +0 -265
  303. data/lib/vue/pages/onboarding/components/finish.vue +0 -62
  304. data/lib/vue/pages/onboarding/components/general-info.vue +0 -93
  305. data/lib/vue/pages/onboarding/components/indicators.vue +0 -78
  306. data/lib/vue/pages/onboarding/components/welcome.vue +0 -66
  307. data/lib/vue/pages/onboarding/show.vue +0 -67
  308. data/lib/vue/pages/onboarding/store.js +0 -165
  309. data/lib/vue/pages/otps/application.js +0 -90
  310. data/lib/vue/pages/passes/application.js +0 -80
  311. data/lib/vue/pages/websites/application.js +0 -34
  312. data/lib/vue/panels/panel-announcements.vue +0 -248
  313. data/lib/vue/panels/panel-bell-notifications.vue +0 -102
  314. data/lib/vue/panels/panel-files.vue +0 -281
  315. data/lib/vue/panels/panel-profile.vue +0 -76
  316. data/lib/vue/panels/panel-support-tickets.vue +0 -163
  317. data/lib/vue/panels/panel-tasks.vue +0 -124
  318. data/lib/vue/panels/stores/bell-notifications.js +0 -46
  319. data/lib/vue/panels/stores/support-tickets.js +0 -103
  320. data/lib/vue/public.js +0 -83
  321. data/lib/vue/refactor/shared/cloudobjects/action.vue +0 -193
  322. data/lib/vue/refactor/shared/cloudobjects/file/grid.vue +0 -215
  323. data/lib/vue/refactor/shared/cloudobjects/file/list.vue +0 -106
  324. data/lib/vue/refactor/shared/cloudobjects/file.vue +0 -145
  325. data/lib/vue/refactor/shared/workflows2/apps/actions/form.vue +0 -232
  326. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/chatroom-form.vue +0 -103
  327. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/cloud-object-clone-form.vue +0 -125
  328. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/cloud-object-file-form.vue +0 -102
  329. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/email-form.vue +0 -190
  330. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/notification-form.vue +0 -124
  331. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/send-cloud-object-file.vue +0 -170
  332. data/lib/vue/refactor/shared/workflows2/apps/actions/forms/task-form.vue +0 -258
  333. data/lib/vue/refactor/shared/workflows2/apps/actions/index.vue +0 -146
  334. data/lib/vue/refactor/shared/workflows2/apps/checks/form.vue +0 -200
  335. data/lib/vue/refactor/shared/workflows2/apps/checks/index.vue +0 -160
  336. data/lib/vue/refactor/shared/workflows2/apps/index.vue +0 -177
  337. data/lib/vue/refactor/shared/workflows2/apps/new.vue +0 -97
  338. data/lib/vue/refactor/shared/workflows2/apps/show.vue +0 -146
  339. data/lib/vue/refactor/shared/workflows2/components/associations.vue +0 -215
  340. data/lib/vue/refactor/shared/workflows2/components/chart.vue +0 -91
  341. data/lib/vue/refactor/shared/workflows2/components/workflow-form.vue +0 -466
  342. data/lib/vue/refactor/shared/workflows2/components/workflow-status-dropdown.vue +0 -129
  343. data/lib/vue/refactor/stores/cloudobjects/action.js +0 -181
  344. data/lib/vue/refactor/stores/cloudobjects/file.js +0 -205
  345. data/lib/vue/refactor/stores/entities/announcements.js +0 -75
  346. data/lib/vue/refactor/stores/entities/dashboard.js +0 -251
  347. data/lib/vue/refactor/stores/entities/workflow.js +0 -185
  348. data/lib/vue/refactor/stores/panels/announcements.js +0 -153
  349. data/lib/vue/refactor/stores/panels/notification.js +0 -114
  350. data/lib/vue/refactor/stores/panels/task.js +0 -66
  351. data/lib/vue/refactor/stores/panels/tickets.js +0 -129
  352. data/lib/vue/refactor/stores/role.js +0 -243
  353. data/lib/vue/refactor/stores/translations.json +0 -60
  354. data/lib/vue/refactor/stores/users.js +0 -98
  355. data/lib/vue/shared/dashboards/apps/edit.vue +0 -215
  356. data/lib/vue/shared/dashboards/apps/index.vue +0 -112
  357. data/lib/vue/shared/dashboards/apps/new.vue +0 -89
  358. data/lib/vue/shared/dashboards/apps/show.vue +0 -88
  359. data/lib/vue/shared/dashboards/components/form.vue +0 -246
  360. data/lib/vue/shared/services/firebase.js +0 -163
  361. data/lib/vue/shared/services/translator.js +0 -87
  362. data/lib/vue/shared/stores/command.js +0 -154
  363. data/lib/vue/shared/stores/dashboard.js +0 -253
  364. data/lib/vue/shared/stores/layout.js +0 -61
  365. data/lib/vue/shared/stores/systemController.js +0 -67
  366. data/lib/vue/shared/stores/users.js +0 -57
  367. data/lib/vue/stores/translations.json +0 -177
  368. data/lib/vue/translation.js +0 -45
  369. data/lib/webpack/base.js +0 -191
  370. data/lib/webpack/core.js +0 -93
  371. data/lib/webpack/engines.js +0 -167
  372. data/lib/webpack/root.js +0 -105
  373. data/lib/webpack/version.js +0 -78
  374. data/vendor/bulma/LICENSE +0 -21
  375. data/vendor/bulma/bulma.sass +0 -10
  376. data/vendor/bulma/css/bulma-rtl.css +0 -11851
  377. data/vendor/bulma/css/bulma-rtl.min.css +0 -1
  378. data/vendor/bulma/css/bulma.css +0 -11851
  379. data/vendor/bulma/css/bulma.min.css +0 -1
  380. data/vendor/bulma/sass/base/_all.sass +0 -6
  381. data/vendor/bulma/sass/base/animations.sass +0 -5
  382. data/vendor/bulma/sass/base/generic.sass +0 -145
  383. data/vendor/bulma/sass/base/helpers.sass +0 -1
  384. data/vendor/bulma/sass/base/minireset.sass +0 -79
  385. data/vendor/bulma/sass/components/_all.sass +0 -15
  386. data/vendor/bulma/sass/components/breadcrumb.sass +0 -77
  387. data/vendor/bulma/sass/components/card.sass +0 -103
  388. data/vendor/bulma/sass/components/dropdown.sass +0 -83
  389. data/vendor/bulma/sass/components/level.sass +0 -79
  390. data/vendor/bulma/sass/components/media.sass +0 -59
  391. data/vendor/bulma/sass/components/menu.sass +0 -59
  392. data/vendor/bulma/sass/components/message.sass +0 -101
  393. data/vendor/bulma/sass/components/modal.sass +0 -117
  394. data/vendor/bulma/sass/components/navbar.sass +0 -446
  395. data/vendor/bulma/sass/components/pagination.sass +0 -167
  396. data/vendor/bulma/sass/components/panel.sass +0 -121
  397. data/vendor/bulma/sass/components/tabs.sass +0 -176
  398. data/vendor/bulma/sass/elements/_all.sass +0 -16
  399. data/vendor/bulma/sass/elements/box.sass +0 -26
  400. data/vendor/bulma/sass/elements/button.sass +0 -357
  401. data/vendor/bulma/sass/elements/container.sass +0 -29
  402. data/vendor/bulma/sass/elements/content.sass +0 -162
  403. data/vendor/bulma/sass/elements/form.sass +0 -1
  404. data/vendor/bulma/sass/elements/icon.sass +0 -46
  405. data/vendor/bulma/sass/elements/image.sass +0 -73
  406. data/vendor/bulma/sass/elements/notification.sass +0 -52
  407. data/vendor/bulma/sass/elements/other.sass +0 -31
  408. data/vendor/bulma/sass/elements/progress.sass +0 -73
  409. data/vendor/bulma/sass/elements/table.sass +0 -134
  410. data/vendor/bulma/sass/elements/tag.sass +0 -140
  411. data/vendor/bulma/sass/elements/title.sass +0 -70
  412. data/vendor/bulma/sass/form/_all.sass +0 -9
  413. data/vendor/bulma/sass/form/checkbox-radio.sass +0 -22
  414. data/vendor/bulma/sass/form/file.sass +0 -184
  415. data/vendor/bulma/sass/form/input-textarea.sass +0 -66
  416. data/vendor/bulma/sass/form/select.sass +0 -88
  417. data/vendor/bulma/sass/form/shared.sass +0 -60
  418. data/vendor/bulma/sass/form/tools.sass +0 -215
  419. data/vendor/bulma/sass/grid/_all.sass +0 -5
  420. data/vendor/bulma/sass/grid/columns.sass +0 -513
  421. data/vendor/bulma/sass/grid/tiles.sass +0 -36
  422. data/vendor/bulma/sass/helpers/_all.sass +0 -12
  423. data/vendor/bulma/sass/helpers/color.sass +0 -39
  424. data/vendor/bulma/sass/helpers/flexbox.sass +0 -35
  425. data/vendor/bulma/sass/helpers/float.sass +0 -10
  426. data/vendor/bulma/sass/helpers/other.sass +0 -14
  427. data/vendor/bulma/sass/helpers/overflow.sass +0 -2
  428. data/vendor/bulma/sass/helpers/position.sass +0 -7
  429. data/vendor/bulma/sass/helpers/spacing.sass +0 -31
  430. data/vendor/bulma/sass/helpers/typography.sass +0 -103
  431. data/vendor/bulma/sass/helpers/visibility.sass +0 -122
  432. data/vendor/bulma/sass/layout/_all.sass +0 -6
  433. data/vendor/bulma/sass/layout/footer.sass +0 -11
  434. data/vendor/bulma/sass/layout/hero.sass +0 -153
  435. data/vendor/bulma/sass/layout/section.sass +0 -17
  436. data/vendor/bulma/sass/utilities/_all.sass +0 -9
  437. data/vendor/bulma/sass/utilities/animations.sass +0 -1
  438. data/vendor/bulma/sass/utilities/controls.sass +0 -49
  439. data/vendor/bulma/sass/utilities/derived-variables.sass +0 -114
  440. data/vendor/bulma/sass/utilities/extends.sass +0 -25
  441. data/vendor/bulma/sass/utilities/functions.sass +0 -135
  442. data/vendor/bulma/sass/utilities/initial-variables.sass +0 -79
  443. data/vendor/bulma/sass/utilities/mixins.sass +0 -303
  444. data/vendor/lesli-css/_index.scss +0 -34
  445. data/vendor/lesli-css/lesli.scss +0 -51
  446. data/vendor/lesli-css/license +0 -28
  447. data/vendor/lesli-css/src/base/fonts.scss +0 -50
  448. data/vendor/lesli-css/src/base/normalize.scss +0 -118
  449. data/vendor/lesli-css/src/components/blockquote.scss +0 -61
  450. data/vendor/lesli-css/src/components/columns.scss +0 -92
  451. data/vendor/lesli-css/src/components/container.scss +0 -47
  452. data/vendor/lesli-css/src/components/navigation.scss +0 -59
  453. data/vendor/lesli-css/src/functions/colors.scss +0 -184
  454. data/vendor/lesli-css/src/helpers/units.scss +0 -44
  455. data/vendor/lesli-css/src/mixins/breakpoint.scss +0 -184
  456. data/vendor/lesli-css/src/mixins/flex.scss +0 -80
  457. data/vendor/lesli-css/src/mixins/scrollbar.scss +0 -46
  458. data/vendor/lesli-css/src/settings/variables.scss +0 -26
  459. data/vendor/lesli-css/tests/base/normalize.spec.scss +0 -125
  460. data/vendor/lesli-css/tests/functions/colors.spec.scss +0 -117
  461. data/vendor/lesli-css/tests/mixins/breakpoint.spec.scss +0 -429
  462. data/vendor/lesli-css/tests/mixins/scrollbar.spec.scss +0 -82
  463. data/vendor/lesli-css/vendor/normalize.scss +0 -351
  464. data/vendor/remixicon/License +0 -201
  465. data/vendor/remixicon/fonts/remixicon.css +0 -2583
  466. /data/{vendor/lesli-css/src/components/grid.scss → app/assets/stylesheets/lesli/application.css} +0 -0
  467. /data/db/migrate/v1/{0010001010_create_lesli_account_details.rb → 0000110210_create_lesli_account_details.rb} +0 -0
  468. /data/db/structure/{00000008_custom_fields.json → 00000300_custom_fields.json} +0 -0
  469. /data/lib/assets/javascripts/lesli/{i18n.js → i18n_js} +0 -0
@@ -1,467 +0,0 @@
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 Interfaces
36
- module Controllers
37
- module Files
38
-
39
-
40
- # @return [Json] Json that contains a list of all files related to a *cloud_object*
41
- # @description Retrieves and returns all files associated to a *cloud_object*. The id of the
42
- # *cloud_object* is within the *params* attribute. If the child class provides a block, the function is
43
- # yielded sending the files as parameters. The block given *must* return the HTTP response
44
- # @example
45
- # # Executing this controller's action from javascript's frontend
46
- # let ticket_id = 1;
47
- # this.http.get(`127.0.0.1/help/tickets/${ticket_id}/files.json`);
48
- def index
49
- file_model = file_model() # If there is a custom file model, it must be returned in this method
50
- cloud_object_model = file_model.cloud_object_model
51
- account_model = cloud_object_model.reflect_on_association(:account).klass
52
-
53
- #Get filters from http request
54
- filters = params[:f]
55
-
56
- #Get start and final date only if the request have filters
57
- unless filters.blank?
58
- file_type = filters[:file_type]
59
- end
60
-
61
- respond_to do |format|
62
- format.json do
63
- @files = file_model.where(
64
- "#{cloud_object_model.table_name}_id".to_sym => params["#{cloud_object_model.name.demodulize.underscore}_id".to_sym]
65
- )
66
-
67
- # Filter results
68
- unless file_type.blank?
69
- @files = @files.where(file_type: file_type)
70
- end
71
-
72
- @files = @files
73
- .order(id: :desc).map do |file|
74
- file_attributes = file.attributes
75
- file_attributes["user_creator_name"] = file.user_creator&.full_name
76
- file_attributes["public_url"] = file.attachment_public.url if file.attachment_public
77
- file_attributes["created_at_raw"] = file_attributes["created_at"]
78
- file_attributes["created_at"] = LC::Date2.new(file_attributes["created_at"]).date_time.to_s
79
- file_attributes["updated_at_raw"] = file_attributes["updated_at"]
80
- file_attributes["updated_at"] = LC::Date2.new(file_attributes["updated_at"]).date_time.to_s
81
- file_attributes["editable"] = file.is_editable_by?(current_user)
82
- file_attributes
83
- end
84
-
85
- if block_given?
86
- yield(@files)
87
- else
88
- respond_with_successful(@files)
89
- end
90
- end
91
-
92
- format.zip do
93
-
94
- end
95
- end
96
- end
97
-
98
-
99
- # @controller_action_param :attachment [File] The uploaded attachment
100
- # @controller_action_param :name [String] The name to be displayed
101
- # @controller_action_param :file_type [String] The file type of
102
- # @return [Json] Json that contains wheter the creation of the file was successful or not.
103
- # If it is not successful, it returs an error message
104
- # @description Creates a new file associated to a *cloud_object*. The id of the
105
- # *cloud_object* is within the *params* attribute. If the child class provides a block, the function is
106
- # yielded sending the cloud_object as first param, and the file as second param.
107
- # The block given *must* return the HTTP response
108
- # @example
109
- # # Executing this controller's action from javascript's frontend
110
- # let ticket_id = 1;
111
- # let data = {
112
- # ticket_file: {
113
- # file: FILE_CONTENT
114
- # name: "contract_information"
115
- # }
116
- # };
117
- # this.http.post(`127.0.0.1/help/tickets/${ticket_id}/files`, data);
118
- def create
119
- file_model = file_model() # If there is a custom file model, it must be returned in this method
120
- cloud_object_model = file_model.cloud_object_model
121
-
122
- set_cloud_object
123
- new_file_params = file_params.merge(
124
- user_creator: current_user,
125
- cloud_object: @cloud_object
126
- )
127
-
128
- # Verifying the extension of the file. If it's valid, the block will be executed
129
- decode_and_verify_file(new_file_params) do |verified_file_params|
130
- file = file_model.new(verified_file_params)
131
-
132
- if file.save
133
- # Setting the file name in case it's blank and updating the file in case the filename changed
134
- if file.name.blank?
135
- file.update(
136
- name: params["#{cloud_object_model.name.demodulize.underscore}_file".to_sym][:attachment].original_filename
137
- )
138
- else
139
- file.update({})
140
- end
141
-
142
- cloud_object = file.cloud_object
143
-
144
- # Setting up file uploader to upload in background
145
- Files::AwsUploadJob.perform_later(file)
146
-
147
- if block_given?
148
- yield(cloud_object, file)
149
- else
150
- # Registering an activity in the cloud_object
151
- cloud_object.activities.create(
152
- user_creator: current_user,
153
- category: "action_create_file",
154
- description: "#{file.name} - #{file.attachment_identifier}"
155
- )
156
-
157
- # Returning the 200 HTTP response
158
- respond_with_successful(file)
159
- end
160
- else
161
- respond_with_error(file.errors.full_messages.to_sentence)
162
- end
163
- end
164
- end
165
-
166
- # @controller_action_param :attachment [File] The uploaded attachment
167
- # @controller_action_param :name [String] The name to be displayed
168
- # @controller_action_param :file_type [String] The file type of
169
- # @return [Json] Json that contains wheter the creation of the file was successful or not.
170
- # If it is not successful, it returs an error message
171
- # @description Updates an existing file associated to a *cloud_object*. The id of the
172
- # *cloud_object* is within the *params* attribute. If the child class provides a block, the function is
173
- # yielded sending the cloud_object as first param, and the file as second param.
174
- # The block given *must* return the HTTP response
175
- # @example
176
- # # Executing this controller's action from javascript's frontend
177
- # let ticket_id = 1;
178
- # let data = {
179
- # ticket_file: {
180
- # file: FILE_CONTENT
181
- # name: "contract_information"
182
- # }
183
- # };
184
- # this.http.put(`127.0.0.1/help/tickets/${ticket_id}/files`, data);
185
- def update
186
- set_file
187
- return respond_with_not_found unless @file
188
-
189
- # Verifying the extension of the file. If it's valid, the block will be executed
190
- decode_and_verify_file(file_params) do |verified_file_params|
191
- if @file.update(verified_file_params)
192
-
193
- # Setting up file uploader to upload in background
194
- Files::AwsUploadJob.perform_later(@file)
195
-
196
- if block_given?
197
- yield(@cloud_object, @file)
198
- else
199
- # Registering an activity in the cloud_object
200
- @file.cloud_object.activities.create(
201
- user_creator: current_user,
202
- category: "action_update_file",
203
- description: "#{@file.name} - #{@file.attachment_identifier}"
204
- )
205
-
206
- # Returning the 200 HTTP response
207
- respond_with_successful(@file)
208
- end
209
- else
210
- respond_with_error(@file.errors.full_messages.to_sentence)
211
- end
212
- end
213
- end
214
-
215
- # @return [void]
216
- # @description Prepares the files for download and redirects the explorer to a new window,
217
- # where they can view/download the file. The id of the
218
- # *cloud_object* and the id of the *file* are within the *params* attribute
219
- # @example
220
- # # Executing this controller's action from javascript's frontend
221
- # let ticket_id = 1;
222
- # let file_id = 5;
223
- # this.http.get(`127.0.0.1/help/tickets/${ticket_id}/files/${file_id}`);
224
- def show
225
- set_file
226
- return respond_with_not_found unless @file
227
-
228
- file_model = file_model()
229
-
230
- disposition = "inline"
231
- disposition = "attachment" if params["download"]
232
-
233
- begin
234
- # Sending file using CarrierWave
235
- if @file.attachment_s3.file
236
-
237
- # We either get the file from AWS and serve it ourselves or provide a direct AWS link with expiration time
238
- if @file.size_mb && @file.size_mb > file_model.size_threshold
239
- redirect_to(@file.refresh_external_url, allow_other_host: true)
240
- else
241
- send_data(@file.attachment_s3.read, filename: @file.attachment_s3_identifier, disposition: disposition, stream: "true")
242
- end
243
- elsif @file.attachment_public.file
244
- redirect_to(@file.attachment_public_url, allow_other_host: true)
245
- else
246
- send_data(@file.attachment.read, filename: @file.attachment_identifier, disposition: disposition, stream: "true")
247
- end
248
- rescue => exception
249
- # Logging the failure to retrieve the file
250
- @file.cloud_object.activities.create(
251
- user_creator: current_user,
252
- category: "action_not_found_file",
253
- description: "#{@file.name} - #{@file.attachment_identifier}"
254
- )
255
-
256
- # Returning a generic image in response if the file is not found on storage
257
- redirect_to("/assets/global/generic.png")
258
- end
259
- end
260
-
261
- # @return [Json] A response that contains wheter the file was deleted or not.
262
- # If it is not successful, it returns an error message
263
- # @description Deletes a file from the database based on the id of the *cloud_object* and its own id. If a block is given,
264
- # the function is yielded with no arguments after the file is destroyed
265
- # @example
266
- # # Executing this controller's action from javascript's frontend
267
- # let ticket_id = 1;
268
- # let file_id = 22;
269
- # this.http.delete(`127.0.0.1/help/tickets/${ticket_id}/files/${file_id}`);
270
- def destroy
271
- set_file
272
- return respond_with_not_found unless @file
273
- return respond_with_unauthorized unless @file.is_editable_by?(current_user)
274
-
275
- if @file.destroy
276
- if block_given?
277
- yield(@cloud_object, @file)
278
- else
279
- # Registering an activity in the cloud_object
280
- @file.cloud_object.activities.create(
281
- user_creator: current_user,
282
- category: "action_destroy_file",
283
- description: @file.name
284
- )
285
-
286
- respond_with_successful
287
- end
288
- else
289
- respond_with_error(@file.errors.full_messages.to_sentence)
290
- end
291
- end
292
-
293
- # @return [void]
294
- # @description Returns a list of needed information in order to create a file.
295
- # For the time being, it only returns a list of all file types
296
- # @example
297
- # # Executing this controller's action from javascript's frontend
298
- # this.http.get('127.0.0.1/house/options/project/files')
299
- def options
300
- file_model = file_model() # If there is a custom file model, it must be returned in this method
301
- respond_with_successful(file_model.options(@query))
302
- end
303
-
304
- # @return [void]
305
- # @description Creates a zip file with all selected documents and sends it to the user. Note that files
306
- # that don't belong to the current_user's account will be ignored. This method is deprecated, use
307
- # the index method instead.
308
- # @example
309
- # # Executing this controller's action from javascript's frontend
310
- # this.http.get('127.0.0.1/house/projects/1/resources/files-zip-download&ids=1,2,3,4');
311
- def zip_download
312
-
313
- end
314
-
315
- protected
316
-
317
- def decode_and_verify_file(file_params)
318
-
319
- # Verifying the extension of the file
320
- extension = ""
321
-
322
- if file_params[:attachment]
323
-
324
- # if attachment is a string, it means that it's a base64 encoded file
325
- if file_params[:attachment].is_a? String
326
- # Base64 images
327
-
328
- if file_params[:name]
329
- file_name = file_params[:name].downcase.gsub(" ","_")
330
- elsif @file
331
- file_name = @file.name.downcase.gsub(" ","_")
332
- else
333
- file_name = "file_#{DateTime.now.strftime("%Y%m%d%H%M%S")}"
334
- end
335
-
336
- img_from_base64 = Base64.decode64(file_params[:attachment])
337
-
338
- begin
339
- extension = /(png|jpg|jpeg|exif|jfif)/.match(img_from_base64[0,16].downcase)[0]
340
- rescue
341
- return respond_with_error(I18n.t("core.shared.messages_warning_files_extension_not_allowed"))
342
- end
343
-
344
- # Due a encode issue, jpeg images are sent as jfif
345
- extension = "jpeg" if extension == "jfif"
346
- extension = "png" if extension == "exif"
347
-
348
- return respond_with_error(I18n.t("core.shared.messages_warning_files_extension_not_allowed")) unless file_model.verify_file_extension(extension)
349
-
350
- file_path = Rails.root.join("public", "uploads", "tmp", file_name << '.' << extension)
351
- File.open(file_path, 'wb') do|f|
352
- f.write(img_from_base64)
353
- end
354
-
355
- file_params[:attachment] = File.open(Rails.root.join(file_path), "rb")
356
- file_params[:size_mb] = file_params[:attachment].size.to_f / (1024*1024)
357
- FileUtils.rm_rf(Rails.root.join(file_path))
358
- else
359
- extension = file_params[:attachment].original_filename
360
- file_params[:size_mb] = file_params[:attachment].size.to_f / (1024*1024)
361
-
362
- return respond_with_error(I18n.t("core.shared.messages_warning_files_extension_not_allowed")) unless file_model.verify_file_extension(extension)
363
- end
364
-
365
- file_params[:external_url] = nil
366
- end
367
-
368
- if block_given?
369
- yield(file_params)
370
- end
371
- end
372
-
373
- # @return [void]
374
- # @description This function handles the zip download based on the type of attachment that the file has.
375
- # If the attachment is local, it means that the file has not yet been uploaded to S3 and will be handled
376
- # accordingly
377
- # @example
378
- # # Executing this controller's action from javascript's frontend
379
- # this.http.get('127.0.0.1/house/options/project/1/files/zip&ids=1,2,3,4');
380
- def handle_zip_download(files)
381
-
382
- end
383
-
384
- # @return [void]
385
- # @descriptions Sets the variable @cloud_object based on the paremeters send in the URL. If no,
386
- # cloud_object is found or it is not within the current_user's account, nil is used instead
387
- # @example
388
- # # Imagine you are inside CloudFocus::Task::FilesController
389
- # puts @cloud_object # will display nil
390
- # set_cloud_object
391
- # puts @cloud_object # Will display an instance of CloudFocus::Task
392
- def set_cloud_object
393
- file_model = file_model() # If there is a custom file model, it must be returned in this method
394
- cloud_object_model = file_model.cloud_object_model
395
- account_model = cloud_object_model.reflect_on_association(:account).klass
396
-
397
- @cloud_object = cloud_object_model.find_by(
398
- id: params["#{cloud_object_model.name.demodulize.underscore}_id".to_sym],
399
- "#{account_model.table_name}_id".to_sym => current_user.account.id
400
- )
401
- end
402
-
403
- # @return [void]
404
- # @description Sets the variable @file. The variable contains the file
405
- # to be updated based on the id of the *cloud_object* and the id of the *file*. The variable
406
- # will only be available if the file belongs to the current_user's account
407
- # @example
408
- # #suppose params[:ticket_id] = 1
409
- # #suppose params[:id] = 44
410
- # puts @file # will display nil
411
- # set_file
412
- # puts @file # will display an instance of CloudHelp:Ticket::File
413
- def set_file
414
- set_cloud_object
415
- return unless @cloud_object
416
-
417
- @file = @cloud_object.files.find_by(id: params[:id])
418
- end
419
-
420
- # @return [Parameters] Allowed parameters for the file
421
- # @description Sanitizes the parameters received from an HTTP call to only allow the specified ones.
422
- # Allowed params are _:name_, _:file_type_, _:attachment_
423
- # @example
424
- # # supose params contains {
425
- # # "ticket_file": {
426
- # # "id": 5,
427
- # # "name": "User Contract",
428
- # # "file": FILE_CONTENT,
429
- # # "ticket_id": 55,
430
- # # "word": false
431
- # # }
432
- # #}
433
- # file_params = file_params
434
- # puts file_params
435
- # # will remove _id_ and _word_ fields and only print {
436
- # # "ticket_file": {
437
- # # "name": "User Contract",
438
- # # "attachment": FILE_CONTENT
439
- # # }
440
- # #}
441
- def file_params
442
- file_model = file_model() # If there is a custom file model, it must be returned in this method
443
- cloud_object_model = file_model.cloud_object_model
444
-
445
- params.fetch(
446
- "#{cloud_object_model.name.demodulize.underscore}_file".to_sym, {}
447
- ).permit(
448
- :name,
449
- :attachment,
450
- :file_type
451
- )
452
- end
453
-
454
- # @return [CloudObject::File] The file model that the controller will handle
455
- # @descriptions Constantizes and returns the file model associated to this controller. This method
456
- # can be overrided by the implementation in the child controller
457
- # @example
458
- # # Suppose you are inside CloudHelp::Ticket::FilesController
459
- # puts file_model().new
460
- # # This will display a new instance of CloudHelp::Ticket::File
461
- def file_model
462
- self.class.name.gsub("Controller","").singularize.constantize
463
- end
464
- end
465
- end
466
- end
467
- end