Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions app/assets/javascripts/spree/backend/collections/answers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//= require spree/backend/models/answer

Spree.Collections.Answers = Backbone.Collection.extend({
model: Spree.Models.Answer,

url: function() {
return this.parent.url() + '/answers';
}
});
5 changes: 5 additions & 0 deletions app/assets/javascripts/spree/backend/collections/questions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
//= require spree/backend/models/question

Spree.Collections.Questions = Backbone.Collection.extend({
model: Spree.Models.Question
})
6 changes: 6 additions & 0 deletions app/assets/javascripts/spree/backend/models/answer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Spree.Models.Answer = Backbone.Model.extend({
paramRoot: 'answer',
urlRoot: function() {
return Spree.pathFor('api/questions/' + this.get('question_id') + '/answers');
}
});
19 changes: 19 additions & 0 deletions app/assets/javascripts/spree/backend/models/question.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//=require spree/backend/collections/answers

Spree.Models.Question = Backbone.Model.extend({
urlRoot: Spree.pathFor('api/questions'),

relations: {
'answers': Spree.Collections.Answers
}
});

Spree.Models.Question.fetch = function(id, opts) {
const options = (opts || {});
const model = new Spree.Models.Question({
id: id,
answers: []
});
model.fetch(options);
return model;
}
15 changes: 15 additions & 0 deletions app/assets/javascripts/spree/backend/questions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//= require spree/backend/models/question
//= require spree/backend/views/questions/modal-content

Spree.ready(function() {
if ($('.question-modal-content').length) {
$('.question-modal-content').each(function() {
var el = $(this);
var model = new Spree.Models.Question.fetch(el.data('question_id'));
new Spree.Views.Questions.ModalContent({
el: el,
model: model
});
});
}
});
4 changes: 3 additions & 1 deletion app/assets/javascripts/spree/backend/solidus_marketplace.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@
// Shipments AJAX API

