lesli_admin 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Rakefile +5 -0
- data/app/assets/config/lesli_admin_manifest.js +38 -0
- data/app/assets/javascripts/lesli_admin/application.js +3713 -0
- data/app/assets/stylesheets/lesli_admin/application.css +15 -0
- data/app/controllers/lesli_admin/accounts_controller.rb +125 -0
- data/app/controllers/lesli_admin/application_controller.rb +4 -0
- data/app/controllers/lesli_admin/dashboards_controller.rb +60 -0
- data/app/controllers/lesli_admin/users_controller.rb +244 -0
- data/app/helpers/lesli_admin/application_helper.rb +4 -0
- data/app/helpers/lesli_admin/dashboards_helper.rb +4 -0
- data/app/jobs/lesli_admin/application_job.rb +4 -0
- data/app/mailers/lesli_admin/application_mailer.rb +6 -0
- data/app/models/lesli_admin/account.rb +66 -0
- data/app/models/lesli_admin/application_record.rb +5 -0
- data/app/models/lesli_admin/dashboard.rb +4 -0
- data/app/models/lesli_admin/user.rb +4 -0
- data/app/services/lesli_admin/user_service.rb +300 -0
- data/app/views/layouts/lesli_admin/application.html.erb +15 -0
- data/app/views/lesli_admin/accounts/_account.html.erb +2 -0
- data/app/views/lesli_admin/accounts/_form.html.erb +17 -0
- data/app/views/lesli_admin/accounts/edit.html.erb +10 -0
- data/app/views/lesli_admin/accounts/index.html.erb +34 -0
- data/app/views/lesli_admin/accounts/new.html.erb +9 -0
- data/app/views/lesli_admin/accounts/show.html.erb +34 -0
- data/app/views/lesli_admin/dashboards/_dashboard.html.erb +2 -0
- data/app/views/lesli_admin/dashboards/_form.html.erb +17 -0
- data/app/views/lesli_admin/dashboards/edit.html.erb +10 -0
- data/app/views/lesli_admin/dashboards/index.html.erb +14 -0
- data/app/views/lesli_admin/dashboards/new.html.erb +9 -0
- data/app/views/lesli_admin/dashboards/show.html.erb +1 -0
- data/app/views/lesli_admin/partials/_engine-navigation.html.erb +52 -0
- data/app/views/lesli_admin/users/edit.html.erb +10 -0
- data/app/views/lesli_admin/users/index.html.erb +34 -0
- data/app/views/lesli_admin/users/new.html.erb +34 -0
- data/app/views/lesli_admin/users/show.html.erb +10 -0
- data/config/routes.rb +13 -0
- data/lib/lesli_admin/engine.rb +18 -0
- data/lib/lesli_admin/version.rb +3 -0
- data/lib/lesli_admin.rb +6 -0
- data/lib/tasks/lesli_admin_tasks.rake +4 -0
- data/lib/vue/application.js +153 -0
- data/lib/vue/apps/account/components/address-form.vue +134 -0
- data/lib/vue/apps/account/components/contact-form.vue +162 -0
- data/lib/vue/apps/account/components/form-information.vue +107 -0
- data/lib/vue/apps/account/show.vue +89 -0
- data/lib/vue/apps/dashboard/show.vue +33 -0
- data/lib/vue/apps/profile/components/change-email.vue +38 -0
- data/lib/vue/apps/profile/components/subscriptions.vue +94 -0
- data/lib/vue/apps/profile/show.vue +141 -0
- data/lib/vue/apps/users/components/information-card.vue +119 -0
- data/lib/vue/apps/users/components/information-form.vue +180 -0
- data/lib/vue/apps/users/components/integrations-information.vue +61 -0
- data/lib/vue/apps/users/components/management-roles.vue +109 -0
- data/lib/vue/apps/users/components/management-security.vue +113 -0
- data/lib/vue/apps/users/components/management-sessions.vue +106 -0
- data/lib/vue/apps/users/components/management-settings.vue +94 -0
- data/lib/vue/apps/users/index.vue +201 -0
- data/lib/vue/apps/users/new.vue +181 -0
- data/lib/vue/apps/users/show.vue +101 -0
- data/lib/vue/stores/account.js +113 -0
- data/lib/vue/stores/accountSettings.js +342 -0
- data/lib/vue/stores/descriptor.js +116 -0
- data/lib/vue/stores/descriptors.js +167 -0
- data/lib/vue/stores/integration.js +103 -0
- data/lib/vue/stores/role.js +243 -0
- data/lib/vue/stores/roles.js +89 -0
- data/lib/vue/stores/systemController.js +67 -0
- data/lib/vue/stores/user.js +319 -0
- data/lib/vue/stores/users.js +150 -0
- data/readme.md +28 -0
- 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: []
|