trestle 0.9.5 → 0.9.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +28 -0
  3. data/.gitignore +3 -0
  4. data/CONTRIBUTING.md +38 -0
  5. data/Gemfile +9 -2
  6. data/README.md +6 -1
  7. data/app/assets/bundle/trestle/bundle.css +7 -7
  8. data/app/assets/bundle/trestle/bundle.js +40 -38
  9. data/app/assets/bundle/trestle/fa-brands-400.eot +0 -0
  10. data/app/assets/bundle/trestle/fa-brands-400.svg +41 -41
  11. data/app/assets/bundle/trestle/fa-brands-400.ttf +0 -0
  12. data/app/assets/bundle/trestle/fa-brands-400.woff +0 -0
  13. data/app/assets/bundle/trestle/fa-brands-400.woff2 +0 -0
  14. data/app/assets/bundle/trestle/fa-regular-400.eot +0 -0
  15. data/app/assets/bundle/trestle/fa-regular-400.svg +2 -2
  16. data/app/assets/bundle/trestle/fa-regular-400.ttf +0 -0
  17. data/app/assets/bundle/trestle/fa-regular-400.woff +0 -0
  18. data/app/assets/bundle/trestle/fa-regular-400.woff2 +0 -0
  19. data/app/assets/bundle/trestle/fa-solid-900.eot +0 -0
  20. data/app/assets/bundle/trestle/fa-solid-900.svg +13 -7
  21. data/app/assets/bundle/trestle/fa-solid-900.ttf +0 -0
  22. data/app/assets/bundle/trestle/fa-solid-900.woff +0 -0
  23. data/app/assets/bundle/trestle/fa-solid-900.woff2 +0 -0
  24. data/app/assets/bundle/trestle/flatpickr/ar-dz.js +1 -0
  25. data/app/assets/bundle/trestle/flatpickr/ar.js +1 -1
  26. data/app/assets/bundle/trestle/flatpickr/at.js +1 -1
  27. data/app/assets/bundle/trestle/flatpickr/az.js +1 -1
  28. data/app/assets/bundle/trestle/flatpickr/be.js +1 -1
  29. data/app/assets/bundle/trestle/flatpickr/bg.js +1 -1
  30. data/app/assets/bundle/trestle/flatpickr/bn.js +1 -1
  31. data/app/assets/bundle/trestle/flatpickr/bs.js +1 -1
  32. data/app/assets/bundle/trestle/flatpickr/cat.js +1 -1
  33. data/app/assets/bundle/trestle/flatpickr/ckb.js +1 -0
  34. data/app/assets/bundle/trestle/flatpickr/cs.js +1 -1
  35. data/app/assets/bundle/trestle/flatpickr/cy.js +1 -1
  36. data/app/assets/bundle/trestle/flatpickr/da.js +1 -1
  37. data/app/assets/bundle/trestle/flatpickr/de.js +1 -1
  38. data/app/assets/bundle/trestle/flatpickr/default.js +1 -1
  39. data/app/assets/bundle/trestle/flatpickr/eo.js +1 -1
  40. data/app/assets/bundle/trestle/flatpickr/es.js +1 -1
  41. data/app/assets/bundle/trestle/flatpickr/et.js +1 -1
  42. data/app/assets/bundle/trestle/flatpickr/fa.js +1 -1
  43. data/app/assets/bundle/trestle/flatpickr/fi.js +1 -1
  44. data/app/assets/bundle/trestle/flatpickr/fo.js +1 -1
  45. data/app/assets/bundle/trestle/flatpickr/fr.js +1 -1
  46. data/app/assets/bundle/trestle/flatpickr/ga.js +1 -1
  47. data/app/assets/bundle/trestle/flatpickr/gr.js +1 -1
  48. data/app/assets/bundle/trestle/flatpickr/he.js +1 -1
  49. data/app/assets/bundle/trestle/flatpickr/hi.js +1 -1
  50. data/app/assets/bundle/trestle/flatpickr/hr.js +1 -1
  51. data/app/assets/bundle/trestle/flatpickr/hu.js +1 -1
  52. data/app/assets/bundle/trestle/flatpickr/hy.js +1 -0
  53. data/app/assets/bundle/trestle/flatpickr/id.js +1 -1
  54. data/app/assets/bundle/trestle/flatpickr/is.js +1 -1
  55. data/app/assets/bundle/trestle/flatpickr/it.js +1 -1
  56. data/app/assets/bundle/trestle/flatpickr/ja.js +1 -1
  57. data/app/assets/bundle/trestle/flatpickr/ka.js +1 -1
  58. data/app/assets/bundle/trestle/flatpickr/km.js +1 -1
  59. data/app/assets/bundle/trestle/flatpickr/ko.js +1 -1
  60. data/app/assets/bundle/trestle/flatpickr/kz.js +1 -1
  61. data/app/assets/bundle/trestle/flatpickr/lt.js +1 -1
  62. data/app/assets/bundle/trestle/flatpickr/lv.js +1 -1
  63. data/app/assets/bundle/trestle/flatpickr/mk.js +1 -1
  64. data/app/assets/bundle/trestle/flatpickr/mn.js +1 -1
  65. data/app/assets/bundle/trestle/flatpickr/ms.js +1 -1
  66. data/app/assets/bundle/trestle/flatpickr/my.js +1 -1
  67. data/app/assets/bundle/trestle/flatpickr/nl.js +1 -1
  68. data/app/assets/bundle/trestle/flatpickr/nn.js +1 -0
  69. data/app/assets/bundle/trestle/flatpickr/no.js +1 -1
  70. data/app/assets/bundle/trestle/flatpickr/pa.js +1 -1
  71. data/app/assets/bundle/trestle/flatpickr/pl.js +1 -1
  72. data/app/assets/bundle/trestle/flatpickr/pt.js +1 -1
  73. data/app/assets/bundle/trestle/flatpickr/ro.js +1 -1
  74. data/app/assets/bundle/trestle/flatpickr/ru.js +1 -1
  75. data/app/assets/bundle/trestle/flatpickr/si.js +1 -1
  76. data/app/assets/bundle/trestle/flatpickr/sk.js +1 -1
  77. data/app/assets/bundle/trestle/flatpickr/sl.js +1 -1
  78. data/app/assets/bundle/trestle/flatpickr/sq.js +1 -1
  79. data/app/assets/bundle/trestle/flatpickr/sr-cyr.js +1 -1
  80. data/app/assets/bundle/trestle/flatpickr/sr.js +1 -1
  81. data/app/assets/bundle/trestle/flatpickr/sv.js +1 -1
  82. data/app/assets/bundle/trestle/flatpickr/th.js +1 -1
  83. data/app/assets/bundle/trestle/flatpickr/tr.js +1 -1
  84. data/app/assets/bundle/trestle/flatpickr/uk.js +1 -1
  85. data/app/assets/bundle/trestle/flatpickr/uz.js +1 -1
  86. data/app/assets/bundle/trestle/flatpickr/uz_latn.js +1 -1
  87. data/app/assets/bundle/trestle/flatpickr/vn.js +1 -1
  88. data/app/assets/bundle/trestle/flatpickr/zh-tw.js +1 -1
  89. data/app/assets/bundle/trestle/flatpickr/zh.js +1 -1
  90. data/app/assets/javascripts/trestle/i18n.js.erb +1 -1
  91. data/app/controllers/trestle/dashboard_controller.rb +2 -2
  92. data/app/helpers/trestle/avatar_helper.rb +6 -2
  93. data/app/helpers/trestle/container_helper.rb +12 -4
  94. data/app/helpers/trestle/params_helper.rb +4 -1
  95. data/app/helpers/trestle/url_helper.rb +1 -11
  96. data/app/views/trestle/flash/_alert.html.erb +3 -1
  97. data/app/views/trestle/flash/_debug.html.erb +13 -8
  98. data/app/views/trestle/flash/_flash.html.erb +1 -1
  99. data/config/routes.rb +1 -1
  100. data/frontend/css/components/_alerts.scss +31 -0
  101. data/frontend/css/components/_avatar.scss +14 -0
  102. data/frontend/css/components/_buttons.scss +0 -1
  103. data/frontend/css/components/_datepicker.scss +1 -0
  104. data/frontend/css/components/_modal.scss +2 -0
  105. data/frontend/css/components/_tags.scss +2 -0
  106. data/frontend/css/components/_timestamp.scss +1 -1
  107. data/frontend/css/layout/_sidebar.scss +3 -2
  108. data/frontend/css/variables/_bootstrap.scss +1 -0
  109. data/frontend/css/variables/_trestle.scss +20 -0
  110. data/frontend/js/components/dialog.js +8 -3
  111. data/frontend/theme/trestle/theme/_defaults.scss +4 -4
  112. data/lib/generators/trestle/install/templates/_theme.scss +1 -1
  113. data/lib/generators/trestle/install/templates/trestle.rb.erb +8 -2
  114. data/lib/trestle/adapters/active_record_adapter.rb +16 -0
  115. data/lib/trestle/configurable.rb +6 -0
  116. data/lib/trestle/configuration.rb +4 -5
  117. data/lib/trestle/form/automatic.rb +2 -0
  118. data/lib/trestle/form/builder.rb +4 -4
  119. data/lib/trestle/form/field.rb +1 -1
  120. data/lib/trestle/form/renderer.rb +4 -1
  121. data/lib/trestle/lazy.rb +56 -0
  122. data/lib/trestle/navigation/item.rb +1 -1
  123. data/lib/trestle/registry.rb +61 -0
  124. data/lib/trestle/reloader.rb +1 -1
  125. data/lib/trestle/table/automatic.rb +7 -0
  126. data/lib/trestle/table/column.rb +5 -1
  127. data/lib/trestle/version.rb +1 -1
  128. data/lib/trestle.rb +30 -14
  129. data/package.json +20 -23
  130. data/webpack.config.js +36 -48
  131. data/yarn.lock +2817 -4562
  132. metadata +11 -4
  133. data/.travis.yml +0 -33
