jobs_dashboard 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/gem-push.yml +34 -0
  3. data/.gitignore +12 -0
  4. data/.rspec +3 -0
  5. data/CHANGELOG.md +60 -0
  6. data/Gemfile +10 -0
  7. data/Gemfile.lock +129 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +133 -0
  10. data/Rakefile +8 -0
  11. data/app/assets/stylesheets/jobs_dashboard/application.scss +214 -0
  12. data/app/assets/stylesheets/jobs_dashboard/modules/buttons.sass +15 -0
  13. data/app/assets/stylesheets/jobs_dashboard/modules/card.sass +22 -0
  14. data/app/assets/stylesheets/jobs_dashboard/modules/description.sass +17 -0
  15. data/app/assets/stylesheets/jobs_dashboard/modules/grid.sass +17 -0
  16. data/app/assets/stylesheets/jobs_dashboard/modules/inputs.sass +31 -0
  17. data/app/assets/stylesheets/jobs_dashboard/modules/item-list.sass +10 -0
  18. data/app/assets/stylesheets/jobs_dashboard/modules/labels.sass +12 -0
  19. data/app/assets/stylesheets/jobs_dashboard/modules/statistics.sass +15 -0
  20. data/app/assets/stylesheets/jobs_dashboard/modules/table.sass +38 -0
  21. data/app/assets/stylesheets/jobs_dashboard/pages/jobs_logs/show.sass +36 -0
  22. data/app/assets/stylesheets/jobs_dashboard/reset.scss +135 -0
  23. data/app/assets/stylesheets/jobs_dashboard/variables.sass +6 -0
  24. data/app/controllers/jobs_dashboard/application_controller.rb +20 -0
  25. data/app/controllers/jobs_dashboard/dashboard_controller.rb +12 -0
  26. data/app/controllers/jobs_dashboard/job_logs_controller.rb +17 -0
  27. data/app/helpers/jobs_dashboard/application_helper.rb +31 -0
  28. data/app/models/jobs_dashboard/application_record.rb +5 -0
  29. data/app/models/jobs_dashboard/job_log.rb +32 -0
  30. data/app/views/jobs_dashboard/dashboard/_job_row.slim +8 -0
  31. data/app/views/jobs_dashboard/dashboard/index.slim +40 -0
  32. data/app/views/jobs_dashboard/job_logs/_stats.html.erb +0 -0
  33. data/app/views/jobs_dashboard/job_logs/index.slim +84 -0
  34. data/app/views/jobs_dashboard/job_logs/show.slim +89 -0
  35. data/app/views/kaminari/jobs_dashboard/_first_page.html.erb +11 -0
  36. data/app/views/kaminari/jobs_dashboard/_gap.html.erb +8 -0
  37. data/app/views/kaminari/jobs_dashboard/_last_page.html.erb +11 -0
  38. data/app/views/kaminari/jobs_dashboard/_next_page.html.erb +11 -0
  39. data/app/views/kaminari/jobs_dashboard/_page.html.erb +12 -0
  40. data/app/views/kaminari/jobs_dashboard/_paginator.html.erb +25 -0
  41. data/app/views/kaminari/jobs_dashboard/_prev_page.html.erb +11 -0
  42. data/app/views/layouts/jobs_dashboard/application.html.erb +15 -0
  43. data/app/views/shared/_logo.slim +4 -0
  44. data/app/views/shared/_navigation.slim +12 -0
  45. data/bin/console +15 -0
  46. data/bin/setup +8 -0
  47. data/config/initializers/ransack.rb +11 -0
  48. data/config/locales/default.fr.yml +219 -0
  49. data/config/locales/jobs_dashboard.en.yml +33 -0
  50. data/config/locales/jobs_dashboard.fr.yml +37 -0
  51. data/config/routes.rb +5 -0
  52. data/jobs_dashboard.gemspec +38 -0
  53. data/lib/generators/active_record/job_log_migration_generator.rb +24 -0
  54. data/lib/generators/active_record/templates/migration.rb +20 -0
  55. data/lib/jobs_dashboard/client_middleware.rb +56 -0
  56. data/lib/jobs_dashboard/engine.rb +18 -0
  57. data/lib/jobs_dashboard/server_middleware.rb +62 -0
  58. data/lib/jobs_dashboard/storage.rb +54 -0
  59. data/lib/jobs_dashboard/version.rb +5 -0
  60. data/lib/jobs_dashboard/worker.rb +25 -0
  61. data/lib/jobs_dashboard.rb +12 -0
  62. metadata +161 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 25c8d99bcb3a7e63265c395622e2f8fb9e6b0f046c5f318fa93586b3671871c0
