lesli_admin 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/lesli_admin_manifest.js +1 -0
  3. data/app/assets/images/lesli_admin/admin-logo.svg +1 -0
  4. data/app/assets/javascripts/lesli_admin/application.js +2635 -244
  5. data/app/assets/javascripts/lesli_admin/translations.js +2291 -0
  6. data/app/assets/stylesheets/lesli_admin/application.scss +32 -0
  7. data/app/assets/stylesheets/lesli_admin/users.scss +67 -0
  8. data/app/controllers/lesli_admin/profiles_controller.rb +56 -0
  9. data/app/controllers/lesli_admin/users_controller.rb +5 -196
  10. data/app/helpers/lesli_admin/profiles_helper.rb +4 -0
  11. data/app/views/lesli_admin/profiles/edit.html.erb +10 -0
  12. data/app/views/lesli_admin/profiles/index.html.erb +14 -0
  13. data/app/views/lesli_admin/profiles/new.html.erb +9 -0
  14. data/app/views/lesli_admin/profiles/show.html.erb +1 -0
  15. data/app/views/lesli_admin/users/show.html.erb +1 -10
  16. data/config/locales/translations.en.yml +6 -0
  17. data/config/locales/translations.es.yml +6 -0
  18. data/config/routes.rb +4 -7
  19. data/lib/lesli_admin/engine.rb +31 -0
  20. data/lib/lesli_admin/version.rb +2 -1
  21. data/lib/vue/application.js +15 -98
  22. data/lib/vue/apps/account/show.vue +2 -2
  23. data/lib/vue/apps/dashboard/show.vue +6 -8
  24. data/lib/vue/apps/profile/show.vue +22 -15
  25. data/lib/vue/apps/users/components/information-card.vue +4 -7
  26. data/lib/vue/apps/users/components/information-form.vue +4 -7
  27. data/lib/vue/apps/users/index.vue +10 -4
  28. data/lib/vue/apps/users/show.vue +25 -10
  29. data/lib/vue/stores/translations.json +20 -0
  30. data/lib/vue/stores/users.js +1 -1
  31. data/readme.md +61 -18
  32. metadata +16 -14
  33. data/app/assets/stylesheets/lesli_admin/application.css +0 -15
  34. data/app/models/lesli_admin/dashboard.rb +0 -4
  35. data/app/models/lesli_admin/user.rb +0 -4
  36. data/app/services/lesli_admin/user_service.rb +0 -300
  37. data/lib/vue/stores/account.js +0 -113
  38. data/lib/vue/stores/descriptor.js +0 -116
  39. data/lib/vue/stores/descriptors.js +0 -167
  40. data/lib/vue/stores/integration.js +0 -103
  41. data/lib/vue/stores/role.js +0 -243
  42. data/lib/vue/stores/systemController.js +0 -67
  43. data/lib/vue/stores/user.js +0 -319
  44. /data/lib/vue/stores/{accountSettings.js → account_settings.js} +0 -0
@@ -0,0 +1,32 @@
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 SaaS Development Framework.
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
+ body.lesli-admin-users { @import "users"; }
@@ -0,0 +1,67 @@
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 SaaS Development Framework.
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
+ .user-information-card {
35
+ figure {
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ border-radius: 50%;
40
+ background-color: lesli-css-color(silver, 100);
41
+ border: 2px solid var(--lesli-color-primary, lesli-css-color(blue));
42
+ }
43
+ .alternative-avatar {
44
+ font-weight: 200;
45
+ font-size: 3rem;
46
+ color: var(--lesli-color-primary, lesli-css-color(blue));
47
+ }
48
+ }
49
+
50
+ form.information {
51
+ max-width: 80%;
52
+ }
53
+
54
+ // · roles management cards
55
+ .roles-types {
56
+ display: grid;
57
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
58
+ grid-auto-rows: minmax(198px, auto);
59
+ gap: 20px;
60
+
61
+ &-item {
62
+ width: 100%;
63
+ height: 135px;
64
+ border-radius: 8px;
65
+ margin: 5px;
66
+ }
67
+ }
@@ -0,0 +1,56 @@
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
+ module LesliAdmin
33
+ class ProfilesController < ApplicationController
34
+ before_action :set_profile, only: %i[ show ]
35
+
36
+ # GET /profiles/1
37
+ def show
38
+ respond_to do |format|
39
+ format.html { }
40
+ format.json { respond_with_successful(@profile.show) }
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ # Use callbacks to share common setup or constraints between actions.
47
+ def set_profile
48
+ @profile = Lesli::UserService.new(current_user, query).find(current_user.id)
49
+ end
50
+
51
+ # Only allow a list of trusted parameters through.
52
+ def profile_params
53
+ params.fetch(:profile, {})
54
+ end
55
+ end
56
+ end
@@ -32,213 +32,22 @@ Building a better future, one line of code at a time.
32
32
 
