lesli_help 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +5 -0
  3. data/app/assets/config/lesli_help_manifest.js +38 -0
  4. data/app/assets/images/lesli_help/help-logo.svg +9 -0
  5. data/app/assets/javascripts/lesli_help/application.js +6203 -0
  6. data/app/assets/stylesheets/lesli_help/application.css +15 -0
  7. data/app/controllers/lesli_help/accounts_controller.rb +60 -0
  8. data/app/controllers/lesli_help/application_controller.rb +4 -0
  9. data/app/controllers/lesli_help/dashboard/components_controller.rb +92 -0
  10. data/app/controllers/lesli_help/dashboards_controller.rb +36 -0
  11. data/app/controllers/lesli_help/tickets_controller.rb +171 -0
  12. data/app/helpers/lesli_help/accounts_helper.rb +4 -0
  13. data/app/helpers/lesli_help/application_helper.rb +4 -0
  14. data/app/helpers/lesli_help/dashboards_helper.rb +4 -0
  15. data/app/jobs/lesli_help/application_job.rb +4 -0
  16. data/app/mailers/lesli_help/application_mailer.rb +6 -0
  17. data/app/models/lesli_help/account.rb +38 -0
  18. data/app/models/lesli_help/application_record.rb +5 -0
  19. data/app/models/lesli_help/dashboard/component.rb +18 -0
  20. data/app/models/lesli_help/dashboard.rb +28 -0
  21. data/app/models/lesli_help/ticket.rb +39 -0
  22. data/app/services/lesli_help/ticket_service.rb +120 -0
  23. data/app/views/layouts/lesli_help/application.html.erb +15 -0
  24. data/app/views/lesli_help/accounts/_account.html.erb +2 -0
  25. data/app/views/lesli_help/accounts/_form.html.erb +17 -0
  26. data/app/views/lesli_help/accounts/edit.html.erb +10 -0
  27. data/app/views/lesli_help/accounts/index.html.erb +14 -0
  28. data/app/views/lesli_help/accounts/new.html.erb +9 -0
  29. data/app/views/lesli_help/accounts/show.html.erb +10 -0
  30. data/app/views/lesli_help/dashboards/edit.html.erb +1 -0
  31. data/app/views/lesli_help/dashboards/index.html.erb +1 -0
  32. data/app/views/lesli_help/dashboards/new.html.erb +1 -0
  33. data/app/views/lesli_help/dashboards/show.html.erb +1 -0
  34. data/app/views/lesli_help/partials/_engine-navigation.html.erb +39 -0
  35. data/app/views/lesli_help/tickets/edit.html.erb +20 -0
  36. data/app/views/lesli_help/tickets/index.html.erb +34 -0
  37. data/app/views/lesli_help/tickets/new.html.erb +20 -0
  38. data/app/views/lesli_help/tickets/show.html.erb +20 -0
  39. data/config/locales/translations.en.yml +23 -0
  40. data/config/locales/translations.es.yml +23 -0
  41. data/config/routes.rb +51 -0
  42. data/db/migrate/v1/0702000110_create_lesli_help_accounts.rb +42 -0
  43. data/db/migrate/v1/0702000210_create_lesli_help_account_settings.rb +46 -0
  44. data/db/migrate/v1/0702050110_create_lesli_help_dashboards.rb +50 -0
  45. data/db/migrate/v1/0702050210_create_lesli_help_dashboard_components.rb +50 -0
  46. data/db/migrate/v1/0702100110_create_lesli_help_slas.rb +59 -0
  47. data/db/migrate/v1/0702110110_create_lesli_help_tickets.rb +93 -0
  48. data/db/seed/development.rb +43 -0
  49. data/db/seed/production.rb +31 -0
  50. data/db/seed/test.rb +31 -0
  51. data/db/seeds.rb +43 -0
  52. data/db/tables/0702010110_create_cloud_help_catalogs.rb +8 -0
  53. data/db/tables/0702010210_create_cloud_help_catalog_ticket_categories.rb +44 -0
  54. data/db/tables/0702010310_create_cloud_help_catalog_ticket_priorities.rb +46 -0
  55. data/db/tables/0702010410_create_cloud_help_catalog_ticket_types.rb +44 -0
  56. data/db/tables/0702010510_create_cloud_help_catalog_ticket_sources.rb +44 -0
  57. data/db/tables/0702010610_create_cloud_help_catalog_ticket_workspaces.rb +38 -0
  58. data/db/tables/0702020110_create_cloud_help_workflows.rb +47 -0
  59. data/db/tables/0702020210_create_cloud_help_workflow_statuses.rb +47 -0
  60. data/db/tables/0702020310_create_cloud_help_workflow_associations.rb +29 -0
  61. data/db/tables/0702020410_create_cloud_help_workflow_actions.rb +18 -0
  62. data/db/tables/0702020510_create_cloud_help_workflow_checks.rb +20 -0
  63. data/db/tables/0702030110_create_cloud_help_custom_fields.rb +15 -0
  64. data/db/tables/0702040110_create_cloud_help_custom_validations.rb +16 -0
  65. data/db/tables/0702040210_create_cloud_help_custom_validation_rules.rb +16 -0
  66. data/db/tables/0702040310_create_cloud_help_custom_validation_fields.rb +16 -0
  67. data/db/tables/0702100310_create_cloud_help_ticket_actions.rb +16 -0
  68. data/db/tables/0702100410_create_cloud_help_ticket_activities.rb +15 -0
  69. data/db/tables/0702100510_create_cloud_help_ticket_discussions.rb +17 -0
  70. data/db/tables/0702100610_create_cloud_help_ticket_files.rb +16 -0
  71. data/db/tables/0702100710_create_cloud_help_ticket_subscribers.rb +16 -0
  72. data/db/tables/0702101010_create_cloud_help_ticket_timelines.rb +14 -0
  73. data/db/tables/0702101110_create_cloud_help_ticket_assignments.rb +15 -0
  74. data/db/tables/0702101210_create_cloud_help_ticket_histories.rb +15 -0
  75. data/db/tables/0702110310_create_cloud_help_sla_actions.rb +17 -0
  76. data/db/tables/0702110410_create_cloud_help_sla_activities.rb +15 -0
  77. data/db/tables/0702110510_create_cloud_help_sla_discussions.rb +17 -0
  78. data/db/tables/0702110610_create_cloud_help_sla_files.rb +16 -0
  79. data/db/tables/0702110710_create_cloud_help_sla_subscribers.rb +16 -0
  80. data/db/tables/0702111010_create_cloud_help_sla_associations.rb +13 -0
  81. data/lib/lesli_help/engine.rb +50 -0
  82. data/lib/lesli_help/version.rb +4 -0
  83. data/lib/lesli_help.rb +6 -0
  84. data/lib/tasks/lesli_help_tasks.rake +4 -0
  85. data/lib/vue/application.js +85 -0
  86. data/lib/vue/apps/dashboard/show.vue +43 -0
  87. data/lib/vue/apps/tickets/components/assignments.vue +93 -0
  88. data/lib/vue/apps/tickets/components/form.vue +252 -0
  89. data/lib/vue/apps/tickets/components/internal-comments.vue +107 -0
  90. data/lib/vue/apps/tickets/components/sla-info.vue +115 -0
  91. data/lib/vue/apps/tickets/index.vue +171 -0
  92. data/lib/vue/apps/tickets/new.vue +92 -0
  93. data/lib/vue/apps/tickets/show.vue +177 -0
  94. data/lib/vue/stores/tickets.js +275 -0
  95. data/lib/vue/stores/translations.json +56 -0
  96. data/readme.md +71 -0
  97. metadata +155 -0
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,60 @@
1
+ module LesliHelp
2
+ class AccountsController < ApplicationController
3
+ before_action :set_account, only: %i[ show edit update destroy ]
4
+
5
+ # GET /accounts
6
+ def index
7
+ @accounts = Account.all
8
+ end
9
+
10
+ # GET /accounts/1
11
+ def show
12
+ end
13
+
14
+ # GET /accounts/new
15
+ def new
16
+ @account = Account.new
17
+ end
18
+
19
+ # GET /accounts/1/edit
20
+ def edit
21
+ end
22
+
23
+ # POST /accounts
24
+ def create
25
+ @account = Account.new(account_params)
26
+
27
+ if @account.save
28
+ redirect_to @account, notice: "Account was successfully created."
29
+ else
30
+ render :new, status: :unprocessable_entity
31
+ end
32
+ end
33
+
34
+ # PATCH/PUT /accounts/1
35
+ def update
36
+ if @account.update(account_params)
37
+ redirect_to @account, notice: "Account was successfully updated.", status: :see_other
38
+ else
39
+ render :edit, status: :unprocessable_entity
40
+ end
41
+ end
42
+
43
+ # DELETE /accounts/1
44
+ def destroy
45
+ @account.destroy
46
+ redirect_to accounts_url, notice: "Account was successfully destroyed.", status: :see_other
47
+ end
48
+
49
+ private
50
+ # Use callbacks to share common setup or constraints between actions.
51
+ def set_account
52
+ @account = Account.find(params[:id])
53
+ end
54
+
55
+ # Only allow a list of trusted parameters through.
56
+ def account_params
57
+ params.fetch(:account, {})
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,4 @@
1
+ module LesliHelp
2
+ class ApplicationController < Lesli::ApplicationLesliController
3
+ end
4
+ end
@@ -0,0 +1,92 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliHelp
34
+ class Dashboard::ComponentsController < ApplicationController
35
+ before_action :set_dashboard_component, only: %i[ show edit update destroy ]
36
+
37
+ # GET /dashboard/components
38
+ def index
39
+ @dashboard_components = Dashboard::Component.all
40
+ end
41
+
42
+ # GET /dashboard/components/1
43
+ def show
44
+ end
45
+
46
+ # GET /dashboard/components/new
47
+ def new
48
+ @dashboard_component = Dashboard::Component.new
49
+ end
50
+
51
+ # GET /dashboard/components/1/edit
52
+ def edit
53
+ end
54
+
55
+ # POST /dashboard/components
56
+ def create
57
+ @dashboard_component = Dashboard::Component.new(dashboard_component_params)
58
+
59
+ if @dashboard_component.save
60
+ redirect_to @dashboard_component, notice: "Component was successfully created."
61
+ else
62
+ render :new, status: :unprocessable_entity
63
+ end
64
+ end
65
+
66
+ # PATCH/PUT /dashboard/components/1
67
+ def update
68
+ if @dashboard_component.update(dashboard_component_params)
69
+ redirect_to @dashboard_component, notice: "Component was successfully updated.", status: :see_other
70
+ else
71
+ render :edit, status: :unprocessable_entity
72
+ end
73
+ end
74
+
75
+ # DELETE /dashboard/components/1
76
+ def destroy
77
+ @dashboard_component.destroy
78
+ redirect_to dashboard_components_url, notice: "Component was successfully destroyed.", status: :see_other
79
+ end
80
+
81
+ private
82
+ # Use callbacks to share common setup or constraints between actions.
83
+ def set_dashboard_component
84
+ @dashboard_component = Dashboard::Component.find(params[:id])
85
+ end
86
+
87
+ # Only allow a list of trusted parameters through.
88
+ def dashboard_component_params
89
+ params.fetch(:dashboard_component, {})
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,36 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliHelp
34
+ class DashboardsController < Lesli::Shared::DashboardsController
35
+ end
36
+ end
@@ -0,0 +1,171 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliHelp
34
+ class TicketsController < ApplicationController
35
+ before_action :set_ticket, only: [:show, :update, :destroy, :images]
36
+
37
+ def index
38
+ respond_to do |format|
39
+ format.html { }
40
+ format.json do
41
+ #respond_with_successful(TicketService.new(current_user, query).index)
42
+ respond_with_pagination(TicketService.new(current_user, query).index)
43
+ end
44
+ end
45
+ end
46
+
47
+ def show
48
+ respond_to do |format|
49
+ format.html { }
50
+ format.json do
51
+ respond_with_successful(@ticket.show)
52
+ end
53
+ end
54
+ end
55
+
56
+ def new
57
+ end
58
+
59
+ def edit
60
+ end
61
+
62
+ def create
63
+ ticket = TicketService.new(current_user, query).create(ticket_params)
64
+
65
+ if ticket.successful?
66
+ respond_with_successful(ticket.result)
67
+ else
68
+ respond_with_error(ticket.errors)
69
+ end
70
+ end
71
+
72
+ def update
73
+ return respond_with_not_found unless @ticket
74
+ return respond_with_unauthorized unless @ticket.is_editable_by?(current_user, bypass_status: true)
75
+
76
+ # When the ticket is closed, the only available field for update is the status
77
+ update_params = ticket_params
78
+ if ["completed_successfully", "completed_unsuccessfully"].include? @ticket.status&.status_type
79
+ update_params = completed_ticket_params
80
+ end
81
+
82
+ if @ticket.check_workflow_transitions(current_user, update_params)
83
+ ticket_update_response = TicketServices.update(current_user, @ticket, update_params)
84
+
85
+ @ticket = ticket_update_response.payload
86
+ if ticket_update_response.successful?
87
+ respond_with_successful(@ticket.show(current_user, @query))
88
+ else
89
+ respond_with_error(@ticket.errors.full_messages.to_sentence)
90
+ end
91
+ else
92
+ respond_with_error(@ticket.errors.full_messages.to_sentence)
93
+ end
94
+ end
95
+
96
+ def options
97
+ #respond_with_successful(Ticket.options(current_user, @query))
98
+ respond_with_successful({})
99
+ end
100
+
101
+
102
+ def destroy
103
+ return respond_with_not_found unless @ticket
104
+ return respond_with_unauthorized unless @ticket.is_editable_by?(current_user)
105
+
106
+ ticket_destroy_response = TicketServices.destroy(current_user, @ticket)
107
+
108
+ if ticket_destroy_response.successful?
109
+ respond_with_successful
110
+ else
111
+ respond_with_error(ticket_destroy_response.payload.errors.full_messages.to_sentence)
112
+ end
113
+ end
114
+
115
+ def images
116
+ return respond_with_not_found unless @ticket
117
+
118
+ images = @ticket.files.filter do |file|
119
+ file_name = ""
120
+ file_name = file.attachment_s3_identifier.downcase if file.attachment_s3_identifier
121
+ file_name = file.attachment_identifier.downcase if file.attachment_identifier
122
+
123
+ file_name.end_with?('png') || file_name.end_with?('jpg') || file_name.end_with?('jpeg')
124
+ end
125
+
126
+ images = images.map do |image|
127
+ {
128
+ id: image.id,
129
+ name: image.name,
130
+ src: "/help/tickets/#{@ticket.id}/files/#{image.id}",
131
+ href: "/help/tickets/#{@ticket.id}/files/#{image.id}?view=true"
132
+ }
133
+ end
134
+
135
+ respond_with_successful(images)
136
+ end
137
+
138
+ private
139
+
140
+ def set_ticket
141
+ ticket_id = params[:id] unless params[:id].blank?
142
+ ticket_id = params[:ticket_id] unless params[:ticket_id].blank?
143
+ @ticket = TicketService.new(current_user, query).find(ticket_id)
144
+ return respond_with_not_found unless @ticket.found?
145
+ end
146
+
147
+ def ticket_params
148
+ params.require(:ticket).permit(
149
+ # :cloud_help_catalog_ticket_types_id,
150
+ # :cloud_help_catalog_ticket_priorities_id,
151
+ # :cloud_help_catalog_ticket_categories_id,
152
+ # :cloud_help_catalog_ticket_workspaces_id,
153
+ # :cloud_help_workflow_statuses_id,
154
+ :subject,
155
+ :description,
156
+ :reference_url,
157
+ :tags,
158
+ :hours_worked,
159
+ :deadline,
160
+ :started_at,
161
+ #:finished_at
162
+ )
163
+ end
164
+
165
+ def completed_ticket_params
166
+ params.require(:ticket).permit(
167
+ :cloud_help_workflow_statuses_id
168
+ )
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,4 @@
1
+ module LesliHelp
2
+ module AccountsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliHelp
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliHelp
2
+ module DashboardsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliHelp
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module LesliHelp
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: "from@example.com"
4
+ layout "mailer"
5
+ end
6
+ end
@@ -0,0 +1,38 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliHelp
34
+ class Account < ApplicationRecord
35
+ belongs_to :account, class_name: "Lesli::Account"
36
+ has_many :tickets
37
+ end
38
+ end
@@ -0,0 +1,5 @@
1
+ module LesliHelp
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ module LesliHelp
2
+ class Dashboard::Component < ApplicationRecord
3
+
4
+ belongs_to :dashboard, inverse_of: :components
5
+
6
+ def self.component_ids
7
+ ["users", "active_roles"]
8
+ end
9
+ # components_ids: {
10
+ # list_new_tickets: "list_new_tickets",
11
+ # list_my_tickets: "list_my_tickets",
12
+ # list_unassigned_tickets: "list_unassigned_tickets",
13
+ # chart_tickets_by_type: "chart_tickets_by_type",
14
+ # chart_tickets_by_category: "chart_tickets_by_category",
15
+ # hours_worked: "hours_worked"
16
+ # }
17
+ end
18
+ end
@@ -0,0 +1,28 @@
1
+
2
+ module LesliHelp
3
+ class Dashboard < Lesli::Shared::Dashboard
4
+ self.table_name = "lesli_help_dashboards"
5
+ belongs_to :account
6
+
7
+ has_many :components, inverse_of: :dashboard, autosave: true, dependent: :destroy
8
+ accepts_nested_attributes_for :components, allow_destroy: true
9
+
10
+ def self.initialize_data(account)
11
+ =begin
12
+ self.create!(
13
+ account: account,
14
+ name: "Audit Default Dashboard",
15
+ default: true,
16
+ main: false,
17
+ components_attributes: [{
18
+ name: "Total users",
19
+ component_id: "users",
20
+ layout: 4,
21
+ query_configuration: {},
22
+ custom_configuration: {}
23
+ }]
24
+ )
25
+ =end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,39 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliHelp
34
+ class Ticket < Lesli::ApplicationLesliRecord
35
+ belongs_to :account
36
+ belongs_to :user, class_name: "Lesli::User"
37
+ belongs_to :creator, class_name: "Lesli::User"
38
+ end
39
+ end
@@ -0,0 +1,120 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliHelp
34
+ class TicketService < Lesli::ApplicationLesliService
35
+
36
+ def find ticket_id
37
+ super(current_user.account.help.tickets.find_by(id: ticket_id))
38
+ end
39
+
40
+ def index
41
+
42
+ return current_user.account.help.tickets.left_joins(
43
+ :user, :creator
44
+ ).select(
45
+ :id,
46
+ :subject,
47
+ :deadline,
48
+ :creator_id,
49
+ :user_id,
50
+ "CONCAT_WS(' ', lesli_users.first_name, lesli_users.last_name) as user_name",
51
+ "CONCAT_WS(' ', creators_lesli_help_tickets.first_name, creators_lesli_help_tickets.last_name) as creator_name",
52
+ "lesli_help_tickets.updated_at",
53
+ "lesli_help_tickets.created_at"
54
+ ).order(id: :desc)
55
+ .page(query[:pagination][:page])
56
+ .per(query[:pagination][:perPage])
57
+
58
+ current_user.account.help.tickets.left_joins(
59
+ :priority,
60
+ :type,
61
+ :workspace,
62
+ :category,
63
+ :status,
64
+ :assignments,
65
+ :assigned,
66
+ :user
67
+ ).select(
68
+ :id,
69
+ :subject,
70
+ :deadline,
71
+ :assigned_id,
72
+ :user_id,
73
+ "CONCAT_WS(' ', users.first_name, users.last_name) as assigned_name",
74
+ "CONCAT_WS(' ', users_cloud_help_tickets.first_name, users_cloud_help_tickets.last_name) as user_name",
75
+ "cloud_help_tickets.updated_at",
76
+ "cloud_help_tickets.created_at"
77
+ )
78
+ end
79
+
80
+ def create(ticket_params)
81
+
82
+ ticket = current_user.account.help.tickets.new(ticket_params)
83
+ #ticket.source = Catalog::TicketSource.cloud_help_source(current_user.account.help)
84
+ ticket.creator = current_user
85
+ ticket.user = current_user
86
+
87
+ unless ticket_params.dig(:started_at)
88
+ #ticket.started_at = LC::Date2.new(Time.current).date.get
89
+ end
90
+
91
+ if ticket.save
92
+ #Ticket.log_activity_create(current_user, ticket)
93
+ #Ticket::Subscriber.add_subscriber(ticket, current_user, "discussion_created", "email")
94
+ #Workflow::Action.execute_actions(current_user, ticket, {}, ticket.attributes)
95
+ self.resource = ticket
96
+ else
97
+ pp ticket.errors.full_messages
98
+ self.error(ticket.errors.full_messages.to_sentence)
99
+ end
100
+
101
+ self
102
+ end
103
+
104
+ def show()
105
+ return current_user.account.help.tickets.left_joins(
106
+ :user, :creator
107
+ ).select(
108
+ :id,
109
+ :subject,
110
+ :deadline,
111
+ :creator_id,
112
+ :user_id,
113
+ "CONCAT_WS(' ', lesli_users.first_name, lesli_users.last_name) as user_name",
114
+ "CONCAT_WS(' ', creators_lesli_help_tickets.first_name, creators_lesli_help_tickets.last_name) as creator_name",
115
+ "lesli_help_tickets.updated_at",
116
+ "lesli_help_tickets.created_at"
117
+ ).where("lesli_help_tickets.id = ?", self.resource.id).first
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Lesli help</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= stylesheet_link_tag "lesli_help/application", media: "all" %>
9
+ </head>
10
+ <body>
11
+
12
+ <%= yield %>
13
+
14
+ </body>
15
+ </html>
@@ -0,0 +1,2 @@
1
+ <div id="<%= dom_id account %>">
2
+ </div>