lesli_audit 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +5 -0
  3. data/app/assets/config/lesli_audit_manifest.js +38 -0
  4. data/app/assets/images/lesli_audit/audit-logo.svg +72 -0
  5. data/app/assets/javascripts/lesli_audit/application.js +3592 -0
  6. data/app/assets/stylesheets/lesli_audit/application.scss +35 -0
  7. data/app/assets/stylesheets/lesli_audit/dashboard.scss +0 -0
  8. data/app/controllers/lesli_audit/analytics_controller.rb +36 -0
  9. data/app/controllers/lesli_audit/application_controller.rb +4 -0
  10. data/app/controllers/lesli_audit/dashboards_controller.rb +59 -0
  11. data/app/helpers/lesli_audit/analytics_helper.rb +4 -0
  12. data/app/helpers/lesli_audit/application_helper.rb +4 -0
  13. data/app/helpers/lesli_audit/dashboards_helper.rb +4 -0
  14. data/app/jobs/lesli_audit/application_job.rb +4 -0
  15. data/app/mailers/lesli_audit/application_mailer.rb +6 -0
  16. data/app/models/lesli_audit/analytic.rb +4 -0
  17. data/app/models/lesli_audit/application_record.rb +5 -0
  18. data/app/models/lesli_audit/dashboard.rb +4 -0
  19. data/app/services/lesli_audit/account/activity_services.rb +69 -0
  20. data/app/services/lesli_audit/analytic_service.rb +151 -0
  21. data/app/services/lesli_audit/analytics/trend_services.rb +84 -0
  22. data/app/services/lesli_audit/analytics/visitor_service.rb +166 -0
  23. data/app/services/lesli_audit/request_services.rb +71 -0
  24. data/app/services/lesli_audit/users/activity_services.rb +61 -0
  25. data/app/services/lesli_audit/users/log_services.rb +62 -0
  26. data/app/services/lesli_audit/users/registration_services.rb +62 -0
  27. data/app/services/lesli_audit/users/role_services.rb +61 -0
  28. data/app/services/lesli_audit/users/working_hour_services.rb +78 -0
  29. data/app/views/lesli_audit/analytics/_analytic.html.erb +2 -0
  30. data/app/views/lesli_audit/analytics/_form.html.erb +17 -0
  31. data/app/views/lesli_audit/analytics/edit.html.erb +10 -0
  32. data/app/views/lesli_audit/analytics/index.html.erb +1 -0
  33. data/app/views/lesli_audit/analytics/new.html.erb +9 -0
  34. data/app/views/lesli_audit/analytics/show.html.erb +10 -0
  35. data/app/views/lesli_audit/dashboards/_dashboard.html.erb +2 -0
  36. data/app/views/lesli_audit/dashboards/_form.html.erb +17 -0
  37. data/app/views/lesli_audit/dashboards/edit.html.erb +10 -0
  38. data/app/views/lesli_audit/dashboards/index.html.erb +14 -0
  39. data/app/views/lesli_audit/dashboards/new.html.erb +9 -0
  40. data/app/views/lesli_audit/dashboards/show.html.erb +1 -0
  41. data/app/views/lesli_audit/partials/_engine-navigation.html.erb +39 -0
  42. data/config/routes.rb +45 -0
  43. data/db/migrate/v1.0/0803000110_create_lesli_audit_accounts.rb +42 -0
  44. data/db/migrate/v1.0/0803050110_create_lesli_audit_dashboards.rb +51 -0
  45. data/db/migrate/v1.0/0803050210_create_lesli_audit_dashboard_components.rb +53 -0
  46. data/lib/lesli_audit/engine.rb +18 -0
  47. data/lib/lesli_audit/version.rb +3 -0
  48. data/lib/lesli_audit.rb +6 -0
  49. data/lib/tasks/lesli_audit_tasks.rake +4 -0
  50. data/lib/vue/application.js +102 -0
  51. data/lib/vue/apps/accounts/activities.vue +48 -0
  52. data/lib/vue/apps/analytics/index.vue +18 -0
  53. data/lib/vue/apps/analytics/requests.vue +67 -0
  54. data/lib/vue/apps/analytics/trends.vue +149 -0
  55. data/lib/vue/apps/analytics/visitors.vue +91 -0
  56. data/lib/vue/apps/requests/index.vue +123 -0
  57. data/lib/vue/apps/security/passwords.vue +52 -0
  58. data/lib/vue/apps/security/sessions.vue +63 -0
  59. data/lib/vue/apps/users/activities.vue +49 -0
  60. data/lib/vue/apps/users/logs.vue +49 -0
  61. data/lib/vue/apps/users/registrations.vue +98 -0
  62. data/lib/vue/apps/users/roles.vue +70 -0
  63. data/lib/vue/apps/users/workingHours.vue +52 -0
  64. data/lib/vue/stores/accounts/activities.js +87 -0
  65. data/lib/vue/stores/analytics/visitors.js +130 -0
  66. data/lib/vue/stores/request.js +70 -0
  67. data/lib/vue/stores/security/password.js +75 -0
  68. data/lib/vue/stores/security/session.js +78 -0
  69. data/lib/vue/stores/users/activities.js +76 -0
  70. data/lib/vue/stores/users/logs.js +74 -0
  71. data/lib/vue/stores/users/registrations.js +61 -0
  72. data/lib/vue/stores/users/roles.js +52 -0
  73. data/lib/vue/stores/users/working_hours.js +92 -0
  74. data/license +674 -0
  75. data/readme.md +120 -0
  76. metadata +134 -0
