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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bf7d34f10f2c3f33b4a50bdbac4badec6e3ce73a
4
- data.tar.gz: 4dee3caa9f3dd22a3f454e35bfc1185fc38bc257
3
+ metadata.gz: a9b78c88773588da736e99bea8732e265229d7b4
4
+ data.tar.gz: 07b6050158b77cbf3d16fcaad3462c8a9e34d834
5
5
  SHA512:
6
- metadata.gz: 5b1c5100a0d19634d64b03b21cd54c93390eb2b9fce4168e110878e4ef2a4089ee7bbd2f4ccbf38e456503573d59944f88c4a1fe787fdc694528043039a96917
7
- data.tar.gz: b2a23bb80c33e1e2d28962288e5db3598cb2d0f849f761f9aa5dc75a9d14e5f6467364baf3930ca0be5d21f6f5822a32343c7b6ff80be1ac3b8008adf20591e7
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="" &nbsp;
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-list
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)
@@ -13,3 +13,6 @@
13
13
  *= require_tree .
14
14
  *= require_self
15
15
  */
16
+ .as-sortable-dragging td {
17
+ padding: 0 10px;
18
+ }
@@ -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!(slug)
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::Entry.find_by_slug!(slug)
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
@@ -5,7 +5,7 @@ module Kms
5
5
  has_many :fields_attributes, serializer: Kms::FieldSerializer
6
6
 
7
7
  def fields_attributes
8
- object.fields
8
+ object.fields.order(:position)
9
9
  end
10
10
 
11
11
  end
@@ -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:
@@ -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"
@@ -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: "Текст"
@@ -6,6 +6,7 @@ Kms::Models::Engine.routes.draw do
6
6
  post '' => 'entries#update'
7
7
  end
8
8
  end
9
+ resources :fields, only: :update, format: true
9
10
  end
10
11
  end
11
12
  end
@@ -0,0 +1,5 @@
1
+ class ChangeValuesColumnToJsonb < ActiveRecord::Migration[5.1]
2
+ def change
3
+ execute "ALTER TABLE kms_entries ALTER COLUMN values SET DATA TYPE jsonb USING values::jsonb"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddPositionToKmsFields < ActiveRecord::Migration[5.1]
2
+ def change
3
+ add_column :kms_fields, :position, :integer, default: 0, null: false
4
+ end
5
+ end
@@ -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
- json_queries = fields.map {|name, value| "values ->> '#{name}' = ?" }
13
- result = @source.where(json_queries.join(" AND "), *fields.values.map(&:to_s)).first
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
- json_queries = fields.map {|name, value| "values ->> '#{name}' = ?" }
21
- result = @source.where(json_queries.join(" AND "), *fields.values.map(&:to_s))
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? ["id", "created_at", "updated_at", "position"]
30
- order_clause.join(' ')
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
@@ -1,5 +1,5 @@
1
1
  module Kms
2
2
  module Models
3
- VERSION = '0.8.0'
3
+ VERSION = '1.0.0'
4
4
  end
5
5
  end
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.8.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-03-23 00:00:00.000000000 Z
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.6.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.6.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.4
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.4
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.4.7
202
+ rubygems_version: 2.6.11
200
203
  signing_key:
201
204
  specification_version: 4
202
205
  summary: Extension for KMS