data/lib/trestle.rb CHANGED
@@ -11,6 +11,7 @@ module Trestle
11
11
  require_relative "trestle/adapters"
12
12
  require_relative "trestle/attribute"
13
13
  require_relative "trestle/breadcrumb"
14
+ require_relative "trestle/lazy"
14
15
  require_relative "trestle/configurable"
15
16
  require_relative "trestle/configuration"
16
17
  require_relative "trestle/display"
@@ -23,27 +24,29 @@ module Trestle
23
24
  require_relative "trestle/tab"
24
25
  require_relative "trestle/table"
25
26
  require_relative "trestle/admin"
27
+ require_relative "trestle/registry"
26
28
  require_relative "trestle/resource"
27
29
 
28
- mattr_accessor :admins
29
- self.admins = {}
30
+ # The registry records all active Trestle admins and facilitates lookups.
31
+ mattr_accessor :registry
32
+ self.registry = Registry.new
30
33
 
31
- def self.admin(name, options={}, &block)
32
- register(Admin::Builder.create(name, options, &block))
34
+ class << self
35
+ # Expose registry methods on Trestle module
36
+ delegate :register, :lookup, :lookup_model, :admins, to: :registry
33
37
  end
34
38
 
35
- def self.resource(name, options={}, &block)
36
- register(Resource::Builder.create(name, options, &block))
39
+ # Builds and registers a new plain admin
40
+ def self.admin(name, **options, &block)
41
+ register(Admin::Builder.create(name, options, &block))
37
42
  end