33
33
  module LesliAdmin
34
34
  class UsersController < ApplicationController
35
- before_action :set_user, only: [
36
- :show,
37
- :update,
38
- :destroy,
39
- :requestpassword,
40
- :passwordreset,
41
- :revokeaccess,
42
- :logout
43
- ]
44
-
45
- # GET /users/list
46
- def list
47
- respond_to do |format|
48
- format.json { respond_with_successful(UserService.new("current_user").list(query, params)) }
49
- end
50
- end
35
+ #before_action :set_user, only: [:show]
51
36
 
52
37
  # GET /users
53
38
  def index
54
- respond_to do |format|
55
- format.html { }
56
- format.json {
57
- return respond_with_pagination(UserService.new("current_user").index(query, params))
58
- }
59
- end
60
39
  end
61
40
 
62
41
  def show
63
- respond_to do |format|
64
- format.html {}
65
- format.json {
66
- return respond_with_not_found unless @user.found?
67
- return respond_with_successful(@user.show)
68
- }
69
- end
70
42
  end
71
43
 
72
- def new; end
73
-
74
- def create
75
-
76
- user = UserService.new(current_user).create(user_params)
77
- if user.successful?
78
- respond_with_successful(user.result)
79
- else
80
- respond_with_error("Error creating user", user.errors)
81
- end
82
-
83
- end
84
-
85
- def update
86
-
87
- # validate that user exists
88
- return respond_with_not_found unless @user.found?
89
-
90
- @user.update(user_params)
91
-
92
- if @user.successful?
93
- respond_with_successful(@user.result)
94
- else
95
- respond_with_error(@user.errors)
96
- end
97
-
98
- end
99
-
100
- def destroy
101
- return respond_with_not_found unless @user
102
-
103
- # get the user found in the UserServices
104
- user = @user.result
105
-
106
- if user.delete
107
- current_user.logs.create({ title: "deleted_user", description: "by_user_id: #{ current_user.email }" })
108
- respond_with_successful()
109
- else
110
- respond_with_error(user.errors.full_messages.to_sentence)
111
- end
112
- end
113
-
114
- # Force the user to update his password
115
- def requestpassword
116
- if @user.request_password
117
- respond_with_successful
118
- else
119
- respond_with_error
120
- end
121
- end
122
-
123
- # Reset password (generate random)
124
- def passwordreset
125
-
126
- pass = @user.password_reset
127
-
128
- if pass
129
- respond_with_successful(pass)
130
- else
131
- respond_with_error
132
- end
133
- end
134
-
135
- # this method is going to close all the open user sessions
136
- def logout
137
- if @user.logout
138
- respond_with_successful
139
- else
140
- respond_with_error
141
- end
44
+ def new
142
45
  end
