kms_models 0.8.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/kms_models/application/controllers/fields_controller.coffee.erb +14 -2
- data/app/assets/javascripts/kms_models/application/controllers/models_controller.coffee.erb +6 -2
- data/app/assets/javascripts/templates/entries/index.html.slim +12 -1
- data/app/assets/javascripts/templates/fields/has_many_field.html.slim +1 -1
- data/app/assets/javascripts/templates/models/fields.html.slim +3 -2
- data/app/assets/javascripts/templates/models/index.html.slim +13 -2
- data/app/assets/stylesheets/kms_models/application.css +3 -0
- data/app/controllers/kms/models/fields_controller.rb +23 -0
- data/app/models/kms/page_decorator.rb +4 -2
- data/app/serializers/kms/model_serializer.rb +1 -1
- data/app/uploaders/entry_file_uploader.rb +1 -2
- data/config/locales/en.yml +4 -0
- data/config/locales/ru.yml +4 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20170802063046_change_values_column_to_jsonb.rb +5 -0
- data/db/migrate/20170802085121_add_position_to_kms_fields.rb +5 -0
- data/lib/drops/kms/entry_drop.rb +21 -7
- data/lib/generators/kms_models/install/install_generator.rb +4 -0
- data/lib/kms/models/version.rb +1 -1
- metadata +10 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9b78c88773588da736e99bea8732e265229d7b4
|
4
|
+
data.tar.gz: 07b6050158b77cbf3d16fcaad3462c8a9e34d834
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5cd7755771682d738fc2c9ec9e4f03295676f86cae31d96c41c549715e74f85c256db3151bb218006012ec3f794b74f6fede7c57a9e0fa89ed43bb07c19725e4
|
7
|
+
data.tar.gz: bd40086173164ddb222e91075ba6e6e9e0ad2b3b7f5329f456799f62409a5c0385ada80bfeb81343d6fa6e2ac3fdbd33e31ee33ddae16a6610dca6a3c6b8c22e
|
@@ -1,4 +1,4 @@
|
|
1
|
-
FieldsController = ($scope, $state, Restangular, $stateParams) ->
|
1
|
+
FieldsController = ($scope, $state, Restangular, $stateParams, TransliterationService) ->
|
2
2
|
$scope.types = [
|
3
3
|
{ id: 'Kms::StringField', name: "<%= I18n.t("field_types.string") %>"},
|
4
4
|
{ id: 'Kms::TextField', name: "<%= I18n.t("field_types.text") %>"},
|
@@ -8,6 +8,14 @@ FieldsController = ($scope, $state, Restangular, $stateParams) ->
|
|
8
8
|
{ id: 'Kms::BelongsToField', name: "<%= I18n.t("field_types.belongs_to") %>"},
|
9
9
|
]
|
10
10
|
|
11
|
+
$scope.fieldsSortableOptions =
|
12
|
+
orderChanged: (event)->
|
13
|
+
for field, index in event.dest.sortableScope.modelValue
|
14
|
+
field_copy =
|
15
|
+
id: field.id
|
16
|
+
position: index
|
17
|
+
Restangular.restangularizeElement($scope.model, field_copy, 'fields').put()
|
18
|
+
|
11
19
|
Restangular.all('resources').getList().then (templatable_types)->
|
12
20
|
$scope.templatable_types = templatable_types
|
13
21
|
|
@@ -17,6 +25,10 @@ FieldsController = ($scope, $state, Restangular, $stateParams) ->
|
|
17
25
|
|
18
26
|
$scope.field = {}
|
19
27
|
|
28
|
+
$scope.$watch 'field.name', (newValue, oldValue) ->
|
29
|
+
if newValue? and !$scope.field.id
|
30
|
+
$scope.field.liquor_name = _.snakeCase TransliterationService.translit(newValue, 5).replace(/`/g, '')
|
31
|
+
|
20
32
|
$scope.formatType = (field)->
|
21
33
|
fieldType = _.find $scope.types, (type) -> type.id == field.type
|
22
34
|
if $scope.isAssociationField(field) then "#{fieldType.name} (#{$scope.getDisplayableTemplatableType(field)})" else fieldType.name
|
@@ -39,4 +51,4 @@ FieldsController = ($scope, $state, Restangular, $stateParams) ->
|
|
39
51
|
|
40
52
|
|
41
53
|
angular.module('KMS')
|
42
|
-
.controller('FieldsController', ['$scope', '$state', 'Restangular', '$stateParams', FieldsController])
|
54
|
+
.controller('FieldsController', ['$scope', '$state', 'Restangular', '$stateParams', 'TransliterationService', FieldsController])
|
@@ -1,4 +1,4 @@
|
|
1
|
-
ModelsController = ($scope, $state, Restangular, $stateParams, Alertify, ErrorsService) ->
|
1
|
+
ModelsController = ($scope, $state, Restangular, $stateParams, Alertify, ErrorsService, TransliterationService) ->
|
2
2
|
$scope.store = Restangular.all('models')
|
3
3
|
|
4
4
|
Restangular.all('users').customGET('kms_user').then (current_user) ->
|
@@ -18,6 +18,10 @@ ModelsController = ($scope, $state, Restangular, $stateParams, Alertify, ErrorsS
|
|
18
18
|
if newFields and newFields.length > 0 and oldFields and oldFields.length == 0
|
19
19
|
$scope.model.label_field =newFields[0].liquor_name
|
20
20
|
|
21
|
+
$scope.$watch 'model.kms_model_name', (newValue, oldValue) ->
|
22
|
+
if newValue? and !$scope.model.id
|
23
|
+
$scope.model.collection_name = _.snakeCase TransliterationService.translit(newValue, 5).replace(/`/g, '')
|
24
|
+
|
21
25
|
$scope.create = ->
|
22
26
|
$scope.store.post($scope.model).then ->
|
23
27
|
# for adding to Menu - better to render resources via js
|
@@ -39,4 +43,4 @@ ModelsController = ($scope, $state, Restangular, $stateParams, Alertify, ErrorsS
|
|
39
43
|
|
40
44
|
|
41
45
|
angular.module('KMS')
|
42
|
-
.controller('ModelsController', ['$scope', '$state', 'Restangular', '$stateParams', 'Alertify', 'ErrorsService', ModelsController])
|
46
|
+
.controller('ModelsController', ['$scope', '$state', 'Restangular', '$stateParams', 'Alertify', 'ErrorsService', 'TransliterationService', ModelsController])
|
@@ -1,4 +1,4 @@
|
|
1
|
-
.row
|
1
|
+
.row ng-show="entries.length"
|
2
2
|
.col-lg-12
|
3
3
|
.widget
|
4
4
|
.widget-header
|
@@ -19,3 +19,14 @@
|
|
19
19
|
.btn-group.pull-right
|
20
20
|
a.btn.btn-sm.btn-danger ng-click="destroy(entry)"
|
21
21
|
i.fa.fa-times
|
22
|
+
.row ng-show="!entries.length"
|
23
|
+
.center-block
|
24
|
+
.jumbotron.vertical-center.text-center
|
25
|
+
.container
|
26
|
+
h1
|
27
|
+
span.fa-stack.fa-lg
|
28
|
+
i.fa.fa-circle.fa-stack-2x
|
29
|
+
i.fa.fa-list.fa-stack-1x
|
30
|
+
p = I18n.t(:entries_description)
|
31
|
+
p
|
32
|
+
a.btn.btn-primary.btn-lg ui-sref="models.entries.new({modelId: model.id})" role="button" = I18n.t(:create_first_entry)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
label for="{{ field.liquor_name }}"
|
2
2
|
| {{ field.name }}
|
3
3
|
ui-select multiple="" ng-model="entry.values[field.liquor_name]" theme="bootstrap" on-select="addObject($item, field)" on-remove='removeObject($item, field)'
|
4
|
-
ui-select-match placeholder=I18n.t(:has_many_field_placeholder)
|
4
|
+
ui-select-match placeholder=I18n.t(:has_many_field_placeholder) class="ui-select-match"
|
5
5
|
| {{ $item.values[$item.model.label_field] || $item.id }}
|
6
6
|
ui-select-choices repeat="childEntry.id as childEntry in {{ field.liquor_name }}"
|
7
7
|
div ng-bind-html="childEntry.values[childEntry.model.label_field] | highlight: $select.search"
|
@@ -3,9 +3,10 @@
|
|
3
3
|
thead
|
4
4
|
tr
|
5
5
|
th colspan="4" = Kms::Model.human_attribute_name(:fields)
|
6
|
-
tbody
|
7
|
-
tr ng-repeat="field in model.fields_attributes" ng-hide="field._destroy"
|
6
|
+
tbody as-sortable="fieldsSortableOptions" ng-model="model.fields_attributes"
|
7
|
+
tr ng-repeat="field in model.fields_attributes" ng-hide="field._destroy" as-sortable-item=""
|
8
8
|
td
|
9
|
+
i.fa.fa-bars as-sortable-item-handle=""
|
9
10
|
| {{ field.name }}
|
10
11
|
td
|
11
12
|
| {{ field.liquor_name }}
|
@@ -1,8 +1,8 @@
|
|
1
|
-
.row
|
1
|
+
.row ng-show="models.length"
|
2
2
|
.col-lg-12
|
3
3
|
.widget
|
4
4
|
.widget-header
|
5
|
-
i.fa.fa-
|
5
|
+
i.fa.fa-tasks
|
6
6
|
= Kms::Model.model_name.human(count: 1.1)
|
7
7
|
a.btn.btn-sm.btn-primary.pull-right ui-sref="models.new"
|
8
8
|
= I18n.t("add_model")
|
@@ -18,3 +18,14 @@
|
|
18
18
|
.btn-group.pull-right
|
19
19
|
a.btn.btn-sm.btn-danger ng-click="destroy(model)" ng-show="currentUser.admin"
|
20
20
|
i.fa.fa-times
|
21
|
+
.row ng-show="!models.length"
|
22
|
+
.center-block
|
23
|
+
.jumbotron.vertical-center.text-center
|
24
|
+
.container
|
25
|
+
h1
|
26
|
+
span.fa-stack.fa-lg
|
27
|
+
i.fa.fa-circle.fa-stack-2x
|
28
|
+
i.fa.fa-tasks.fa-stack-1x
|
29
|
+
p = I18n.t(:models_description)
|
30
|
+
p
|
31
|
+
a.btn.btn-primary.btn-lg ui-sref="models.new" role="button" = I18n.t(:create_first_model)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Kms
|
2
|
+
module Models
|
3
|
+
class FieldsController < ApplicationController
|
4
|
+
wrap_parameters :field, include: [:position]
|
5
|
+
|
6
|
+
def update
|
7
|
+
model = Model.find(params[:model_id])
|
8
|
+
@field = model.fields.find(params[:id])
|
9
|
+
if @field.update(field_params)
|
10
|
+
head :no_content
|
11
|
+
else
|
12
|
+
render json: @field.to_json(methods: :errors), status: :unprocessable_entity
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def field_params
|
19
|
+
params.require(:field).permit(:position)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
Kms::Page.class_eval do
|
2
2
|
# fetch item by slug
|
3
|
-
def fetch_item
|
3
|
+
def fetch_item(slug)
|
4
4
|
return nil unless templatable?
|
5
5
|
templatable_type.constantize.find_by_slug!(slug)
|
6
6
|
rescue NameError
|
7
|
-
Kms::
|
7
|
+
model = Kms::Model.find(templatable_type.to_i)
|
8
|
+
model.entries.find_by_slug(slug)
|
9
|
+
# Kms::Entry.find_by_slug(slug)
|
8
10
|
end
|
9
11
|
|
10
12
|
# fetch items for templatable page
|
@@ -7,8 +7,7 @@ class EntryFileUploader < CarrierWave::Uploader::Base
|
|
7
7
|
# include CarrierWave::MiniMagick
|
8
8
|
|
9
9
|
# Choose what kind of storage to use for this uploader:
|
10
|
-
storage :file
|
11
|
-
# storage :fog
|
10
|
+
storage (ENV['KMS_ASSETS_STORAGE'] && ENV['KMS_ASSETS_STORAGE'].to_sym) || :file
|
12
11
|
|
13
12
|
# Override the directory where uploaded files will be stored.
|
14
13
|
# This is a sensible default for uploaders that are meant to be mounted:
|
data/config/locales/en.yml
CHANGED
@@ -15,6 +15,10 @@ en:
|
|
15
15
|
allow_creation_using_form_field_hint: "On website you can place a form allowing to create model entries"
|
16
16
|
has_many_field_placeholder: "Select related objects..."
|
17
17
|
belongs_to_field_placeholder: "Select related object..."
|
18
|
+
models_description: "Models are where you organize your content (basically dynamic) like 'News', 'Blog', 'Services' and etc."
|
19
|
+
create_first_model: "Create first model"
|
20
|
+
entries_description: "Here you would create content for corresponding Model"
|
21
|
+
create_first_entry: "Create first entry"
|
18
22
|
field_types:
|
19
23
|
string: "String"
|
20
24
|
text: "Text"
|
data/config/locales/ru.yml
CHANGED
@@ -15,6 +15,10 @@ ru:
|
|
15
15
|
allow_creation_using_form_field_hint: "На сайте можно будет разместить форму для создания элементов модели"
|
16
16
|
has_many_field_placeholder: "Выберите связанные объекты..."
|
17
17
|
belongs_to_field_placeholder: "Выберите связанный объект..."
|
18
|
+
models_description: "Модели - это ваш динамический контент. Например, 'Новости', 'Блог', 'Услуги' и тд."
|
19
|
+
create_first_model: "Создать первую модель"
|
20
|
+
entries_description: "Здесь вы можете создавать элементы соответствующей Модели"
|
21
|
+
create_first_entry: "Создать первый элемент"
|
18
22
|
field_types:
|
19
23
|
string: "Строка"
|
20
24
|
text: "Текст"
|
data/config/routes.rb
CHANGED
data/lib/drops/kms/entry_drop.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Kms
|
2
2
|
class EntryDrop < Liquor::Drop
|
3
3
|
|
4
|
-
attributes :id, :created_at, :permalink, :model_collection_name
|
4
|
+
attributes :id, :created_at, :slug, :permalink, :model_collection_name
|
5
5
|
scopes :order
|
6
6
|
|
7
7
|
# overriding methods cause we work with 'json' column
|
@@ -9,16 +9,16 @@ module Kms
|
|
9
9
|
def find_by(_, fields={})
|
10
10
|
fields, = Liquor::Drop.unwrap_scope_arguments([ fields ])
|
11
11
|
|
12
|
-
|
13
|
-
result = @source.where(
|
12
|
+
plain_fields, json_fields = fields_partition(fields)
|
13
|
+
result = @source.where(fields_query(fields), *(json_fields.values + plain_fields.values).map(&:to_s)).first
|
14
14
|
Liquor::DropDelegation.wrap_element result if result
|
15
15
|
end
|
16
16
|
|
17
17
|
def find_all_by(_, fields={})
|
18
18
|
fields, = Liquor::Drop.unwrap_scope_arguments([ fields ])
|
19
19
|
|
20
|
-
|
21
|
-
result = @source.where(
|
20
|
+
plain_fields, json_fields = fields_partition(fields)
|
21
|
+
result = @source.where(fields_query(fields), *(json_fields.values + plain_fields.values).map(&:to_s))
|
22
22
|
Liquor::DropDelegation.wrap_scope(result)
|
23
23
|
end
|
24
24
|
|
@@ -26,8 +26,8 @@ module Kms
|
|
26
26
|
args = Liquor::Drop.unwrap_scope_arguments(args)
|
27
27
|
parsed_args = args.map do |arg|
|
28
28
|
order_clause = arg.split(' ')
|
29
|
-
if order_clause[0].in?
|
30
|
-
|
29
|
+
if order_clause[0].in? Kms::Entry.column_names - ['values']
|
30
|
+
arg
|
31
31
|
else
|
32
32
|
["values ->> '#{order_clause[0]}'", order_clause[1].to_s].join(' ')
|
33
33
|
end
|
@@ -35,6 +35,20 @@ module Kms
|
|
35
35
|
# we use reorder because by default we order by position
|
36
36
|
Liquor::DropDelegation.wrap_scope @source.reorder(*parsed_args)
|
37
37
|
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def fields_partition(fields)
|
42
|
+
fields.partition {|name, _| (Kms::Entry.column_names - ['values']).include? name.to_s}.map(&:to_h)
|
43
|
+
end
|
44
|
+
|
45
|
+
def fields_query(fields)
|
46
|
+
plain_fields, json_fields = fields_partition(fields)
|
47
|
+
json_fields_query = json_fields.map {|name, _| "values ->> '#{name}' = ?" }.join(" AND ")
|
48
|
+
plain_fields_query = plain_fields.map {|name, _| "#{name} = ?"}.join(" AND ")
|
49
|
+
[json_fields_query, plain_fields_query].reject(&:empty?).join(' OR ')
|
50
|
+
end
|
51
|
+
|
38
52
|
end
|
39
53
|
|
40
54
|
def initialize(source)
|
@@ -13,5 +13,9 @@ module KmsModels
|
|
13
13
|
append_file "app/assets/javascripts/application.js", "//= require kms_models/application\n"
|
14
14
|
end
|
15
15
|
|
16
|
+
def insert_stylesheet
|
17
|
+
gsub_file "app/assets/stylesheets/application.css", '*/', "*= require kms_models/application\n*/"
|
18
|
+
end
|
19
|
+
|
16
20
|
end
|
17
21
|
end
|
data/lib/kms/models/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kms_models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Petrov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: friendly_id
|
@@ -30,28 +30,28 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 1.0.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 1.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: combustion
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.5
|
47
|
+
version: '0.5'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.5
|
54
|
+
version: '0.5'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: factory_girl_rails
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -133,6 +133,7 @@ files:
|
|
133
133
|
- app/assets/javascripts/templates/models/new.html.slim
|
134
134
|
- app/assets/stylesheets/kms_models/application.css
|
135
135
|
- app/controllers/kms/models/entries_controller.rb
|
136
|
+
- app/controllers/kms/models/fields_controller.rb
|
136
137
|
- app/controllers/kms/models/models_controller.rb
|
137
138
|
- app/controllers/kms/public/entries_controller.rb
|
138
139
|
- app/helpers/kms_models/application_helper.rb
|
@@ -169,6 +170,8 @@ files:
|
|
169
170
|
- db/migrate/20150901115303_add_class_name_to_kms_fields.rb
|
170
171
|
- db/migrate/20150910081440_add_position_to_kms_entries.rb
|
171
172
|
- db/migrate/20170209125819_add_allow_creation_using_form_to_models.rb
|
173
|
+
- db/migrate/20170802063046_change_values_column_to_jsonb.rb
|
174
|
+
- db/migrate/20170802085121_add_position_to_kms_fields.rb
|
172
175
|
- lib/drops/kms/entry_drop.rb
|
173
176
|
- lib/drops/kms/models_wrapper_drop.rb
|
174
177
|
- lib/generators/kms_models/install/install_generator.rb
|
@@ -196,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
196
199
|
version: '0'
|
197
200
|
requirements: []
|
198
201
|
rubyforge_project:
|
199
|
-
rubygems_version: 2.
|
202
|
+
rubygems_version: 2.6.11
|
200
203
|
signing_key:
|
201
204
|
specification_version: 4
|
202
205
|
summary: Extension for KMS
|