lesli_admin 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +5 -0
  3. data/app/assets/config/lesli_admin_manifest.js +38 -0
  4. data/app/assets/javascripts/lesli_admin/application.js +3713 -0
  5. data/app/assets/stylesheets/lesli_admin/application.css +15 -0
  6. data/app/controllers/lesli_admin/accounts_controller.rb +125 -0
  7. data/app/controllers/lesli_admin/application_controller.rb +4 -0
  8. data/app/controllers/lesli_admin/dashboards_controller.rb +60 -0
  9. data/app/controllers/lesli_admin/users_controller.rb +244 -0
  10. data/app/helpers/lesli_admin/application_helper.rb +4 -0
  11. data/app/helpers/lesli_admin/dashboards_helper.rb +4 -0
  12. data/app/jobs/lesli_admin/application_job.rb +4 -0
  13. data/app/mailers/lesli_admin/application_mailer.rb +6 -0
  14. data/app/models/lesli_admin/account.rb +66 -0
  15. data/app/models/lesli_admin/application_record.rb +5 -0
  16. data/app/models/lesli_admin/dashboard.rb +4 -0
  17. data/app/models/lesli_admin/user.rb +4 -0
  18. data/app/services/lesli_admin/user_service.rb +300 -0
  19. data/app/views/layouts/lesli_admin/application.html.erb +15 -0
  20. data/app/views/lesli_admin/accounts/_account.html.erb +2 -0
  21. data/app/views/lesli_admin/accounts/_form.html.erb +17 -0
  22. data/app/views/lesli_admin/accounts/edit.html.erb +10 -0
  23. data/app/views/lesli_admin/accounts/index.html.erb +34 -0
  24. data/app/views/lesli_admin/accounts/new.html.erb +9 -0
  25. data/app/views/lesli_admin/accounts/show.html.erb +34 -0
  26. data/app/views/lesli_admin/dashboards/_dashboard.html.erb +2 -0
  27. data/app/views/lesli_admin/dashboards/_form.html.erb +17 -0
  28. data/app/views/lesli_admin/dashboards/edit.html.erb +10 -0
  29. data/app/views/lesli_admin/dashboards/index.html.erb +14 -0
  30. data/app/views/lesli_admin/dashboards/new.html.erb +9 -0
  31. data/app/views/lesli_admin/dashboards/show.html.erb +1 -0
  32. data/app/views/lesli_admin/partials/_engine-navigation.html.erb +52 -0
  33. data/app/views/lesli_admin/users/edit.html.erb +10 -0
  34. data/app/views/lesli_admin/users/index.html.erb +34 -0
  35. data/app/views/lesli_admin/users/new.html.erb +34 -0
  36. data/app/views/lesli_admin/users/show.html.erb +10 -0
  37. data/config/routes.rb +13 -0
  38. data/lib/lesli_admin/engine.rb +18 -0
  39. data/lib/lesli_admin/version.rb +3 -0
  40. data/lib/lesli_admin.rb +6 -0
  41. data/lib/tasks/lesli_admin_tasks.rake +4 -0
  42. data/lib/vue/application.js +153 -0
  43. data/lib/vue/apps/account/components/address-form.vue +134 -0
  44. data/lib/vue/apps/account/components/contact-form.vue +162 -0
  45. data/lib/vue/apps/account/components/form-information.vue +107 -0
  46. data/lib/vue/apps/account/show.vue +89 -0
  47. data/lib/vue/apps/dashboard/show.vue +33 -0
  48. data/lib/vue/apps/profile/components/change-email.vue +38 -0
  49. data/lib/vue/apps/profile/components/subscriptions.vue +94 -0
  50. data/lib/vue/apps/profile/show.vue +141 -0
  51. data/lib/vue/apps/users/components/information-card.vue +119 -0
  52. data/lib/vue/apps/users/components/information-form.vue +180 -0
  53. data/lib/vue/apps/users/components/integrations-information.vue +61 -0
  54. data/lib/vue/apps/users/components/management-roles.vue +109 -0
  55. data/lib/vue/apps/users/components/management-security.vue +113 -0
  56. data/lib/vue/apps/users/components/management-sessions.vue +106 -0
  57. data/lib/vue/apps/users/components/management-settings.vue +94 -0
  58. data/lib/vue/apps/users/index.vue +201 -0
  59. data/lib/vue/apps/users/new.vue +181 -0
  60. data/lib/vue/apps/users/show.vue +101 -0
  61. data/lib/vue/stores/account.js +113 -0
  62. data/lib/vue/stores/accountSettings.js +342 -0
  63. data/lib/vue/stores/descriptor.js +116 -0
  64. data/lib/vue/stores/descriptors.js +167 -0
  65. data/lib/vue/stores/integration.js +103 -0
  66. data/lib/vue/stores/role.js +243 -0
  67. data/lib/vue/stores/roles.js +89 -0
  68. data/lib/vue/stores/systemController.js +67 -0
  69. data/lib/vue/stores/user.js +319 -0
  70. data/lib/vue/stores/users.js +150 -0
  71. data/readme.md +28 -0
  72. metadata +130 -0