143
-
144
- # Remove all user access
145
- def revokeaccess
146
- if @user.revoke_access
147
- respond_with_successful
148
- else
149
- respond_with_error
150
- end
151
- end
152
-
153
- def become
154
-
155
- # always should be disabled
156
- if Rails.configuration.lesli.dig(:security, :enable_becoming) != true
157
- return respond_with_unauthorized
158
- end
159
-
160
- # Allow only sysadmin to become as user
161
- return respond_with_unauthorized if current_user.email != Rails.application.config.lesli.dig(:account, :user, :email) # sysadmin user
162
-
163
- # Search for desire user
164
- becoming_user = User.find(params[:id])
165
-
166
- # Return an error if user does not exist
167
- return respond_with_error I18n.t("core.shared.messages_warning_user_not_found") if becoming_user.blank?
168
-
169
- # Extrictly save a log when becoming
170
- current_user.activities.create!({
171
- users_id: becoming_user.id,
172
- owner_id: current_user.id,
173
- description: "#{current_user.full_name} -> #{becoming_user.full_name}",
174
- category: "action_become"
175
- })
176
-
177
- # Sign in as the becoming user
178
- sign_in(:user, becoming_user)
179
-
180
- # Create a new session for the becoming user
181
- becoming_session = becoming_user.sessions.create({
182
- :user_agent => get_user_agent,
183
- :user_remote => request.remote_ip,
184
- :session_source => "become_session",
185
- :last_used_at => LC::Date.now,
186
- :expiration_at => 60.minutes.from_now
187
- })
188
-
189
- # assign the session of the becomer user to the becoming user
190
- session[:user_session_id] = becoming_session[:id]
191
-
192
- # Response successful
193
- respond_with_successful([current_user, becoming_user])
194
-
195
- end
196
-
197
- def options
198
- respond_with_successful({
199
- #regions: current_user.account.locations.where(level: "region"),
200
- salutations: User::Detail.salutations.map {|k, v| {value: k, text: v}},
201
- locales: Rails.application.config.lesli.dig(:configuration, :locales_available),
202
- mfa_methods: Rails.application.config.lesli.dig(:configuration, :mfa_methods)
203
- })
46
+
47
+ def edit
204
48
  end
205
-
49
+
206
50
  private
207
-
208
- # @return [void]
209
- # @description Sets the requested user based on the current_users's account
210
- # @example
211
- # # Executing this method from a controller action:
212
- # set_user
213
- # puts @user
214
- # # This will either display nil or an instance of Account::User
215
- def set_user
216
- @user = UserService.new(current_user).find(params[:id])
217
- end
218
-
219
- def user_params
220
- params.require(:user).permit(
221
- :active,
222
- :email,
223
- :alias,
224
- :roles_id,
225
- :first_name,
226
- :last_name,
227
- :telephone,
228
- detail_attributes: [
229
- :title,
230
- :salutation,
231
- :address,
232
- :work_city,
233
- :work_region,
234
- :work_address
235
- ]
236
- )
237
- end
238
51
 
239
- # Only allow a list of trusted parameters through.
240
- def user_params
241
- params.fetch(:user, {})
242
- end
243
52
  end
244
53
  end
@@ -0,0 +1,4 @@
1
+ module LesliAdmin
2
+ module ProfilesHelper
3
+ end
4
+ end
@@ -0,0 +1,10 @@
1
+ <h1>Editing profile</h1>
2
+
3
+ <%= render "form", profile: @profile %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Show this profile", @profile %> |
9
+ <%= link_to "Back to profiles", profiles_path %>
10
+ </div>
@@ -0,0 +1,14 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <h1>Profiles</h1>
4
+
5
+ <div id="profiles">
6
+ <% @profiles.each do |profile| %>
7
+ <%= render profile %>
8
+ <p>
9
+ <%= link_to "Show this profile", profile %>
10
+ </p>
11
+ <% end %>
12
+ </div>
13
+
14
+ <%= link_to "New profile", new_profile_path %>
@@ -0,0 +1,9 @@
1
+ <h1>New profile</h1>
2
+
3
+ <%= render "form", profile: @profile %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Back to profiles", profiles_path %>
9
+ </div>
@@ -0,0 +1 @@
1
+ <router-view></router-view>
@@ -1,10 +1 @@
1
- <p style="color: green"><%= notice %></p>
2
-
3
- <%= render @user %>
4
-
5
- <div>
6
- <%= link_to "Edit this user", edit_user_path(@user) %> |
7
- <%= link_to "Back to users", users_path %>
8
-
9
- <%= button_to "Destroy this user", @user, method: :delete %>
10
- </div>
1
+ <router-view></router-view>
@@ -0,0 +1,6 @@
1
+ ---
2
+ :en:
3
+ users:
4
+ title_users: Users
5
+ dashboards:
6
+ button_my: My button in my dashboard
@@ -0,0 +1,6 @@
1
+ ---
2
+ :es:
3
+ users:
4
+ title_users: Usuarios
5
+ dashboards:
6
+ button_my: Mi boton en mi dashboard
data/config/routes.rb CHANGED
@@ -1,13 +1,10 @@
1
1
  LesliAdmin::Engine.routes.draw do