38
43
 
39
- def self.register(admin)
40
- self.admins[admin.admin_name] = admin
44
+ # Builds and registers a new admin resource
45
+ def self.resource(name, register_model: true, **options, &block)
46
+ register(Resource::Builder.create(name, options, &block), register_model: register_model)
41
47
  end
42
48
 
43
- def self.lookup(admin)
44
- return admin if admin.is_a?(Class) && admin < Trestle::Admin
45
- self.admins[admin.to_s]
46
- end
49
+ # Configuration methods
47
50
 
48
51
  def self.config
49
52
  @configuration ||= Configuration.new
@@ -53,14 +56,27 @@ module Trestle
53
56
  config.configure(&block)
54
57
  end
55
58
 
59
+ # Builds the global navigation by combining the menu options from the
60
+ # Trestle configuration along with menu blocks from admin resources.
56
61
  def self.navigation(context)
57
- blocks = config.menus + admins.values.map(&:menu).compact
62
+ blocks = config.menus + registry.map(&:menu).compact
58
63
  Navigation.build(blocks, context)
59
64
  end
60
65
 
66
+ # Returns the I18n fallbacks for the given locale.
67
+ #
68
+ # This is used from within a Sprockets asset (JavaScript)
69
+ # to determine which locale files to include.
70
+ #
71
+ # Examples
72
+ #
73
+ # Trestle.i18n_fallbacks("pt-BR") => ["pt-BR", "pt"]
74
+ # Trestle.i18n_fallbacks("ca") => ["ca", "es-ES", "es"] %>
75
+ #
76
+ # Returns an array of locale Strings.
61
77
  def self.i18n_fallbacks(locale=I18n.locale)
