symphonia 2.1.8 → 2.2.1

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
  SHA256:
3
- metadata.gz: 6da447b65e8df134e762dd99e232857836329c8a242d16566c6ef5f1d8295d2f
4
- data.tar.gz: de6d595aade9877cc75469461c0224f9b1b9ed4835aa165a1be27882fa2718ad
3
+ metadata.gz: 6dbb027e9c0aabbd327fd90ec05a572978a20404790f27decfcecc1db39ca347
4
+ data.tar.gz: 11320d1a38c2ebc7b95cee4020ac1192849c1473fbca1bf58508ce6c882c4e91
5
5
  SHA512:
6
- metadata.gz: 229511c5b388840de246acec21ffb3051628a5fa54627745fa8806e766071078d38bc5c5087a15c0d78a1d163bdef4df49bb39f2c44521817c2105a7520ff7f2
7
- data.tar.gz: 6fa7d0ccde1636f9098cc0b472fb2dd166261607d2be17953cdc9df092d99aa5bffa03adefd123231a2dba6c9fb61e28737a24bdd0de7a9ffb2e7a6e013ff8cd
6
+ metadata.gz: 74731d7d000a1591b7046715a9118fd566a990c30900ddac2e6638a9799b8350f256a11a074e9e6b6eb2b3ed43911fb5785348bd0407644d2581450b4ab278be
7
+ data.tar.gz: 5a38f655057548ff77d21b738aee676adfa25ac6117647e45ad00d80d41a1dee52f5c59af5ef2d86f8096d431f7ff9552486bbd1f99ab0ec05372460569399db
@@ -22,9 +22,20 @@ $(document).on("ready turbolinks:load", function () {
22
22
  $("header ul.nav li").removeClass('active');
23
23
  menuItem.className += ' active';
24
24
  }
25
- if (typeof($.colorbox) === "function") {
25
+ if (typeof ($.colorbox) === "function") {
26
26
  $.colorbox.remove();
27
- $('a.symphonia-lightbox[data-lightbox="true"]').colorbox({rel: 'gallery', maxHeight: '80%', photo: true});
27
+ $('a.symphonia-lightbox[data-lightbox="true"]').colorbox({
28
+ rel: 'gallery',
29
+ maxHeight: '80%',
30
+ photo: true,
31
+ current: function (settings) {
32
+ if (settings.el.title.length > 0) {
33
+ } else {
34
+ return settings.el.dataset.current || "image {current} of {total}";
35
+ }
36
+ }
37
+
38
+ });
28
39
  }
29
40
  var images = document.getElementById("editable_images");
30
41
  if (images) {
@@ -108,7 +119,7 @@ Symphonia.filters = {
108
119
  window.location.search = '';
109
120
  }
110
121
  },
111
- removeRow: function(id) {
122
+ removeRow: function (id) {
112
123
  var el = document.getElementById(id);
113
124
  el.remove();
114
125
  }
@@ -134,7 +145,7 @@ SymphoniaCheckboxes = {
134
145
  toggler.dataset.checked = !isChecked;
135
146
  },
136
147
  toggle: function (input, isChecked) {
137
- if (typeof(isChecked) === "undefined")
148
+ if (typeof (isChecked) === "undefined")
138
149
  isChecked = input.checked;
139
150
 
140
151
  input.checked = !isChecked;
@@ -23,7 +23,7 @@ module Symphonia
23
23
  def render_flash_messages(flash_messages = nil)
24
24
  s = ''
25
25
  Array(flash_messages || flash).each do |type, message|
26
- s << content_tag(:div, class: "alert #{bootstrap_class_for(type)}") do
26
+ s << content_tag(:div, class: "d-print-none alert #{bootstrap_class_for(type)}") do
27
27
  content_tag(:button, '', class: 'fa fa-times-circle-o close', data: { dismiss: 'alert' }) + Array.wrap(message).collect { |m| fa_icon(type, text: m) }.join("<br>").html_safe
28
28
  end
29
29
  end
@@ -195,10 +195,10 @@ module Symphonia
195
195
 
196
196
  anchor = options.has_key?(:anchor) ? options.delete(:anchor) : 'page_header'
197
197
  label = options.delete(:label) || t("label_#{controller_name.singularize}_new")
198
- url = options.delete(:url) || new_polymorphic_path(controller_name.singularize, anchor: anchor)
199
- link = link_to(fa_icon('add', text: label), url, { class: 'btn btn-primary' }.merge(options))
198
+ model = controller.try(:model) || controller_name.singularize
199
+ url = options.delete(:url) || new_polymorphic_path(model, anchor: anchor)
200
200
 
201
- # content_tag(:div, link, class: 'contextual')
201
+ link_to(fa_icon('add', text: label), url, { class: 'btn btn-primary' }.merge(options))
202
202
  end
203
203
 
204
204
  # change the default link renderer for will_paginate
@@ -45,7 +45,8 @@ module Symphonia
45
45
  end
46
46
 
47
47
  def edit_link(entity)
48
- @_c.link_to(@_c.icon('edit', t(:button_edit)), @_c.edit_polymorphic_path(entity, back_url: @_c.polymorphic_path(@_c.controller_name, page: @_c.params[:page])))
48
+ model = @_c.controller.try(:model) || @_c.controller_name
49
+ @_c.link_to(@_c.icon('edit', t(:button_edit)), @_c.edit_polymorphic_path(entity, back_url: @_c.polymorphic_path(model, page: @_c.params[:page])))
49
50
  end
50
51
 
51
52
  def delete_link(entity)
@@ -134,6 +134,10 @@ module Symphonia
134
134
  def persistence_token
135
135
  nil
136
136
  end
137
+
138
+ def language
139
+ Symphonia.config.default_locale || I18n.default_locale
140
+ end
137
141
  end
138
142
 
139
143
  end
@@ -0,0 +1,5 @@
1
+ <%= title :"label_#{controller.model.name.underscore}" do %>
2
+ <%= link_to_new_entity %>
3
+ <% end %>
4
+ <%= render('symphonia/common/filters', remote: true) %>
5
+ <%= render_symphonia_table(@query) %>
@@ -34,7 +34,7 @@ module Symphonia
34
34
  end
35
35
 
36
36
  def new
37
- @entity ||= instance_variable_set(:"@#{model_name}", model.new)
37
+ @entity ||= instance_variable_set(:"@#{model_name}", model.new(params.fetch(model_name, {}).permit(safe_attributes)))
38
38
  end
39
39
 
40
40
  def edit
@@ -44,6 +44,7 @@ module Symphonia
44
44
  @entity ||= instance_variable_set(:"@#{model_name}", model.new(entity_params))
45
45
  respond_to do |format|
46
46
  if @entity.save
47
+ after_create
47
48
  format.html { redirect_back_or_default @entity, notice: t(:text_created) }
48
49
  format.json { render json: @entity, status: :created, location: @entity }
49
50
  else
@@ -56,6 +57,7 @@ module Symphonia
56
57
  def update
57
58
  respond_to do |format|
58
59
  if @entity.update(entity_params)
60
+ after_update
59
61
  format.html { redirect_back_or_default @entity, notice: t(:text_updated) }
60
62
  format.json { head :no_content }
61
63
  else
@@ -92,5 +94,13 @@ module Symphonia
92
94
  model.name.demodulize.underscore.to_sym
93
95
  end
94
96
 
97
+ def after_create
98
+
99
+ end
100
+
101
+ def after_update
102
+
103
+ end
104
+
95
105
  end
96
106
  end
@@ -5,7 +5,8 @@ module Symphonia
5
5
 
6
6
 
7
7
  included do
8
- class Unauthorized < Exception; end
8
+ class Unauthorized < Exception;
9
+ end
9
10
 
10
11
  before_action :current_user, :menu_item
11
12
  before_action :set_default_locale
@@ -73,8 +74,9 @@ module Symphonia
73
74
  # private
74
75
 
75
76
  def set_locale
76
- client_lang = params.fetch(:locale, nil).presence || session[:locale].presence || request.env['HTTP_ACCEPT_LANGUAGE'].to_s.split(',').collect { |l| l.scan(/^[a-z]{2}/) }.flatten
77
- @client_lang = Array(client_lang).detect { |l| I18n.available_locales.include?(l.to_sym) }
77
+ client_lang = Array(params.fetch(:locale, nil).presence || session[:locale].presence || request.env['HTTP_ACCEPT_LANGUAGE'].to_s.split(',').collect { |l| l.scan(/^[a-z]{2}/) }.flatten)
78
+ client_lang.unshift current_user.language if current_user.language
79
+ @client_lang = client_lang.detect { |l| I18n.available_locales.include?(l.to_sym) }
78
80
 
79
81
  I18n.locale = (@client_lang || I18n.default_locale)
80
82
  session[:locale] = I18n.locale
@@ -97,9 +99,8 @@ module Symphonia
97
99
  store_location
98
100
  redirect_to symphonia.login_path, flash: { error: t(:text_login_require) }
99
101
  end
100
- format.json do
101
- render json: { errors: 'You must be logged in to access this endpoint' }, status: 403
102
- end
102
+ format.json { render json: { errors: 'You must be logged in to access this endpoint' }, status: 401 }
103
+ format.any { head 401 }
103
104
  end
104
105
  return false
105
106
  end
@@ -111,6 +112,7 @@ module Symphonia
111
112
 
112
113
  def admin_require
113
114
  return unless login_require
115
+
114
116
  unless current_user.admin?
115
117
  render_403
116
118
  return false
@@ -18,7 +18,11 @@ module Symphonia
18
18
  end
19
19
 
20
20
  def value=(q)
21
- @value = Array(q)
21
+ @value = if q.is_a?(Array)
22
+ q
23
+ else
24
+ q.to_s.split("|")
25
+ end
22
26
  end
23
27
 
24
28
  def operator=(o)
@@ -28,7 +32,7 @@ module Symphonia
28
32
  end
29
33
 
30
34
  def apply(scope)
31
- super
35
+ Rails.logger.debug("Apply filter #{name} '#{operator}' #{value}")
32
36
  t = scope.arel_table
33
37
  scope.where(t[name].send(operator, value))
34
38
  end
@@ -5,7 +5,7 @@ module Symphonia
5
5
  def apply(scope)
6
6
  super
7
7
  t = scope.arel_table
8
- scope.where(t[name].lower.send(operator, Array(value).map(&:downcase)))
8
+ scope.where(t[name].lower.send(operator, value&.downcase))
9
9
  end
10
10
 
11
11
  def form_field(_c)
@@ -15,7 +15,7 @@ module Symphonia
15
15
  validates :login, :mail, :first_name, :last_name, presence: true
16
16
 
17
17
  def self.current=(entity)
18
- Rails.logger.info("* #{entity.class.name}: #{entity.login} id: #{entity.id}")
18
+ Rails.logger.info("* #{entity.class.name}: #{entity.login} id: #{entity.id}") if entity
19
19
  Thread.current[:"current_#{name.underscore}"] = entity
20
20
  end
21
21
 
@@ -1,3 +1,3 @@
1
1
  module Symphonia
2
- VERSION = '2.1.8'
2
+ VERSION = '2.2.1'
3
3
  end
@@ -0,0 +1,29 @@
1
+ RSpec.describe Symphonia::ModelFilters::Base do
2
+ let(:query) { Symphonia::User.query.new }
3
+ let!(:user) { FactoryBot.create :user, email: "sample@dummy.cz", status: "active" }
4
+
5
+ describe "string" do
6
+ subject { Symphonia::ModelFilters::StringFilter.new attribute, query }
7
+
8
+ let(:attribute) { Symphonia::User.registered_attributes[:email] }
9
+ it "simple filter" do
10
+ subject.value = "~sample@dummy.cz"
11
+ expect(subject.apply(Symphonia::User.all).count).to eq 1
12
+ end
13
+
14
+ end
15
+
16
+ describe "status" do
17
+ let(:attribute) { Symphonia::User.registered_attributes[:status] }
18
+ subject { Symphonia::ModelFilters::SelectFilter.new attribute, query }
19
+
20
+ it "simple filter" do
21
+ subject.value = "1"
22
+ expect(subject.apply(Symphonia::User.all).count).to eq 1
23
+ end
24
+ it "array filter" do
25
+ subject.value = "1|2|3"
26
+ expect(subject.apply(Symphonia::User.all).count).to eq 1
27
+ end
28
+ end
29
+ end
data/spec/spec_helper.rb CHANGED
@@ -51,6 +51,7 @@ RSpec.configure do |config|
51
51
  config.before(:each) do
52
52
  DatabaseCleaner.strategy = :transaction
53
53
  Rails.application.config.action_mailer.delivery_method = :test
54
+ Symphonia::User.current = nil
54
55
  end
55
56
 
56
57
  config.before(:each, type: :feature) do
@@ -10,7 +10,7 @@ RSpec.shared_examples 'a controller actions' do |factory|
10
10
 
11
11
  it '#destroy' do
12
12
  entity # touch
13
- expect { delete :destroy, params: { id: entity } }.to change(subject, :count).by(-1)
13
+ expect { delete :destroy, params: { id: entity } }.to change(entity.class, :count).by(-1)
14
14
  end
15
15
 
16
16
  context 'json' do
@@ -24,7 +24,7 @@ RSpec.shared_examples 'a controller actions' do |factory|
24
24
  it '#show' do
25
25
  get :show, params: {id: entity, format: 'json'}
26
26
  expect(response).to have_http_status(:success)
27
- expect(response.body).to include %Q{"id":#{entity.id}}
27
+ expect(response.body).to include "id", entity.id.to_s
28
28
  end
29
29
  end
30
30
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: symphonia
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.8
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lukas Pokorny
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-03 00:00:00.000000000 Z
11
+ date: 2019-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -524,6 +524,7 @@ files:
524
524
  - app/views/symphonia/accounts/update.js.erb
525
525
  - app/views/symphonia/admin/index.html.erb
526
526
  - app/views/symphonia/attachments/destroy.js.erb
527
+ - app/views/symphonia/base/index.html.erb
527
528
  - app/views/symphonia/common/_editable_images_grid.html.erb
528
529
  - app/views/symphonia/common/_filters.html.erb
529
530
  - app/views/symphonia/common/_locale_chooser.html.erb
@@ -619,6 +620,7 @@ files:
619
620
  - spec/mailers/symphonia/notifier_spec.rb
620
621
  - spec/models/attachment_spec.rb
621
622
  - spec/models/query/attribute_spec.rb
623
+ - spec/models/query/filters_spec.rb
622
624
  - spec/models/query/symphonia_query_spec.rb
623
625
  - spec/models/role_spec.rb
624
626
  - spec/models/user_spec.rb
@@ -657,8 +659,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
657
659
  - !ruby/object:Gem::Version
658
660
  version: '0'
659
661
  requirements: []
660
- rubyforge_project:
661
- rubygems_version: 2.7.6
662
+ rubygems_version: 3.0.4
662
663
  signing_key:
663
664
  specification_version: 4
664
665
  summary: My administration
@@ -670,6 +671,7 @@ test_files:
670
671
  - spec/models/attachment_spec.rb
671
672
  - spec/models/query/attribute_spec.rb
672
673
  - spec/models/query/symphonia_query_spec.rb
674
+ - spec/models/query/filters_spec.rb
673
675
  - spec/models/user_spec.rb
674
676
  - spec/models/role_spec.rb
675
677
  - spec/requests/roles_spec.rb