kms_models 0.8.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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