4
+ data.tar.gz: 1b8a7ffa2afd19d6653e6a0b0e0c771b8c3ebb1bb7f93a5ac27a081563359cb1
5
+ SHA512:
6
+ metadata.gz: 05b26dd1dc1db903ab5b0742500b8247e19674f115b36e936b84efea73bdb9966121049fa99c63ea03b5b73f6dd5a64e555c6234d8135247cad065cde297f764
7
+ data.tar.gz: fe57891700e92baa02a191abc88afec92c5b69cf0e8190bf88e6ee919709c3010ed2f6842b93966a2c677f15df7370396fc97aee1943ffeb1f5e036f45795996
@@ -0,0 +1,34 @@
1
+ name: Ruby Gem
2
+
3
+ on:
4
+ push:
5
+ branches: [ "master" ]
6
+
7
+ jobs:
8
+ build:
9
+ name: Build + Publish
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+ packages: write
14
+
15
+ steps:
16
+ - uses: actions/checkout@v3
17
+ - name: Set up Ruby 2.6
18
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
19
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
20
+ # uses: ruby/setup-ruby@v1
21
+ uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0
22
+ with:
23
+ ruby-version: 3.1.1
24
+
25
+ - name: Publish to RubyGems
26
+ run: |
27
+ mkdir -p $HOME/.gem
28
+ touch $HOME/.gem/credentials
29
+ chmod 0600 $HOME/.gem/credentials
30
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
31
+ gem build *.gemspec
32
+ gem push *.gem
33
+ env:
34
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ .DS_STORE
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/CHANGELOG.md ADDED
@@ -0,0 +1,60 @@
1
+ ## [0.3.3] - 2023-11-07
2
+ - Fix crash when there is data without item_type / queue
3
+
4
+ ## [0.3.2] - 2023-10-26
5
+ - Fix display when metadata is nil
6
+
7
+ ## [0.3.1] - 2023-10-26
8
+ - Redesign of job_log#show
9
+
10
+ ## [0.3.0] - 2023-10-20
11
+
12
+ - Added logs and metadata. Create a migration to add logs:
13
+ ```
14
+ class AddLogsAndMetadataToJobsDashboardJobLogs < ActiveRecord::Migration[7.0]
15
+ def change
16
+ add_column :jobs_dashboard_job_logs, :logs, :text, limit: 4294967295
17
+ add_column :jobs_dashboard_job_logs, :metadata, :text, limit: 4294967295
18
+ end
19
+ end
20
+ ```
21
+ ## [0.2.2] - 2023-10-19
22
+
23
+ - Added log of error message. Create a migration to add logging of error message:
24
+ ```
25
+ class AddErrorMessageToJobsDashboardJobLogs < ActiveRecord::Migration[7.0]
26
+ def change
27
+ add_column :jobs_dashboard_job_logs, :error_message, :text, limit: 4294967295
28
+ end
29
+ end
30
+ ```
31
+ ## [0.2.1] - 2023-10-19
32
+
33
+ - Raise if basic auth params are not defined
34
+
35
+ ## [0.1.7] - 2022-01-28
36
+ - Improve dashboard performances
37
+
38
+ ## [0.1.5] - 2021-11-18
39
+
40
+ - Increase limit of args text field.
41
+
42
+ If you are migrating from < 0.1.5 to 0.1.5 you have to create a migration to update text fields:
43
+ ```
44
+ def change
45
+ change_column :jobs_dashboard_job_logs, :args, :text, limit: 4294967295
46
+ change_column :jobs_dashboard_job_logs, :backtrace, :text, limit: 4294967295
47
+ end
48
+ ```
49
+ ## [0.1.2] - 2021-11-02
50
+
51
+ - Add queue information
52
+ - Improve job arguments display
53
+
54
+ ## [0.1.1] - 2021-10-29
55
+
56
+ - Fix logging of backtrace
57
+
58
+ ## [0.1.0] - 2021-10-07
59
+
60
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in jobs_dashboard.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+
10
+ gem "rspec", "~> 3.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,129 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ jobs_dashboard (0.3.4)
5
+ kaminari
6
+ ransack
7
+ sidekiq (>= 6.0)
8
+ slim-rails
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ actionpack (7.0.8)
14
+ actionview (= 7.0.8)
15
+ activesupport (= 7.0.8)
16
+ rack (~> 2.0, >= 2.2.4)
17
+ rack-test (>= 0.6.3)
18
+ rails-dom-testing (~> 2.0)
19
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
20
+ actionview (7.0.8)
21
+ activesupport (= 7.0.8)
22
+ builder (~> 3.1)
23
+ erubi (~> 1.4)
24
+ rails-dom-testing (~> 2.0)
25
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
26
+ activemodel (7.0.8)
27
+ activesupport (= 7.0.8)
28
+ activerecord (7.0.8)
29
+ activemodel (= 7.0.8)
30
+ activesupport (= 7.0.8)
31
+ activesupport (7.0.8)
32
+ concurrent-ruby (~> 1.0, >= 1.0.2)
33
+ i18n (>= 1.6, < 2)
34
+ minitest (>= 5.1)
35
+ tzinfo (~> 2.0)
36
+ builder (3.2.4)
37
+ concurrent-ruby (1.2.2)
38
+ connection_pool (2.4.1)
39
+ crass (1.0.6)
40
+ diff-lcs (1.4.4)
41
+ erubi (1.12.0)
42
+ i18n (1.14.1)
43
+ concurrent-ruby (~> 1.0)
44
+ kaminari (1.2.2)
45
+ activesupport (>= 4.1.0)
46
+ kaminari-actionview (= 1.2.2)
47
+ kaminari-activerecord (= 1.2.2)
48
+ kaminari-core (= 1.2.2)
49
+ kaminari-actionview (1.2.2)
50
+ actionview
51
+ kaminari-core (= 1.2.2)
52
+ kaminari-activerecord (1.2.2)
53
+ activerecord
54
+ kaminari-core (= 1.2.2)
55
+ kaminari-core (1.2.2)
56
+ loofah (2.21.4)
57
+ crass (~> 1.0.2)
58
+ nokogiri (>= 1.12.0)
59
+ method_source (1.0.0)
60
+ minitest (5.20.0)
61
+ nokogiri (1.15.4-arm64-darwin)
62
+ racc (~> 1.4)
63
+ racc (1.7.3)
64
+ rack (2.2.8)
65
+ rack-test (2.1.0)
66
+ rack (>= 1.3)
67
+ rails-dom-testing (2.2.0)
68
+ activesupport (>= 5.0.0)
69
+ minitest
70
+ nokogiri (>= 1.6)
71
+ rails-html-sanitizer (1.6.0)
72
+ loofah (~> 2.21)
73
+ nokogiri (~> 1.14)
74
+ railties (7.0.8)
75
+ actionpack (= 7.0.8)
76
+ activesupport (= 7.0.8)
77
+ method_source
78
+ rake (>= 12.2)
79
+ thor (~> 1.0)
80
+ zeitwerk (~> 2.5)
81
+ rake (13.0.6)
82
+ ransack (4.1.1)
83
+ activerecord (>= 6.1.5)
84
+ activesupport (>= 6.1.5)
85
+ i18n
86
+ redis-client (0.18.0)
87
+ connection_pool
88
+ rspec (3.10.0)
89
+ rspec-core (~> 3.10.0)
90
+ rspec-expectations (~> 3.10.0)
91
+ rspec-mocks (~> 3.10.0)
92
+ rspec-core (3.10.1)
93
+ rspec-support (~> 3.10.0)
94
+ rspec-expectations (3.10.1)
95
+ diff-lcs (>= 1.2.0, < 2.0)
96
+ rspec-support (~> 3.10.0)
97
+ rspec-mocks (3.10.2)
98
+ diff-lcs (>= 1.2.0, < 2.0)
99
+ rspec-support (~> 3.10.0)
100
+ rspec-support (3.10.3)
101
+ sidekiq (7.2.0)
102
+ concurrent-ruby (< 2)
103
+ connection_pool (>= 2.3.0)
104
+ rack (>= 2.2.4)
105
+ redis-client (>= 0.14.0)
106
+ slim (5.1.1)
107
+ temple (~> 0.10.0)
108
+ tilt (>= 2.1.0)
109
+ slim-rails (3.6.3)
110
+ actionpack (>= 3.1)
111
+ railties (>= 3.1)
112
+ slim (>= 3.0, < 6.0, != 5.0.0)
113
+ temple (0.10.3)
114
+ thor (1.3.0)
115
+ tilt (2.3.0)
116
+ tzinfo (2.0.6)
117
+ concurrent-ruby (~> 1.0)
118
+ zeitwerk (2.6.12)
119
+
120
+ PLATFORMS
121
+ ruby
122
+
123
+ DEPENDENCIES
124
+ jobs_dashboard!
125
+ rake (~> 13.0)
126
+ rspec (~> 3.0)
127
+
128
+ BUNDLED WITH
129
+ 2.1.4
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 Patryk Warchol
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,133 @@
1
+ # JobsDashboard
2
+
3
+ JobsDashboard allows you to log all of your sidekiq jobs and provides an interface to visualize them.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'jobs_dashboard', git: 'https://github.com/9troisquarts/jobs_dashboard'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle install
16
+
17
+ Run the migration generator:
18
+
19
+ ```ruby
20
+ rails generate active_record:job_log_migration
21
+ ```
22
+
23
+ Run the migration:
24
+
25
+ ```ruby
26
+ rails db:migrate
27
+ ```
28
+ ## Usage
29
+
30
+ Set JobsDashboard::JobLogger as sidekiq default logger
31
+
32
+ ```ruby
33
+ # initializers/sidekiq.rb
34
+ require 'jobs_dashboard'
35
+
36
+ Sidekiq.configure_client do |config|
37
+ # accepts :expiration (optional)
38
+ JobsDashboard.configure_client_middleware config
39
+ end
40
+
41
+ Sidekiq.configure_server do |config|
42
+ # accepts :expiration (optional)
43
+ JobsDashboard.configure_server_middleware config
44
+
45
+ # accepts :expiration (optional)
46
+ JobsDashboard.configure_client_middleware config
47
+ end
48
+ ```
49
+
50
+ Mount Engine to access web component:
51
+
52
+ ```ruby
53
+ # routes.rb
54
+ require 'jobs_dashboard/engine'
55
+
56
+ Rails.application.routes.draw do
57
+ mount JobsDashboard::Engine, at: '/jobs_dashboard'
58
+ end
59
+ ```
60
+
61
+ ## Basic authentication
62
+
63
+ Set environment variable JOBS_DASHBOARD_AUTH_PASSWORD and JOBS_DASHBOARD_AUTH_USERNAME to activate the basic authentication
64
+
65
+ ## Job Options
66
+
67
+ Options can be specified in worker's sidekiq_options with the key jobs_dashboard
68
+
69
+ ```ruby
70
+ sidekiq_options jobs_dashboard: { skip: true }
71
+ ```
72
+
73
+ ## Add logs or metadata
74
+
75
+ In the job
76
+ ```ruby
77
+ include JobsDashboard::Worker
78
+ # add log line
79
+ add_job_log_line(value)
80
+
81
+ # add metadata
82
+ add_job_metadata(key, value)
83
+ ```
84
+
85
+ ## Add a custom attribute
86
+
87
+ Custom attribute can be added on the jobs_dashboard_job_logs table
88
+
89
+ ```ruby
90
+ include JobsDashboard::Worker
91
+ add_log_line(message)
92
+ ```
93
+
94
+ ## Ajout d'un attribut commun a tous les jobs
95
+
96
+ Si vous souhaitez ajouter un champ a tous les jobs qui sera utilisé comme filtre / colonnes, suivez les instructions ci dessous :
97
+
98
+ ```ruby
99
+ bundle exec rails g migration add_{{attribute_name}}_to_jobs_dashboard_job_logs
100
+ ```
101
+
102
+ In an initializer
103
+
104
+ ```ruby
105
+ JobsDashboard.setup do |config|
106
+ config.additional_params = [
107
+ {
108
+ attribute_name: 'attribute_name',
109
+ title: 'Title displayed on column header and more'
110
+ }
111
+ ]
112
+ end
113
+ ```
114
+
115
+ In the job
116
+ ```ruby
117
+ include JobsDashboard::Worker
118
+ set_job_parameter(attribute_name, value)
119
+ ```
120
+
121
+ ## Development
122
+
123
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
124
+
125
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
126
+
127
+ ## Contributing
128
+
129
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/jobs_dashboard.
130
+
131
+ ## License
132
+
133
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
@@ -0,0 +1,214 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
16
+
17
+ $layout-content-margin-top: 8rem;
18
+ $navbar-height: 80px;
19
+ $white: #FFF;
20
+ $border-radius: 0.5rem;
21
+ $montserrat: 'Montserrat', sans-serif;
22
+ $jet: #2D4047;
23
+
24
+ @import url('https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100;0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap');
25
+
26
+ @import "reset.scss";
27
+ @import "./variables.sass";
28
+
29
+ html {
30
+ font-family: Montserrat, Helvetica, sans-serif;
31
+ padding: 0px;
32
+ font-size: 14px;
33
+ box-sizing: border-box;
34
+ color: #343434;
35
+ }
36
+
37
+ a {
38
+ text-decoration: none;
39
+ color: $primary-color;
40
+ }
41
+
42
+ body {
43
+ background-color: #F5F5F5;
44
+ font-family: $montserrat;
45
+ margin: 0;
46
+ color: $jet;
47
+ padding-bottom: 1rem;
48
+ }
49
+
50
+ table {
51
+ border-collapse: collapse;
52
+ text-align: left;
53
+ }
54
+
55
+ table td, table th {
56
+ border: 1px solid #ddd;
57
+ padding: 8px;
58
+ }
59
+
60
+ table tr {
61
+ background-color: white;
62
+ }
63
+
64
+ table thead th {
65
+ padding-top: 12px;
66
+ padding-bottom: 12px;
67
+ }
68
+
69
+
70
+ h1, h2 {
71
+ font-weight: 600;
72
+ }
73
+
74
+ h1 {
75
+ font-size: 30px;
76
+ margin: 1rem 0;
77
+ }
78
+
79
+ h2 {
80
+ font-size: 22px;
81
+ margin: 0.75rem 0;
82
+ }
83
+
84
+ .code {
85
+ padding: 12px;
86
+ background-color: #2c3e50;
87
+ color: white;
88
+ }
89
+
90
+ .pagination {
91
+ margin-top: 20px;
92
+ margin-bottom: 20px;
93
+ text-align: right;
94
+ }
95
+
96
+ .full-width {
97
+ width: 100%;
98
+ }
99
+
100
+ .navbar {
101
+ background-color: $primary-color;
102
+ padding: 0rem 32px;
103
+
104
+ .title-wrapper {
105
+ padding-bottom: $layout-content-margin-top;
106
+ padding-top: 1rem;
107
+ h1 {
108
+ color: $white;
109
+ margin-bottom: 2rem;
110
+ }
111
+ }
112
+
113
+ .nav-wrapper {
114
+ width: 100%;
115
+ display: flex;
116
+ align-items: center;
117
+ border-bottom: 1px solid #a75663;
118
+ .logo {
119
+ margin-right: 2rem;
120
+ svg {
121
+ width: 40px;
122
+ .fa-secondary {
123
+ fill: $white;
124
+ }
125
+ .fa-primary {
126
+ fill: $primary-color;
127
+ }
128
+ }
129
+ }
130
+ }
131
+
132
+ .nav-wrapper > ul.nav {
133
+ display: flex;
134
+ height: $navbar-height;
135
+ gap: 16px;
136
+ align-items: center;
137
+ letter-spacing: 1px;
138
+ list-style: none;
139
+ margin: 0;
140
+ padding-left: 0;
141
+ > li.nav-item {
142
+ display: inline-flex;
143
+ position: relative;
144
+ align-items: center;
145
+ a {
146
+ font-size: 14px;
147
+ color: #FFF;
148
+ border-radius: 4px;
149
+ padding: 8px 12px;
150
+ transition: background-color 0.2s ease-in-out;
151
+ }
152
+
153
+ &.active, &:hover {
154
+ a {
155
+ background-color: darken($primary-color, 5%);
156
+ }
157
+ }
158
+ }
159
+ }
160
+ }
161
+
162
+ .layout-content {
163
+ padding: 0 32px;
164
+ margin-top: $layout-content-margin-top * -1;
165
+ }
166
+
167
+ .page-header {
168
+ padding: 15px 0px;
169
+ }
170
+
171
+ .divider {
172
+ height: 1px;
173
+ background-color: #E6E6E6;
174
+ width: 100%;
175
+ }
176
+
177
+ .mt-1 {
178
+ margin-top: 1rem;
179
+ }
180
+
181
+ .mt-2 {
182
+ margin-top: 30px;
183
+ }
184
+
185
+ .text-muted {
186
+ color: $muted;
187
+ }
188
+
189
+ .d-flex {
190
+ display: flex;
191
+ }
192
+
193
+ .mt-0 {
194
+ margin-top: 0;
195
+ }
196
+
197
+ .ml-auto {
198
+ margin-left: auto;
199
+ }
200
+
201
+ .radius {
202
+ border-radius: 0.5rem;
203
+ }
204
+
205
+ .align-items-center {
206
+ align-items: center;
207
+ }
208
+
209
+ .text-right {
210
+ text-align: right;
211
+ }
212
+
213
+ @import "./modules/*";
214
+ @import "./pages/**/*";
@@ -0,0 +1,15 @@
1
+ @import "../variables"
2
+
3
+ .button
4
+ border: none
5
+ padding: 8px 16px
6
+ border-radius: 5px
7
+ transition-property: opacity
8
+ transition-duration: 0.2s
9
+ transition-delay: 0s
10
+ cursor: pointer
11
+ &:hover
12
+ opacity: 80%
13
+ &.primary
14
+ background: $primary-color
15
+ color: white
@@ -0,0 +1,22 @@
1
+ @import "../variables"
2
+
3
+ .card
4
+ background-color: #FFF
5
+ border-radius: 0.5rem
6
+ &.shadowed
7
+ box-shadow: 0 0 5px 0 rgba(205, 205, 205, 0.3)
8
+
9
+ .card-title
10
+ padding: 16px 20px
11
+ color: $jet
12
+ font-weight: 600
13
+ font-size: 18px
14
+ border-bottom: 1px solid $border-color
15
+
16
+ .card-content
17
+ padding: 16px 20px
18
+ .description
19
+ border-radius: 5px
20
+
21
+ .no-padding
22
+ padding: 0px !important
@@ -0,0 +1,17 @@
1
+ @import "../variables"
2
+
3
+ .description
4
+ display: flex
5
+ flex-direction: column
6
+
7
+ .item
8
+ display: flex
9
+ .title
10
+ padding: 8px 20px
11
+ flex: 2
12
+ background: #F5F5F5
13
+ .value
14
+ padding: 8px 20px
15
+ flex: 5
16
+ &:not(:last-child)
17
+ border-bottom: 1px solid $border-color