62
78
  if I18n.respond_to?(:fallbacks)
63
- I18n.fallbacks[locale]
79
+ I18n.fallbacks[locale].map(&:to_s)
64
80
  elsif locale.to_s.include?("-")
65
81
  fallback = locale.to_s.split("-").first
66
82
  [locale, fallback]
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trestle",
3
- "version": "0.9.0",
3
+ "version": "0.9.7",
4
4
  "description": "A modern, responsive admin framework for Ruby on Rails",
5
5
  "homepage": "https://trestle.io",
6
6
  "repository": "https://github.com/TrestleAdmin/trestle.git",
@@ -13,36 +13,33 @@
13
13
  "watch": "webpack --mode development --watch"
14
14
  },
15
15
  "devDependencies": {
16
- "@babel/core": "^7.6.0",
17
- "@babel/preset-env": "^7.6.0",
18
- "autoprefixer": "^9.6.1",
16
+ "@babel/core": "^7.14.6",
17
+ "@babel/preset-env": "^7.14.7",
18
+ "autoprefixer": "^10.2.6",
19
19
  "babel-loader": "^8.0.6",
20
- "copy-webpack-plugin": "^5.0.4",
21
- "css-loader": "^3.2.0",
22
- "expose-loader": "^0.7.5",
23
- "file-loader": "^6.0.0",
24
- "mini-css-extract-plugin": "^0.9.0",
25
- "node-sass": "^4.14.1",
26
- "optimize-css-assets-webpack-plugin": "^5.0.3",
27
- "postcss-loader": "^3.0.0",
28
- "sass-loader": "^8.0.0",
29
- "uglify-js": "^3.9.3",
30
- "uglifyjs-webpack-plugin": "^2.2.0",
31
- "url-loader": "^4.1.0",
32
- "webpack": "^4.40.2",
33
- "webpack-cli": "^3.3.9"
20
+ "copy-webpack-plugin": "^9.0.1",
21
+ "css-loader": "^5.2.6",
22
+ "css-minimizer-webpack-plugin": "^3.0.2",
23
+ "expose-loader": "^3.0.0",
24
+ "mini-css-extract-plugin": "^2.0.0",
25
+ "node-sass": "^7.0.1",
26
+ "postcss": "^8.3.5",
27
+ "postcss-loader": "^6.1.1",
28
+ "sass-loader": "^12.1.0",
29
+ "webpack": "^5.42.0",
30
+ "webpack-cli": "^4.7.2"
34
31
  },
35
32
  "dependencies": {
36
- "@fortawesome/fontawesome-free": "^5.11.1",
37
- "@rails/ujs": "^6.0.3",
33
+ "@fortawesome/fontawesome-free": "^5.15.3",
34
+ "@rails/ujs": "^6.1.3-1",
38
35
  "bootstrap": "^4.5.0",
39
- "bootstrap-confirmation2": "^4.1.0",
36
+ "bootstrap-confirmation2": "^4.2.1",
40
37
  "bs-custom-file-input": "^1.3.2",
41
38
  "flatpickr": "^4.6.2",
42
- "jquery": "^3.5.1",
39
+ "jquery": "^3.6.0",
43
40
  "magnific-popup": "^1.1.0",
44
41
  "popper.js": "^1.15.0",
45
42
  "select2": "^4.0.10",
46
- "select2-theme-bootstrap4": "^0.2.0-beta.4"
43
+ "select2-theme-bootstrap4": "^1.0.0"
47
44
  }
48
45
  }
data/webpack.config.js CHANGED
@@ -1,12 +1,12 @@
1
1
  const path = require('path');
2
2
 
3
- const Uglify = require('uglify-js');
4
- const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
5
- const MiniCssExtractPlugin = require('mini-css-extract-plugin');
6
- const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
7
3
  const CopyWebpackPlugin = require('copy-webpack-plugin');