//= require spree/backend/solidus_marketplace_routes
//= require spree/backend/suppliers_autocomplete
//= require spree/backend/suppliers_autocomplete
//= require spree/backend/solidus_marketplace_namespaces
//= require spree/backend/questions
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
_.extend(window.Spree.Views, {
Questions: {},
Answers: {}
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<div class='alert alert-secondary'>
{{answer.answer_text}}
<p class='font-italic'>{{answer.user.email}} - {{answer.created_at}}</p>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<input class='answer-input' />
<button class='btn btn-primary submit'>{{ t 'create' }}</button>
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<div class='answers'>
</div>
<div class='new-answer'>
</div>
15 changes: 15 additions & 0 deletions app/assets/javascripts/spree/backend/views/answers/answer-item.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//= require spree/backend/templates/answers/answer-item

Spree.Views.Answers.AnswerItem = Backbone.View.extend({
initialize: function(options) {
this.listenTo(this.model, 'change', this.render);
},

template: HandlebarsTemplates['answers/answer-item'],

render: function() {
this.$el.html(this.template({
answer: this.model.toJSON()
}));
}
});
21 changes: 21 additions & 0 deletions app/assets/javascripts/spree/backend/views/answers/answer-list.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//= require spree/backend/views/answers/answer-item

Spree.Views.Answers.AnswerList = Backbone.View.extend({
initialize: function() {
this.listenTo(this.collection, 'add', this.add);
this.listenTo(this.collection, 'reset', this.reset);
},

add: function(answer) {
var view = new Spree.Views.Answers.AnswerItem({model: answer});
view.render();
this.$el.append(view.el);
},

reset: function() {
const add = this.add;
this.collection.each(function(answer) {
add(answer)
})
}
});
41 changes: 41 additions & 0 deletions app/assets/javascripts/spree/backend/views/answers/new.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//= require spree/backend/templates/answers/new
//= require spree/backend/models/answer

Spree.Views.Answers.New = Backbone.View.extend({
initialize: function() {
this.listenTo(this.collection, 'update', this.render)
this.render();
},

template: HandlebarsTemplates['answers/new'],

events: {
'click .submit': 'onSubmit'
},

onSubmit: function(e) {
e.preventDefault();
const input = $('.answer-input')
const options = {
success: this.onSuccess.bind(this),
error: this.onError.bind(this)
};
this.collection.create({
answer_text: input.val(),
question_id: this.collection.parent.id
}, options)
input.val('');
},

onSuccess: function() {
show_flash("success", Spree.translations.created_successfully);
},

onError: function(model, response, options) {
show_flash("error", response.responseText);
},

render: function() {
this.$el.html(this.template());
}
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//= require spree/backend/templates/questions/modal-content
//= require spree/backend/views/answers/new
//= require spree/backend/views/answers/answer-list

Spree.Views.Questions.ModalContent = Backbone.View.extend({
initialize: function(options){
this.render();
},
template: HandlebarsTemplates['questions/modal-content'],

render: function() {
this.$el.html(this.template());
const collection = this.model.get('answers');

new Spree.Views.Answers.AnswerList({
el: $('.answers'),
parent: this.model,
collection: collection
});
new Spree.Views.Answers.New({
el: $('.new-answer'),
collection: collection
});
}
});
8 changes: 8 additions & 0 deletions app/controllers/solidus_marketplace/api_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# frozen_string_literal: true

module SolidusMarketplace
class ApiController < ::Spree::Api::ResourceController
helper SolidusMarketplace::ApiHelpers
end
end

This file was deleted.

7 changes: 7 additions & 0 deletions app/helpers/solidus_marketplace/api_helpers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

module SolidusMarketplace
module ApiHelpers
include SolidusMarketplace::PermittedAttributes
end
end
8 changes: 8 additions & 0 deletions app/models/spree/answer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# frozen_string_literal: true

module Spree
class Answer < Spree::Base
belongs_to :question, class_name: 'Spree::Question'
belongs_to :user, class_name: Spree::UserClassHandle.new
end
end
22 changes: 22 additions & 0 deletions app/models/spree/permission_sets/supplier/question_ability.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# frozen_string_literal: true

require 'cancan'

module Spree
module PermissionSets
module Supplier
class QuestionAbility < PermissionSets::Base
def activate!
can :manage, Spree::Question, supplier_id: user.supplier_id
can :manage, Spree::Answer, question_id: question_ids
end

private

def question_ids
user.supplier.questions.pluck(:id)
end
end
end
end
end
10 changes: 10 additions & 0 deletions app/models/spree/question.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# frozen_string_literal: true

module Spree
class Question < Spree::Base
has_many :answers, dependent: :destroy
belongs_to :created_by, class_name: Spree::UserClassHandle.new
belongs_to :supplier, class_name: 'Spree::Supplier'
belongs_to :product, class_name: 'Spree::Product', optional: true
end
end
1 change: 1 addition & 0 deletions app/models/spree/supplier.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class Supplier < Spree::Base
has_many :stock_locations, dependent: :destroy
has_many :shipments, through: :stock_locations
has_many :admins, class_name: Spree.user_class.to_s
has_many :questions, class_name: 'Spree::Question'
accepts_nested_attributes_for :admins

validates :commission_flat_rate, presence: true
Expand Down
3 changes: 3 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,3 +128,6 @@ en:
user_admin: Admin User
remove_payment_method: Remove payment method
add_payment_method: Add payment method
questions:
title: Questions
reply: Reply
3 changes: 3 additions & 0 deletions config/locales/es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,6 @@ es:
user_admin: Usuario administrador
remove_payment_method: Remover método de pago
add_payment_method: Agregar método de pago
questions:
title: Preguntas
reply: Contestar
7 changes: 6 additions & 1 deletion config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,14 @@
put :addcard
end
end

resources :questions, only: %i[index]
end

namespace :api do
namespace :api, defaults: { format: :json } do
resources :suppliers, only: :index
resources :questions do
resources :answers
end
end
end
13 changes: 13 additions & 0 deletions db/migrate/20200925013627_create_questions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
class CreateQuestions < ActiveRecord::Migration[5.2]
def change
create_table :spree_questions do |t|
t.text :question_text
t.integer :created_by_id
t.integer :supplier_id
t.integer :product_id
t.boolean :published, default: false
t.boolean :resolved, default: false
t.timestamps
end
end
end
10 changes: 10 additions & 0 deletions db/migrate/20200925013705_create_answers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class CreateAnswers < ActiveRecord::Migration[5.2]
def change
create_table :spree_answers do |t|
t.text :answer_text
t.integer :question_id
t.integer :user_id
t.timestamps
end
end
end
19 changes: 19 additions & 0 deletions lib/controllers/api/spree/api/answers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# frozen_string_literal: true

module Spree
module Api
class AnswersController < ::SolidusMarketplace::ApiController
before_action :normalize_params, only: %i[create]

private

def permitted_answer_attributes
permitted_attributes.answer_attributes
end

def normalize_params
params[:answer][:user_id] = current_api_user.id
end
end
end
end
13 changes: 13 additions & 0 deletions lib/controllers/api/spree/api/questions_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

module Spree
module Api
class QuestionsController < ::SolidusMarketplace::ApiController
private

def permitted_question_attributes
permitted_attributes.question_attributes
end
end
end
end
16 changes: 16 additions & 0 deletions lib/controllers/backend/spree/admin/questions_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# frozen_string_literal: true

module Spree
module Admin
class QuestionsController < BaseController
def index
params[:q] ||= {}
@search = Spree::Question.accessible_by(current_ability, :index)
.ransack(params[:q])
@questions = @search.result
.page(params[:page])
.per(params[:per_page] || Spree::Config[:orders_per_page])
end
end
end
end
Loading