administrate-field-json_array 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 38560ba496736377787310288687799a8a963c56091035bc7d3ab9e59cbeed40
4
+ data.tar.gz: 90e15cf3dac4330f5395d93eedd265ae8c3e82997023de76a1afebf49ec73e7d
5
+ SHA512:
6
+ metadata.gz: 37b1cf2269f4d3525b22d4259304d99b258f9cd47b7594ab26355f04ece02efa74e85c8b21be6273b2b2531e413c5c08a352bb2d6f47f2e4c0631bda89c90b3d
7
+ data.tar.gz: 2f5c91a95d601de3c53e10d0ac47566d5449760b9ce41208f7a76cdd97e3ad01aa80d5714e384825917a69f082c9d8ed504068344c78807a25239fe2391d0f98
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in administrate-field-json_array.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 Dmitry Davydov
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,89 @@
1
+ # Administrate::Field::JSONArray
2
+
3
+ A plugin to show and edit JSON objects within [Administrate](https://github.com/thoughtbot/administrate). inspired by [Administrate::Field::JSON](https://github.com/eddietejeda/administrate-field-json).
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'administrate-field-json_array'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ ```bash
16
+ bundle
17
+ ```
18
+
19
+ If you are using asset pipeline, add the following lines to your `manifest.js`:
20
+
21
+ ```js
22
+ //= link administrate-field-json_array/application.css
23
+ //= link administrate-field-json_array/application.js
24
+ ```
25
+
26
+ The manifest file is at `app/assets/config` by default.
27
+
28
+ ## Usage
29
+
30
+ You shoud pass `schema` to describe what inputs will be generate.
31
+ Currently supported `:number`, `:text`(textarea) and `:string`.
32
+
33
+ ```ruby
34
+ ATTRIBUTE_TYPES = {
35
+ # ...
36
+ details: Field::JSONArray.with_options(schema: { recipe: :number, description: :text }),
37
+ }.freeze
38
+ ```
39
+
40
+ ## How it looks like
41
+
42
+ ### Form
43
+
44
+ <img src="docs/images/form.png">
45
+
46
+ ### Show
47
+
48
+ <img src="docs/images/show.png">
49
+
50
+ ## Recipes
51
+
52
+ ### Store in jsonb
53
+
54
+ If you want to store your JSON in hash format and not a string add this to your model.
55
+
56
+ ```ruby
57
+ def your_field_name=(value)
58
+ self[:your_field_name] = value.is_a?(String) ? JSON.parse(value) : value
59
+ end
60
+ ```
61
+
62
+ Example:
63
+
64
+ ```ruby
65
+ def details=(value)
66
+ self[:details] = value.is_a?(String) ? JSON.parse(value) : value
67
+ end
68
+ ```
69
+
70
+ ### I18n
71
+
72
+ You can translate table headers like this
73
+
74
+ ```yaml
75
+ ru:
76
+ activerecord:
77
+ attributes:
78
+ your_model:
79
+ recipe_field:
80
+ add: Добавить строку
81
+ keys:
82
+ rank: Номер
83
+ description: Описание
84
+ ```
85
+
86
+
87
+ ## License
88
+
89
+ [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,21 @@
1
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = 'administrate-field-json_array'
5
+ gem.version = '0.1.1'
6
+ gem.authors = ['Dmitry Davydov']
7
+ gem.email = ['haudvd@gmail.com']
8
+ gem.homepage = 'https://github.com/haukot/administrate-field-json_array'
9
+ gem.summary = 'Field plugin for Administrate to edit JSON array as table of inputs'
10
+ gem.description = gem.summary
11
+ gem.license = 'MIT'
12
+
13
+ gem.require_paths = ['lib']
14
+ gem.files = `git ls-files`.split("\n")
15
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+
17
+ gem.add_runtime_dependency 'administrate', '< 1.0.0'
18
+ gem.add_runtime_dependency 'rails', '>= 4.2', '< 7'
19
+
20
+ gem.add_development_dependency 'rspec', '~> 3.7'
21
+ end
@@ -0,0 +1,69 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //= require_tree .
14
+
15
+ $(function() {
16
+ function processJsonArrayData($field, callback) {
17
+ var $base = $field.parents('.json_array_field__base')
18
+ var $dataField = $base.find('.json_array_field__data_field')
19
+ var fieldValue = $dataField.val()
20
+ var parsed = JSON.parse(fieldValue)
21
+
22
+ var inputKey = $field.data('key')
23
+ var index = $field.parents('tr').index() - 1 // 1 - because template row is first
24
+
25
+ callback(parsed, index, inputKey)
26
+
27
+ $dataField.val(JSON.stringify(parsed))
28
+ }
29
+
30
+ // Json array field interactions
31
+ $(document).on('click', '.json_array_field__remove_row', function() {
32
+ var $field = $(this)
33
+ processJsonArrayData($field, (data, index) => {
34
+ data.splice(index, 1)
35
+ })
36
+
37
+ $field.parents('tr').remove()
38
+
39
+ return false
40
+ })
41
+
42
+ $(document).on('click', '.json_array_field__add_row', function(e) {
43
+ var $base = $(this).parents('.json_array_field__base');
44
+ var $templateRow = $base.find('.json_array_field__template_row')
45
+ var $field = $templateRow.find('input') // FIXME: Bad, to save interface processJsonArrayData.
46
+ var template = $templateRow.html()
47
+ $base.find('tbody').append('<tr>' + template + '</tr>')
48
+
49
+ processJsonArrayData($field, (data) => {
50
+ data.push({}) // default values?..
51
+ })
52
+
53
+ e.preventDefault()
54
+ return false
55
+ })
56
+
57
+ $(document).on('input', '.json_array_field__input', function() {
58
+ var $field = $(this)
59
+ processJsonArrayData($field, (data, index, inputKey) => {
60
+ var value = $field.val()
61
+ // TODO: more types? Maybe send a schema to js?
62
+ if ($field.attr('type') === 'number') {
63
+ value = parseFloat(value)
64
+ }
65
+ data[index][inputKey] = value
66
+ })
67
+ })
68
+
69
+ })
@@ -0,0 +1,12 @@
1
+ /*
2
+ *= require_self
3
+ *= require_tree .
4
+ */
5
+
6
+ .json_array_field__add_row {
7
+ float: right;
8
+ }
9
+
10
+ .json_array_field__template_row {
11
+ display: none;
12
+ }
@@ -0,0 +1,34 @@
1
+ <div class="field-unit__label">
2
+ <%= f.label field.attribute %>
3
+ </div>
4
+
5
+ <div class="field-unit__field json_array_field__base">
6
+ <table>
7
+ <thead>
8
+
9
+ <%= render 'fields/json_array/header', field: field %>
10
+ <th></th>
11
+
12
+ </thead>
13
+
14
+ <tbody>
15
+ <tr class="json_array_field__template_row">
16
+ <%= render 'fields/json_array/row', row: {}, field: field %>
17
+ </tr>
18
+
19
+ <% field.values.each do |row| %>
20
+ <tr>
21
+ <%= render 'fields/json_array/row', row: row, field: field %>
22
+ </tr>
23
+ <% end %>
24
+
25
+ </tbody>
26
+ </table>
27
+
28
+ <button class="json_array_field__add_row" type='button'>
29
+ <%= I18n.t("activerecord.attributes.#{field.resource.class.name.underscore}.#{field.attribute.to_s}_field.add", default: 'Add') %>
30
+ </button>
31
+
32
+
33
+ <%= f.hidden_field field.attribute, value: field.values.to_json, class: 'json_array_field__data_field' %>
34
+ </div>
@@ -0,0 +1,3 @@
1
+ <% field.schema.keys.each do |k| %>
2
+ <th><%= I18n.t("activerecord.attributes.#{field.resource.class.name.underscore}.#{field.attribute.to_s}_keys.#{k}", default: k) %></th>
3
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= field.to_s %>
@@ -0,0 +1,14 @@
1
+ <% field.schema.each.with_index do |(k, type), key_i| %>
2
+ <td>
3
+ <%= field.input type, nil, row[k], class: 'json_array_field__input', data: { key: k } %>
4
+ </td>
5
+
6
+ <% if key_i == field.schema.size - 1 %>
7
+ <td>
8
+ <a class="text-color-red json_array_field__remove_row" href="#">
9
+ <%= I18n.t('administrate.actions.destroy') %>
10
+ </a>
11
+ </td>
12
+ <% end %>
13
+
14
+ <% end %>
@@ -0,0 +1,14 @@
1
+ <table>
2
+ <thead>
3
+ <%= render 'fields/json_array/header', field: field %>
4
+ </thead>
5
+ <tbody>
6
+ <% field.values.each do |row| %>
7
+ <tr>
8
+ <% field.schema.keys.each do |k| %>
9
+ <td><%= row[k] %></td>
10
+ <% end %>
11
+ </tr>
12
+ <% end %>
13
+ </tbody>
14
+ </table>
@@ -0,0 +1,46 @@
1
+ # coding: utf-8
2
+ require 'administrate/engine'
3
+ require 'administrate/field/base'
4
+ require 'rails'
5
+
6
+ module Administrate
7
+ module Field
8
+ class JSONArray < Administrate::Field::Base
9
+ include ActionView::Helpers::FormTagHelper
10
+
11
+ def to_s
12
+ return '-' unless data
13
+
14
+ data.to_s
15
+ end
16
+
17
+ def values
18
+ return [] unless data.is_a? Array
19
+
20
+ data
21
+ end
22
+
23
+ def input(schema_type, *args)
24
+ case schema_type
25
+ when :number
26
+ number_field_tag(*args)
27
+ when :text
28
+ text_area_tag(*args)
29
+ else
30
+ text_field_tag(*args)
31
+ end
32
+ end
33
+
34
+ def schema
35
+ raise 'Schema is required' unless options || options[:schema].empty?
36
+
37
+ @_json_array_schema ||= options[:schema].map { |k, v| [k.to_s, v] }.to_h
38
+ end
39
+
40
+ class Engine < ::Rails::Engine
41
+ Administrate::Engine.add_javascript 'administrate-field-json_array/application'
42
+ Administrate::Engine.add_stylesheet 'administrate-field-json_array/application'
43
+ end
44
+ end
45
+ end
46
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: administrate-field-json_array
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Dmitry Davydov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-03-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: administrate
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "<"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "<"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '4.2'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '7'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '4.2'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '7'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.7'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.7'
61
+ description: Field plugin for Administrate to edit JSON array as table of inputs
62
+ email:
63
+ - haudvd@gmail.com
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files: []
67
+ files:
68
+ - Gemfile
69
+ - LICENSE
70
+ - README.md
71
+ - administrate-field-json_array.gemspec
72
+ - app/assets/javascripts/administrate-field-json_array/application.js
73
+ - app/assets/stylesheets/administrate-field-json_array/application.css
74
+ - app/views/fields/json_array/_form.html.erb
75
+ - app/views/fields/json_array/_header.html.erb
76
+ - app/views/fields/json_array/_index.html.erb
77
+ - app/views/fields/json_array/_row.html.erb
78
+ - app/views/fields/json_array/_show.html.erb
79
+ - lib/administrate/field/json_array.rb
80
+ homepage: https://github.com/haukot/administrate-field-json_array
81
+ licenses:
82
+ - MIT
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubyforge_project:
100
+ rubygems_version: 2.7.8
101
+ signing_key:
102
+ specification_version: 4
103
+ summary: Field plugin for Administrate to edit JSON array as table of inputs
104
+ test_files: []