4
+ const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
5
+ const MiniCssExtractPlugin = require('mini-css-extract-plugin');
6
+ const TerserPlugin = require('terser-webpack-plugin');
8
7
 
9
8
  module.exports = {
9
+ mode: 'production',
10
10
  entry: path.resolve(__dirname, 'frontend/index.js'),
11
11
  output: {
12
12
  library: 'Trestle',
@@ -15,27 +15,11 @@ module.exports = {
15
15
  path: path.resolve(__dirname, 'app/assets/bundle/trestle')
16
16
  },
17
17
  optimization: {
18
- splitChunks: {
19
- cacheGroups: {
20
- styles: {
21
- name: 'styles',
22
- test: /\.css$/,
23
- chunks: 'all',
24
- enforce: true
25
- }
26
- }
27
- },
28
18
  minimizer: [
29
- new UglifyJsPlugin({
30
- cache: true,
31
- parallel: true,
32
- sourceMap: true
19
+ new TerserPlugin({
20
+ extractComments: false
33
21
  }),
34
- new OptimizeCSSAssetsPlugin({
35
- cssProcessorPluginOptions: {
36
- preset: ['default', { normalizePositions: false }]
37
- }
38
- })
22
+ new CssMinimizerPlugin()
39
23
  ]
40
24
  },
41
25
  module: {
@@ -49,26 +33,27 @@ module.exports = {
49
33
  },
50
34
  {
51
35
  test: /\.(ttf|eot|svg|woff2?)(\?[\s\S]+)?$/,
52
- use: {
53
- loader: 'file-loader',
54
- options: {
55
- name: '[name].[ext]'
56
- }
57
- }
36
+ type: 'asset/resource'
58
37
  },
59
38
  {
60
39
  test: /\.(png|jpg|gif)$/i,
61
- exclude: /node_modules/,
62
- use: {
63
- loader: 'url-loader'
64
- }
40
+ type: 'asset/inline'
65
41
  },
66
42
  {
67
43
  test: /\.s?[ac]ss$/,
68
44
  use: [
69
45
  { loader: MiniCssExtractPlugin.loader },
70
46
  { loader: 'css-loader' },
71
- { loader: 'postcss-loader', options: { plugins: [ require('autoprefixer') ] } },
47
+ {
48
+ loader: 'postcss-loader',
49
+ options: {
50
+ postcssOptions: {
51
+ plugins: [
52
+ ['autoprefixer', {}]
53
+ ]
54
+ }
55
+ }
56
+ },
72
57
  { loader: 'sass-loader' }
73
58
  ]
74
59
  },
@@ -76,26 +61,29 @@ module.exports = {
76
61
  test: require.resolve('jquery'),
77
62
  use: [{
78
63
  loader: 'expose-loader',
79
- options: 'jQuery'
80
- }, {
81
- loader: 'expose-loader',
82
- options: '$'
64
+ options: {
65
+ exposes: ['$', 'jQuery']
66
+ }
83
67
  }]
84
68
  }
85
69
  ]
86
70
  },
87
71
  plugins: [
88
- new CopyWebpackPlugin([
89
- { from: 'node_modules/@fortawesome/fontawesome-free/webfonts/*', to: '[name].[ext]' },
90
- {
91
- from: 'node_modules/flatpickr/dist/l10n/*.js',
92
- to: 'flatpickr/[name].[ext]',
93
- ignore: ['index.js'],
94
- transform: function(fileContent, path) {
95
- return Uglify.minify(fileContent.toString()).code.toString();
72
+ new CopyWebpackPlugin({
73
+ patterns: [
74
+ {
75
+ from: 'node_modules/@fortawesome/fontawesome-free/webfonts/*',
76
+ to: '[name][ext]'
77
+ },
78
+ {
79
+ from: 'node_modules/flatpickr/dist/l10n/*.js',
80
+ to: 'flatpickr/[name][ext]',
81
+ globOptions: {
82
+ ignore: ['**/index.js']
83
+ }
96
84
  }
97
- }
98
- ]),
85
+ ]
86
+ }),
99
87
  new MiniCssExtractPlugin({
100
88
  filename: 'bundle.css'
101
89
  })