2
+
2
3
  root to: "dashboards#show"
3
4
  resource :dashboard, only: [:show]
4
5
 
5
- resource :account, only: [:show, :update]
6
- resources :users, only: [:index, :show, :new, :update, :create, :destroy] do
6
+ resource :profile
7
7
 
8
- # extensions to the users methods
9
- collection do
10
- get :list
11
- end
12
- end
8
+ resource :account, only: [:show]
9
+ resources :users, only: [:index, :show, :new]
13
10
  end
@@ -1,3 +1,34 @@
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
1
32
  module LesliAdmin
2
33
  class Engine < ::Rails::Engine
3
34
  isolate_namespace LesliAdmin
@@ -1,3 +1,4 @@
1
1
  module LesliAdmin
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
+ BUILD = "1696737766"
3
4
  end
@@ -30,21 +30,28 @@ Building a better future, one line of code at a time.
30
30
  */
31
31
 
32
32
 
33
- // ·
33
+ // · Import Lesli builders
34
34
  import application from "Lesli/application"
35
+ import translation from "Lesli/translation"
35
36
 
36
37
 
37
- // ·
38
+ // · Import engine translations
39
+ import translations from "LesliAdmin/stores/translations.json"
40
+
41
+
42
+ // · Import engine applications
38
43
  import applicationDashboardShow from "LesliAdmin/apps/dashboard/show.vue"
39
44
  import applicationAccountShow from "LesliAdmin/apps/account/show.vue"
40
-
41
- //import applicationUsersProfile from "LesliApp/administration/apps/profile/show.vue"
42
45
  import applicationUsersIndex from "LesliAdmin/apps/users/index.vue"
43
- ///import applicationUsersShow from "LesliApp/administration/apps/users/show.vue"
44
- //import applicationUsersNew from "LesliAdmin/apps/users/new.vue"
46
+ import applicationUsersShow from "LesliAdmin/apps/users/show.vue"
47
+ import applicationProfile from "LesliAdmin/apps/profile/show.vue"
45
48
 
46
49
 