@@ -0,0 +1,319 @@
1
+ /*
2
+ Lesli
3
+
4
+ Copyright (c) 2023, Lesli Technologies, S. A.
5
+
6
+ This program is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program. If not, see http://www.gnu.org/licenses/.
18
+
19
+ Lesli · Ruby on Rails Development Platform.
20
+
21
+ Made with ♥ by https://www.lesli.tech
22
+ Building a better future, one line of code at a time.
23
+
24
+ @contact hello@lesli.tech
25
+ @website https://www.lesli.tech
26
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
27
+
28
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
29
+ // ·
30
+ */
31
+
32
+
33
+ // ·
34
+ import { defineStore } from "pinia"
35
+
36
+
37
+ // ·
38
+ export const useUser = defineStore("lesli.user", {
39
+ state: () => {
40
+ return {
41
+ options: {
42
+ regions: [],
43
+ locales: [],
44
+ salutations: [],
45
+ mfa_methods: []
46
+ },
47
+ user: {
48
+ roles_id: null,
49
+ email: null,
50
+ alias: null,
51
+ first_name: null,
52
+ last_name: null,
53
+ telephone: null,
54
+ detail_attributes: {
55
+ salutation: null,
56
+ title: null,
57
+ }
58
+ },
59
+ roles: [],
60
+ sessions: {
61
+ pagination: {},
62
+ records: []
63
+ },
64
+ options: {
65
+ salutations: [],
66
+ locales: []
67
+ }
68
+ }
69
+ },
70
+ getters: {
71
+ initials() {
72
+ let initials = ""
73
+ if (this.user?.first_name) initials += this.user?.first_name[0];
74
+ if (this.user?.last_name) initials += this.user?.last_name[0];
75
+ return initials.toUpperCase()
76
+ }
77
+ },
78
+ actions: {
79
+
80
+ getOptions() {
81
+ this.http.get(this.url.lesli("users/options")).then(result => {
82
+ this.options = result
83
+ })
84
+ },
85
+
86
+ getUser(id=null) {
87
+
88
+ // get the profile by default
89
+ let url = this.url.lesli("profile")
90
+
91
+ // get an specifick user if id is provided
92
+ if (id) { url = this.url.lesli("users/:id", id) }
93
+
94
+ this.http.get(url).then(result => {
95
+ this.user = result
96
+ this.user.password = ""
97
+ this.user.password_confirmation = ""
98
+
99
+ this.language = result.locale ? result.locale.value : this.language
100
+
101
+ // Backend should return the list of roles ordered by object level permission
102
+ this.role_names = result.roles[0].name
103
+
104
+ }).catch(error => {
105
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
106
+ }).finally(() => {
107
+ this.loading = false
108
+ })
109
+ },
110
+
111
+ putUser() {
112
+ this.http.put(this.url.lesli("users/:id", this.user.id), {
113
+ user: this.user
114
+ }).then(result => {
115
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
116
+ }).catch(error => {
117
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
118
+ })
119
+ },
120
+
121
+ deleteUser() {
122
+ this.dialog.confirmation({
123
+ title: "Delete user",
124
+ text: "Are you sure you want to delete user?",
125
+ confirmText: "Yes",
126
+ cancelText: "No"
127
+ })
128
+ .then(({ isConfirmed }) => {
129
+ if (isConfirmed) {
130
+ this.http.delete(this.url.lesli("/users/:id", this.user.id)).then(result => {
131
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
132
+ //this.url.go("/administration/users")
133
+ }).catch(error => {
134
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
135
+ })
136
+ }
137
+ })
138
+ },
139
+
140
+ getRoles() {
141
+ this.http.get(this.url.lesli("users/:id/roles", this.user.id)).then(result => {
142
+ this.roles = result
143
+ }).catch(error => {
144
+ console.log(error)
145
+ })
146
+ },
147
+
148
+ postRole(role) {
149
+ this.http.post(this.url.lesli('users/:id/roles', this.user.id), {
150
+ user_role: {
151
+ id: role.id
152
+ }
153
+ }).then(result => {
154
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
155
+ }).catch(error => {
156
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
157
+ })
158
+ },
159
+
160
+ deleteRole(role) {
161
+ this.http.delete(this.url.lesli('users/:user_id/roles/:role_id', {
162
+ user_id: this.user.id,
163
+ role_id: role.id
164
+ })).then(result => {
165
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
166
+ }).catch(error => {
167
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
168
+ })
169
+ },
170
+
171
+ doRequestPassword() {
172
+ this.http.post(this.url.lesli("users/:id/requestpassword", this.user.id)).then(result => {
173
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
174
+ }).catch(error => {
175
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
176
+ })
177
+ },
178
+
179
+ doPasswordReset() {
180
+ this.http.post(this.url.lesli("users/:id/passwordreset", this.user.id)).then(result => {
181
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
182
+ }).catch(error => {
183
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
184
+ })
185
+ },
186
+
187
+ doLogout() {
188
+ this.http.post(this.url.lesli("users/:id/logout", this.user.id)).then(result => {
189
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
190
+ }).catch(error => {
191
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
192
+ })
193
+ },
194
+
195
+ doRevokeAccess() {
196
+ this.http.post(this.url.lesli("users/:id/revokeaccess", this.user.id)).then(result => {
197
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
198
+ }).catch(error => {
199
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
200
+ })
201
+ },
202
+
203
+ fetchSessions() {
204
+ if (!this.sessions.length > 0) {
205
+ this.getSessions()
206
+ }
207
+ },
208
+
209
+ getSessions() {
210
+ this.http.get(this.url.lesli("users/:id/sessions", this.user.id )).then(result => {
211
+ this.sessions.pagination = result.pagination
212
+ this.sessions.records = result.records
213
+ }).catch(error => {
214
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
215
+ }).finally(() => {
216
+ this.loading = false
217
+ })
218
+ },
219
+
220
+ deleteSession(user_session_id){
221
+ this.dialog.confirmation({
222
+ title: "Close session",
223
+ text: 'Are you sure you want to close this session',
224
+ confirmText: "Yes",
225
+ cancelText: "No"
226
+ })
227
+ .then(({ isConfirmed }) => {
228
+ if (isConfirmed) {
229
+ this.http.delete(this.url.lesli("users/:id/sessions/:session_id", {
230
+ id: this.user.id,
231
+ session_id: user_session_id
232
+ })).then(result => {
233
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
234
+ }).catch(error => {
235
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
236
+ })
237
+ this.fetchSessions()
238
+ }
239
+ })
240
+ },
241
+
242
+ postLanguage() {
243
+ this.http.post(this.url.lesli('users/:id/settings', this.user.id), {
244
+ user_setting: {
245
+ name: 'locale',
246
+ value: this.user.locale.value
247
+ }
248
+ }).then(result => {
249
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
250
+ // TODO: Only if current_user changed his own language
251
+ // reload the page so the user can work with the new language
252
+ // setTimeout(() => window.location.reload(), 1000)
253
+ }).catch(error => {
254
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
255
+ })
256
+ },
257
+
258
+ getOptions() {
259
+ this.http.get(this.url.lesli("users/options")).then(result => {
260
+ this.options.salutations = result.salutations
261
+
262
+ this.options.locales = Object.keys(result.locales).map(key => {
263
+ return {label: result.locales[key], value: key}
264
+ })
265
+ }).catch(error => {
266
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
267
+ })
268
+ },
269
+ }
270
+ })
271
+
272
+
273
+
274
+
275
+ /*
276
+
277
+
278
+
279
+ updatePassword() {
280
+ this.http.put("/", {
281
+ user: {
282
+ password: this.user.password,
283
+ password_confirmation: this.user.password_confirmation
284
+ }
285
+ }).then(result => {
286
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
287
+ this.user.password = ""
288
+ this.user.password_confirmation = ""
289
+ }).catch(error => {
290
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
291
+ })
292
+ },
293
+
294
+ // This action is used to change the user status active or inactive
295
+ putUserStatus(){
296
+ this.dialog.confirmation({
297
+ title: "Change status",
298
+ text: "Are you sure you want to change the status of this user?",
299
+ confirmText: "Yes",
300
+ cancelText: "No"
301
+ })
302
+ .then(({ isConfirmed }) => {
303
+ if (isConfirmed) {
304
+ this.http.patch(this.url.lesli('users/:id', this.user.id), {
305
+ user: {
306
+ active: this.user.active
307
+ }
308
+ }).then(result => {
309
+ this.msg.success(I18n.t("core.users.messages_success_operation"))
310
+ }) .catch(error => {
311
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
312
+ })
313
+ } else {
314
+ this.user.active = !this.user.active
315
+ }
316
+ })
317
+ },
318
+
319
+ */
@@ -0,0 +1,150 @@
1
+ /*
2
+ Lesli
3
+
4
+ Copyright (c) 2023, Lesli Technologies, S. A.
5
+
6
+ This program is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program. If not, see http://www.gnu.org/licenses/.
18
+
19
+ Lesli · Ruby on Rails Development Platform.
20
+
21
+ Made with ♥ by https://www.lesli.tech
22
+ Building a better future, one line of code at a time.
23
+
24
+ @contact hello@lesli.tech
25
+ @website https://www.lesli.tech
26
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
27
+
28
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
29
+ // ·
30
+ */
31
+
32
+
33
+ // ·
34
+ import { defineStore } from "pinia"
35
+
36
+ // · translations
37
+ const translations = {
38
+ core: {
39
+ roles: I18n.t("core.roles"),
40
+ users: I18n.t("core.users"),
41
+ shared: I18n.t("core.shared")
42
+ }
43
+ }
44
+
45
+ // ·
46
+ export const useUsers = defineStore("administration.users", {
47
+ state: () => {
48
+ return {
49
+ loading: false,
50
+ search: "",
51
+ list: [],
52
+ order: {
53
+ column: "id",
54
+ direction: "desc"
55
+ },
56
+ index: {
57
+ pagination: {},
58
+ records: []
59
+ },
60
+ filters :{
61
+ per_page: 15,
62
+ role: null,
63
+ status: 'active'
64
+ },
65
+ roles_options: [],
66
+
67
+ user: {
68
+ roles_id: null,
69
+ email: null,
70
+ first_name: null,
71
+ last_name: null,
72
+ telephone: null,
73
+ }
74
+ }
75
+ },
76
+ actions: {
77
+
78
+ search(search_string) {
79
+ this.index.pagination.page = 1
80
+ this.search_string = search_string
81
+ this.loading = true
82
+ this.getUsers()
83
+ },
84
+
85
+ paginateIndex(page) {
86
+ this.index.pagination.page = page
87
+ this.getUsers()
88
+ },
89
+
90
+ sortIndex(column, direction) {
91
+ this.order.column = column
92
+ this.order.direction = direction
93
+ this.getUsers()
94
+ },
95
+
96
+ fetchUsers() {
97
+
98
+ if (!this.index.pagination?.results > 0) {
99
+ this.loading = true
100
+ this.getUsers()
101
+ }
102
+
103
+ },
104
+
105
+ getUsers() {
106
+
107
+ const query_filters = {}
108
+
109
+ //Format filters to send them in the query string
110
+ for (const [key, value] of Object.entries(this.filters)) {
111
+ //query_filters[key] = [value]
112
+ }
113
+
114
+ this.http.get(
115
+ this.url
116
+ .admin("users")
117
+ .search(this.search_string)
118
+ .paginate(this.index.pagination.page, this.filters.per_page)
119
+ .filter(query_filters)
120
+ .order(this.order.column, this.order.direction)
121
+ ).then(result => {
122
+ this.index = result
123
+ this.search_string=""
124
+ }).catch(error => {
125
+ this.msg.danger(I18n.t("core.shared.messages_danger_internal_error"))
126
+ }).finally(() => {
127
+ this.loading = false
128
+ })
129
+ },
130
+
131
+ postUsers() {
132
+ return this.http.post(this.url.admin("users"), {
133
+ user: this.user
134
+ })
135
+ },
136
+
137
+ fetchList() {
138
+ this.loading = true
139
+ return this.http.get(this.url.admin("users/list")).then(response => {
140
+ //this.records = response
141
+ this.list = response
142
+ }).catch(error => {
143
+
144
+ }).finally(() => {
145
+ this.loading = false
146
+ })
147
+ }
148
+
149
+ }
150
+ })
data/readme.md ADDED
@@ -0,0 +1,28 @@
1
+ # LesliAdmin
2
+ Short description and motivation.
3
+
4
+ ## Usage
5
+ How to use my plugin.
6
+
7
+ ## Installation
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem "lesli_admin"
12
+ ```
13
+
14
+ And then execute:
15
+ ```bash
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it yourself as:
20
+ ```bash
21
+ $ gem install lesli_admin
22
+ ```
23
+
24
+ ## Contributing
25
+ Contribution directions go here.
26
+
27
+ ## License
28
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
metadata ADDED
@@ -0,0 +1,130 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lesli_admin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - The Lesli Development Team
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-09-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 7.0.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 7.0.6
27
+ description: Administration area for the Lesli Framework
28
+ email:
29
+ - hello@lesli.tech
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - Rakefile
35
+ - app/assets/config/lesli_admin_manifest.js
36
+ - app/assets/javascripts/lesli_admin/application.js
37
+ - app/assets/stylesheets/lesli_admin/application.css
38
+ - app/controllers/lesli_admin/accounts_controller.rb
39
+ - app/controllers/lesli_admin/application_controller.rb
40
+ - app/controllers/lesli_admin/dashboards_controller.rb
41
+ - app/controllers/lesli_admin/users_controller.rb
42
+ - app/helpers/lesli_admin/application_helper.rb
43
+ - app/helpers/lesli_admin/dashboards_helper.rb
44
+ - app/jobs/lesli_admin/application_job.rb
45
+ - app/mailers/lesli_admin/application_mailer.rb
46
+ - app/models/lesli_admin/account.rb
47
+ - app/models/lesli_admin/application_record.rb
48
+ - app/models/lesli_admin/dashboard.rb
49
+ - app/models/lesli_admin/user.rb
50
+ - app/services/lesli_admin/user_service.rb
51
+ - app/views/layouts/lesli_admin/application.html.erb
52
+ - app/views/lesli_admin/accounts/_account.html.erb
53
+ - app/views/lesli_admin/accounts/_form.html.erb
54
+ - app/views/lesli_admin/accounts/edit.html.erb
55
+ - app/views/lesli_admin/accounts/index.html.erb
56
+ - app/views/lesli_admin/accounts/new.html.erb
57
+ - app/views/lesli_admin/accounts/show.html.erb
58
+ - app/views/lesli_admin/dashboards/_dashboard.html.erb
59
+ - app/views/lesli_admin/dashboards/_form.html.erb
60
+ - app/views/lesli_admin/dashboards/edit.html.erb
61
+ - app/views/lesli_admin/dashboards/index.html.erb
62
+ - app/views/lesli_admin/dashboards/new.html.erb
63
+ - app/views/lesli_admin/dashboards/show.html.erb
64
+ - app/views/lesli_admin/partials/_engine-navigation.html.erb
65
+ - app/views/lesli_admin/users/edit.html.erb
66
+ - app/views/lesli_admin/users/index.html.erb
67
+ - app/views/lesli_admin/users/new.html.erb
68
+ - app/views/lesli_admin/users/show.html.erb
69
+ - config/routes.rb
70
+ - lib/lesli_admin.rb
71
+ - lib/lesli_admin/engine.rb
72
+ - lib/lesli_admin/version.rb
73
+ - lib/tasks/lesli_admin_tasks.rake
74
+ - lib/vue/application.js
75
+ - lib/vue/apps/account/components/address-form.vue
76
+ - lib/vue/apps/account/components/contact-form.vue
77
+ - lib/vue/apps/account/components/form-information.vue
78
+ - lib/vue/apps/account/show.vue
79
+ - lib/vue/apps/dashboard/show.vue
80
+ - lib/vue/apps/profile/components/change-email.vue
81
+ - lib/vue/apps/profile/components/subscriptions.vue
82
+ - lib/vue/apps/profile/show.vue
83
+ - lib/vue/apps/users/components/information-card.vue
84
+ - lib/vue/apps/users/components/information-form.vue
85
+ - lib/vue/apps/users/components/integrations-information.vue
86
+ - lib/vue/apps/users/components/management-roles.vue
87
+ - lib/vue/apps/users/components/management-security.vue
88
+ - lib/vue/apps/users/components/management-sessions.vue
89
+ - lib/vue/apps/users/components/management-settings.vue
90
+ - lib/vue/apps/users/index.vue
91
+ - lib/vue/apps/users/new.vue
92
+ - lib/vue/apps/users/show.vue
93
+ - lib/vue/stores/account.js
94
+ - lib/vue/stores/accountSettings.js
95
+ - lib/vue/stores/descriptor.js
96
+ - lib/vue/stores/descriptors.js
97
+ - lib/vue/stores/integration.js
98
+ - lib/vue/stores/role.js
99
+ - lib/vue/stores/roles.js
100
+ - lib/vue/stores/systemController.js
101
+ - lib/vue/stores/user.js
102
+ - lib/vue/stores/users.js
103
+ - readme.md
104
+ homepage: https://www.lesli.dev/
105
+ licenses:
106
+ - GPL-3.0
107
+ metadata:
108
+ homepage_uri: https://www.lesli.dev/
109
+ changelog_uri: https://github.com/LesliTech/LesliAdmin
110
+ source_code_uri: https://github.com/LesliTech/LesliAdmin
111
+ post_install_message:
112
+ rdoc_options: []
113
+ require_paths:
114
+ - lib
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ requirements: []
126
+ rubygems_version: 3.3.7
127
+ signing_key:
128
+ specification_version: 4
129
+ summary: Administration area for the Lesli Framework
130
+ test_files: []