@@ -0,0 +1,51 @@
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
+ class CreateLesliAuditDashboards < ActiveRecord::Migration[6.1]
34
+ def change
35
+ gem_path = Lesli::System.engine("Lesli", "dir")
36
+ table_base_structure = JSON.parse(File.read(File.join(gem_path, "db", "structure", "00000501_dashboards.json")))
37
+ create_table :lesli_audit_dashboards do |t|
38
+ table_base_structure.each do |column|
39
+ t.send(
40
+ column["type"].parameterize.underscore.to_sym,
41
+ column["name"].parameterize.underscore.to_sym
42
+ )
43
+ end
44
+ t.timestamps
45
+ end
46
+
47
+ add_reference(:lesli_audit_dashboards, :account, foreign_key: { to_table: :lesli_audit_accounts })
48
+ add_reference(:lesli_audit_dashboards, :user, foreign_key: { to_table: :lesli_users })
49
+ #add_reference(:lesli_audit_dashboards, :role, foreign_key: { to_table: :roles })
50
+ end
51
+ end
@@ -0,0 +1,53 @@
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
+ class CreateLesliAuditDashboardComponents < ActiveRecord::Migration[6.1]
34
+ def change
35
+ gem_path = Lesli::System.engine("Lesli", "dir")
36
+ table_base_structure = JSON.parse(File.read(File.join(gem_path, "db", "structure", "00000502_dashboard_components.json")))
37
+ create_table :lesli_audit_dashboard_components do |t|
38
+ table_base_structure.each do |column|
39
+ t.send(
40
+ column["type"].parameterize.underscore.to_sym,
41
+ column["name"].parameterize.underscore.to_sym
42
+ )
43
+ end
44
+ t.timestamps
45
+ end
46
+
47
+ add_reference(
48
+ :lesli_audit_dashboard_components, :dashboard,
49
+ foreign_key: { to_table: :lesli_audit_dashboards },
50
+ index: { name: "lesli_audit_dashboard_components_dashboards" }
51
+ )
52
+ end
53
+ end
@@ -0,0 +1,18 @@
1
+ module LesliAudit
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace LesliAudit
4
+
5
+ initializer :lesli_admin do |app|
6
+
7
+ # register assets manifest
8
+ config.assets.precompile += %w[lesli_audit_manifest.js]
9
+
10
+ # register engine migrations path
11
+ unless app.root.to_s.match root.to_s
12
+ config.paths["db/migrate"].expanded.each do |expanded_path|
13
+ app.config.paths["db/migrate"] << expanded_path
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module LesliAudit
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,6 @@
1
+ require "lesli_audit/version"
2
+ require "lesli_audit/engine"
3
+
4
+ module LesliAudit
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :lesli_audit do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,102 @@
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
+ import application from "Lesli/application"
35
+
36
+ import appAnalytics from "LesliAudit/apps/analytics/index.vue"
37
+
38
+ // ·
39
+ /*
40
+ import dashboard from "Lesli/shared/dashboards/apps/show.vue"
41
+ import appUsersRegistrations from "CloudAudit/apps/users/registrations.vue"
42
+ import appUsersWorkingHours from "CloudAudit/apps/users/workingHours.vue"
43
+ import appUsersActivities from "CloudAudit/apps/users/activities.vue"
44
+ import appUsersLogs from "CloudAudit/apps/users/logs.vue"
45
+ import appUsersRoles from "CloudAudit/apps/users/roles.vue"
46
+
47
+ import appAnalyticsVisitors from "CloudAudit/apps/analytics/visitors.vue"
48
+ import appAnalyticsTrends from "CloudAudit/apps/analytics/trends.vue"
49
+
50
+ import appAccountsActivities from "CloudAudit/apps/accounts/activities.vue"
51
+
52
+ import appSecuritySessions from "CloudAudit/apps/security/sessions.vue"
53
+ import appSecurityPasswords from "CloudAudit/apps/security/passwords.vue"
54
+
55
+ import appRequests from "CloudAudit/apps/requests/index.vue"
56
+ */
57
+
58
+
59
+ // ·
60
+ application("LesliAudit", [{
61
+ path: "/analytics",
62
+ component: appAnalytics,
63
+ props: { engine: "audit" }
64
+ }
65
+ /*{
66
+ path: "/",
67
+ component: dashboard,
68
+ props: { engine: "audit" }
69
+ }, {
70
+ path: "/users/working_hours",
71
+ component: appUsersWorkingHours,
72
+ }, {
73
+ path: "/users/activities",
74
+ component: appUsersActivities,
75
+ }, {
76
+ path: "/users/logs",
77
+ component: appUsersLogs,
78
+ }, {
79
+ path: "/users/registrations",
80
+ component: appUsersRegistrations,
81
+ }, {
82
+ path: "/users/roles",
83
+ component: appUsersRoles,
84
+ }, {
85
+ path: "/accounts/activities",
86
+ component: appAccountsActivities,
87
+ }, {
88
+ path: "/analytics/visitors",
89
+ component: appAnalyticsVisitors,
90
+ }, {
91
+ path: "/analytics/trends",
92
+ component: appAnalyticsTrends
93
+ }, {
94
+ path: "/requests",
95
+ component: appRequests
96
+ }, {
97
+ path: "/security/sessions",
98
+ component: appSecuritySessions
99
+ }, {
100
+ path: "/security/passwords",
101
+ component: appSecurityPasswords
102
+ }*/])
@@ -0,0 +1,48 @@
1
+ <script setup>
2
+ /*
3
+ Copyright (c) 2022, all rights reserved.
4
+
5
+ All the information provided by this platform is protected by international laws related to
6
+ industrial property, intellectual property, copyright and relative international laws.
7
+ All intellectual or industrial property rights of the code, texts, trade mark, design,
8
+ pictures and any other information belongs to the owner of this platform.
9
+
10
+ Without the written permission of the owner, any replication, modification,
11
+ transmission, publication is strictly forbidden.
12
+
13
+ For more information read the license file including with this software.
14
+
15
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
16
+ // ·
17
+ */
18
+
19
+
20
+ // · import vue tools
21
+ import { ref, reactive, onMounted, watch, computed } from "vue"
22
+
23
+
24
+ // · import stores
25
+ import { useAccountsActivities } from "CloudAudit/stores/accounts/activities"
26
+
27
+
28
+ // · implement stores
29
+ const storeAccountsActivities = useAccountsActivities()
30
+
31
+
32
+ // · initializing
33
+ onMounted(() => {
34
+ storeAccountsActivities.fetchIfEmpty()
35
+ })
36
+
37
+ </script>
38
+ <template>
39
+ <section class="application-component">
40
+ <lesli-header title="Account activities"></lesli-header>
41
+ <lesli-toolbar @reload="storeAccountsActivities.fetch()" @search="storeAccountsActivities.search"></lesli-toolbar>
42
+ <lesli-table
43
+ :columns="storeAccountsActivities.columns"
44
+ :records="storeAccountsActivities.records">
45
+ </lesli-table>
46
+ </section>
47
+ </template>
48
+
@@ -0,0 +1,18 @@
1
+ <script setup>
2
+
3
+ // · import vue tools
4
+ import { ref, reactive, onMounted, watch, computed } from "vue"
5
+
6
+
7
+ import visitors from "./visitors.vue";
8
+ import requests from "./requests.vue";
9
+ //import trends from "./trends.vue";
10
+
11
+ </script>
12
+ <template>
13
+ <lesli-application-container>
14
+ <lesli-header title="Analytics"></lesli-header>
15
+ <visitors></visitors>
16
+ <requests></requests>
17
+ </lesli-application-container>
18
+ </template>
@@ -0,0 +1,67 @@
1
+ <script setup>
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
+ */
32
+
33
+
34
+ // · import vue tools
35
+ import { } from "vue"
36
+
37
+
38
+ // · import stores
39
+ import { useAnalytics } from "LesliAudit/stores/analytics/visitors"
40
+
41
+
42
+ // · implement stores
43
+ const storeAnalytics = useAnalytics()
44
+
45
+ </script>
46
+ <template>
47
+ <div class="columns mt-3">
48
+ <div class="column">
49
+ <lesli-table
50
+ :columns="storeAnalytics.users.columns"
51
+ :records="storeAnalytics.users.records">
52
+ </lesli-table>
53
+ </div>
54
+ <div class="column">
55
+ <lesli-table
56
+ :columns="storeAnalytics.devices.columns"
57
+ :records="storeAnalytics.devices.records">
58
+ </lesli-table>
59
+ </div>
60
+ <div class="column">
61
+ <lesli-table
62
+ :columns="storeAnalytics.controllers.columns"
63
+ :records="storeAnalytics.controllers.records">
64
+ </lesli-table>
65
+ </div>
66
+ </div>
67
+ </template>
@@ -0,0 +1,149 @@
1
+ <script setup>
2
+ /*
3
+ Copyright (c) 2022, all rights reserved.
4
+
5
+ All the information provided by this platform is protected by international laws related to
6
+ industrial property, intellectual property, copyright and relative international laws.
7
+ All intellectual or industrial property rights of the code, texts, trade mark, design,
8
+ pictures and any other information belongs to the owner of this platform.
9
+
10
+ Without the written permission of the owner, any replication, modification,
11
+ transmission, publication is strictly forbidden.
12
+
13
+ For more information read the license file including with this software.
14
+
15
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
16
+ // ·
17
+ */
18
+
19
+
20
+ // · import vue tools
21
+ import { ref, reactive, onMounted, watch, computed } from "vue"
22
+
23
+
24
+ // . import Lesli components
25
+ import chartBar from "Lesli/components/charts/bar.vue"
26
+ import chartLine from "Lesli/components/charts/line.vue"
27
+
28
+
29
+ // · import lesli stores
30
+ import { useAnalytics } from "CloudAudit/stores/analytics/visitors"
31
+
32
+
33
+ // · implement stores
34
+ const storeAnalytics = useAnalytics()
35
+
36
+
37
+ // · define variables
38
+ var daySeries = ref([]);
39
+ var dayLabels = ref([]);
40
+ var timeSeries = ref([]);
41
+ var timeLabels = ref([]);
42
+ var days = {"Monday":0,"Tuesday":0,"Wednesday":0,"Thursday":0,"Friday":0,"Saturday":0,"Sunday":0}
43
+ var hours = {};
44
+ var finalDate = ref("");
45
+ var startDate = ref("");
46
+
47
+
48
+ // · initializing
49
+ onMounted(() => {
50
+ storeAnalytics.time('day',startDate.value,finalDate.value)
51
+ storeAnalytics.time('hour',startDate.value,finalDate.value)
52
+ })
53
+
54
+
55
+ // ·
56
+ watch(() => storeAnalytics.trends.recordsDays, () => {
57
+ days = {"Monday":0,"Tuesday":0,"Wednesday":0,"Thursday":0,"Friday":0,"Saturday":0,"Sunday":0}
58
+
59
+ if(storeAnalytics.trends.recordsDays){
60
+ storeAnalytics.trends.recordsDays.forEach((record) => {
61
+ days[record.day] += record.count
62
+ })
63
+ } else {
64
+ storeAnalytics.msg.info("There is no information for this date range")
65
+ }
66
+
67
+ dayLabels.value = Object.keys(days)
68
+ daySeries.value = [{
69
+ name: "Requests",
70
+ data: Object.values(days)
71
+ }]
72
+
73
+ daySeries.value = Object.values(days)
74
+
75
+ })
76
+
77
+
78
+ // ·
79
+ watch(() => storeAnalytics.trends.recordsHours, () => {
80
+ hours = {}
81
+ if(storeAnalytics.trends.recordsHours){
82
+ storeAnalytics.trends.recordsHours.forEach((record) => {
83
+ hours [record.hour+":00"] = record.count
84
+ })
85
+ }
86
+
87
+ timeLabels.value = Object.keys(hours)
88
+ timeSeries.value = [{
89
+ name: "Requests",
90
+ data: Object.values(hours)
91
+ }]
92
+ })
93
+
94
+
95
+ // Update date range when date picker change
96
+ function updateDates(){
97
+ if (startDate.value != "" && finalDate.value != "") {
98
+
99
+ if (startDate.value >= finalDate.value){
100
+ storeAnalytics.msg.danger("Select valid range for date")
101
+ } else {
102
+ storeAnalytics.time('day',startDate.value,finalDate.value)
103
+ storeAnalytics.time('hour',startDate.value,finalDate.value)
104
+
105
+ }
106
+ }
107
+ }
108
+
109
+ </script>
110
+ <template>
111
+ <section class="application-component">
112
+ <lesli-header title="Trends">
113
+ </lesli-header>
114
+
115
+ <!--
116
+ <div class="grid-container">
117
+ <div class="grid-item">
118
+ <label>From</label>
119
+ <br/>
120
+ <input class="input is-info" type="date" v-model="startDate" @change="updateDates">
121
+ </div>
122
+ <div class="grid-item">
123
+ <label>To</label>
124
+ <br/>
125
+ <input class="input is-info" type="date" v-model="finalDate" @change="updateDates" />
126
+ </div>
127
+ </div>
128
+ -->
129
+ <div class="card mb-5">
130
+ <div class="card-content">
131
+ <chartBar
132
+ title="Requests by day of the week"
133
+ :series="daySeries"
134
+ :labels="dayLabels">
135
+ </chartBar>
136
+ </div>
137
+ </div>
138
+
139
+ <div class="card">
140
+ <div class="card-content">
141
+ <chartLine
142
+ title="Requests by time of the day"
143
+ :series="timeSeries"
144
+ :labels="timeLabels">
145
+ </chartLine>
146
+ </div>
147
+ </div>
148
+ </section>
149
+ </template>
@@ -0,0 +1,91 @@
1
+ <script setup>
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
+ */
32
+
33
+
34
+ // · import vue tools
35
+ import { ref, reactive, onMounted, watch, computed } from "vue"
36
+
37
+
38
+ // · import Lesli components
39
+ import { lesliChartLine } from "lesli-vue/components"
40
+
41
+
42
+ // · import stores
43
+ import { useAnalytics } from "LesliAudit/stores/analytics/visitors"
44
+
45
+
46
+ // · implement stores
47
+ const storeAnalytics = useAnalytics()
48
+
49
+
50
+ // · define variables
51
+ var series = ref([]);
52
+ var labels = ref([]);
53
+
54
+
55
+ // · initializing
56
+ onMounted(() => {
57
+ storeAnalytics.fetchVisits()
58
+ setTimeout(() => storeAnalytics.fetchUsers(), 500)
59
+ setTimeout(() => storeAnalytics.fetchDevices(), 1000)
60
+ setTimeout(() => storeAnalytics.fetchControllers(), 1500)
61
+ })
62
+
63
+
64
+ // ·
65
+ function reload() {
66
+ storeAnalytics.fetch()
67
+ }
68
+
69
+
70
+ // ·
71
+ watch(() => storeAnalytics.visitors.records, () => {
72
+ labels.value = storeAnalytics.visitors.records.map(visit => visit.date)
73
+ series.value = [{
74
+ name: "Requests",
75
+ data: storeAnalytics.visitors.records.map(visit => visit.requests)
76
+ }, {
77
+ name: "Resources",
78
+ data: storeAnalytics.visitors.records.map(visit => visit.resources)
79
+ }]
80
+ })
81
+
82
+ </script>
83
+ <template>
84
+ <lesli-application-component>
85
+ <lesli-chart-line
86
+ :title="'Visitors'"
87
+ :series="series"
88
+ :labels="labels">
89
+ </lesli-chart-line>
90
+ </lesli-application-component>
91
+ </template>