47
- // ·
50
+ // · Buil Lesli translations
51
+ translation(translations)
52
+
53
+
54
+ // · Build a new Lesli application
48
55
  application("LesliAdmin", [{
49
56
  path: "/dashboard",
50
57
  component: applicationDashboardShow
@@ -54,100 +61,10 @@ application("LesliAdmin", [{
54
61
  }, {
55
62
  path: "/users",
56
63
  component: applicationUsersIndex
57
- }/*, {
58
- path: "/users/new",
59
- component: applicationUsersNew
60
- }*/])
61
-
62
- /*
63
- // ·
64
- import applicationAccountDashboard from "CloudAdmin/apps/accounts/dashboard.vue"
65
-
66
-
67
-
68
- import applicationDescriptorsPrivileges from "LesliApp/administration/apps/descriptors/privileges.vue"
69
- import applicationDescriptorsIndex from "LesliApp/administration/apps/descriptors/index.vue"
70
- import applicationDescriptorsEdit from "LesliApp/administration/apps/descriptors/edit.vue"
71
- import applicationDescriptorsShow from "LesliApp/administration/apps/descriptors/show.vue"
72
- import applicationDescriptorsNew from "LesliApp/administration/apps/descriptors/new.vue"
73
-
74
- import applicationRolesIndex from "LesliApp/administration/apps/roles/index.vue"
75
- import applicationRolesShow from "LesliApp/administration/apps/roles/show.vue"
76
- import applicationRolesEdit from "LesliApp/administration/apps/roles/edit.vue"
77
- import applicationRolesNew from "LesliApp/administration/apps/roles/new.vue"
78
-
79
- import applicationIntegrationsIndex from "LesliApp/administration/apps/integrations/index.vue"
80
- import applicationIntegrationsNew from "LesliApp/administration/apps/integrations/new.vue"
81
- import applicationSecurity from "LesliApp/administration/apps/security/index.vue"
82
- import applicationDatetime from "LesliApp/administration/apps/date_time/index.vue"
83
- import applicationBranding from "LesliApp/administration/apps/branding/index.vue"
84
- import applicationTheme from "LesliApp/administration/apps/theme/index.vue"
85
- import applicationAccountShow from "LesliApp/administration/apps/accounts/show.vue"
86
-
87
-
88
- // ·
89
- application("Lesli", [{
90
- path: "/",
91
- component: applicationAccountDashboard
92
- }, {
93
- path: "/account",
94
- component: applicationAccountShow
95
64
  }, {
96
65
  path: "/users/:id",
97
66
  component: applicationUsersShow
98
67
  }, {
99
- path: "/users/new",
100
- component: applicationUsersNew
101
- },{
102
68
  path: "/profile",
103
- component: applicationUsersProfile
104
- }, {
105
- path: "/descriptors",
106
- component: applicationDescriptorsIndex
107
- }, {
108
- path: "/descriptors/:id/edit",
109
- component: applicationDescriptorsEdit
110
- }, {
111
- path: "/descriptors/:id",
112
- component: applicationDescriptorsShow
113
- }, {
114
- path: "/descriptors/:id/privileges",
115
- component: applicationDescriptorsPrivileges
116
- }, {
117
- path: "/descriptors/new",
118
- component: applicationDescriptorsNew
119
- }, {
120
- path: "/roles",
121
- component: applicationRolesIndex
122
- }, {
123
- path: "/roles/new",
124
- component: applicationRolesNew
125
- }, {
126
- path: "/roles/:id",
127
- component: applicationRolesShow
128
- }, {
129
- path: "/roles/:id/edit",
130
- component: applicationRolesEdit
131
- }, {
132
- path: "/account/integrations",
133
- component: applicationIntegrationsIndex
134
- }, {
135
- path: "/account/integrations/new",
136
- component: applicationIntegrationsNew
137
- }, {
138
- path: "/account/settings/security",
139
- component: applicationSecurity
140
- }, {
141
- path: "/account/settings/date_time",
142
- component: applicationDatetime
143
- }, {
144
- path: "/account/settings/branding",
145
- component: applicationBranding
146
- }, {
147
- path: "/account/settings/theme",
148
- component: applicationTheme
149
- }, {
150
- path: "/account/settings/theme",
151
- component: applicationTheme
69
+ component: applicationProfile
152
70
  }])
153
- */
@@ -69,7 +69,7 @@ onMounted(() => {
69
69
 
70
70
  </script>
71
71
  <template>
72
- <lesli-content>
72
+ <lesli-application-container>
73
73
  <lesli-header title="Account information">
74
74
  </lesli-header>
75
75
  <lesli-tabs v-model="tab">
@@ -77,7 +77,7 @@ onMounted(() => {
77
77
  <form-information></form-information>
78
78
  </lesli-tab-item>
79
79
  </lesli-tabs>
80
- </lesli-content>
80
+ </lesli-application-container>
81
81
  <!--
82
82
  <lesli-tab-item title="Address" icon="location_on">
83
83
  <address-form></address-form>