QuestionsAnswersEntity.java

package sk.iway.iwcm.components.qa.jpa;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;

import lombok.Getter;
import lombok.Setter;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.system.adminlog.EntityListenersType;
import sk.iway.iwcm.system.datatable.DataTableColumnType;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumn;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditor;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditorAttr;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnNested;
import sk.iway.iwcm.system.jpa.AllowSafeHtmlAttributeConverter;

@Entity
@Table(name = "questions_answers")
@Getter
@Setter
@EntityListeners(sk.iway.iwcm.system.adminlog.AuditEntityListener.class)
@EntityListenersType(sk.iway.iwcm.Adminlog.TYPE_QA_UPDATE)
public class QuestionsAnswersEntity implements Serializable{

	private static final long serialVersionUID = -1805144846544468397L;

    @Id
    @Column(name = "qa_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "S_questions_answers")
    @DataTableColumn(inputType = DataTableColumnType.ID, title="ID", tab="basic")
    private Long id;

	@Column(name = "question")
	@NotBlank
    @DataTableColumn(
        inputType = DataTableColumnType.OPEN_EDITOR,
        title="[[#{qa.form.question}]]",
		editor = {
            @DataTableColumnEditor(type = "quill")
        },
		tab = "answer"
    )
	@javax.persistence.Convert(converter = AllowSafeHtmlAttributeConverter.class)
    private String question;


	//Autocomplete field
	@Column(name = "group_name")
    @DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="[[#{qa.roots}]]",
		tab = "basic",
		editor = {
			@DataTableColumnEditor(attr = {
				@DataTableColumnEditorAttr(key = "data-ac-url", value = "/admin/rest/qa/autocomplete"),
				@DataTableColumnEditorAttr(key = "data-ac-select", value = "true")
			})
		}
    )
	private String groupName;

	@Column(name = "category_name")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="[[#{qa.form.categoryName}]]",
		tab = "basic"
    )
	private String categoryName;

	@Column(name = "from_name")
	@NotBlank
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="[[#{qa.form.fromName}]]",
		tab = "basic"
    )
	private String fromName;

	@Column(name = "from_company")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="[[#{components.qa.ask.your_company}]]",
		visible = false,
		tab = "basic"
    )
	private String fromCompany;

	@Column(name = "from_phone")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="[[#{components.qa.ask.your_phone}]]",
		visible = false,
		tab = "basic"
    )
	private String fromPhone;

	@Column(name = "from_email")
	@NotBlank
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="[[#{qa.form.fromEmail}]]",
		visible = false,
		tab = "basic"
    )
	private String fromEmail;



	@Column(name = "to_name")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="[[#{qa.form.toName}]]",
		visible = false,
		tab = "answer"
    )
	private String toName;

	@Column(name = "to_email")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="[[#{qa.form.toEmail}]]",
		visible = false,
		tab = "answer"
    )
	private String toEmail;

	@Column(name = "answer_to_email")
	@DataTableColumn(
        inputType = DataTableColumnType.QUILL,
        title="[[#{qa.form.answer}]]",
		tab = "answer"
    )
	@javax.persistence.Convert(converter = AllowSafeHtmlAttributeConverter.class)
	private String answerToEmail;

	@Column(name = "allow_publish_on_web")
	@DataTableColumn(
		title = "components.qa.allowPublishOnWeb",
        inputType = DataTableColumnType.BOOLEAN,
		visible = false,
		tab = "answer"
    )
	private Boolean allowPublishOnWeb;

	@Column(name = "publish_on_web")
	@DataTableColumn(
        inputType = DataTableColumnType.BOOLEAN,
        title="[[#{qa.form.publishOnWeb}]]",
		visible = false,
		tab = "answer"
    )
	private Boolean publishOnWeb;

    @Column(name = "answer")
    @DataTableColumn(
        inputType = DataTableColumnType.QUILL,
        title="[[#{qa.form.answerWeb}]]",
		tab = "answer"
    )
	@javax.persistence.Convert(converter = AllowSafeHtmlAttributeConverter.class)
    private String answer;

	@Column(name = "question_date")
	@Temporal(TemporalType.TIMESTAMP)
	@DataTableColumn(
        inputType = DataTableColumnType.DATETIME,
        title="[[#{qa.date}]]",
		hiddenEditor = true
    )
	private Date questionDate;

	//Column hold boolean information if answer for question is already add
	@Transient
	@DataTableColumn(
        inputType = DataTableColumnType.BOOLEAN,
        title="[[#{components.qa.answer.exist}]]",
		hiddenEditor = true
    )
	private Boolean answerCheck;

	@Column(name = "sort_priority")
	@DataTableColumn(
        inputType = DataTableColumnType.NUMBER,
		title="[[#{qa.form.sortPriority}]]",
		visible = false,
		tab = "basic"
    )
	private Integer sortPriority;


	/*Hidden unused fields*/

	@Column(name = "answer_date")
	@Temporal(TemporalType.TIMESTAMP)
	@DataTableColumn(
        inputType = DataTableColumnType.DATETIME,
		hidden = true,
		hiddenEditor = true
    )
	private Date answerDate;

	@Column(name = "hash")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
		hidden = true,
		hiddenEditor = true
    )
	private String hash;

	@Column(name = "field_a")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
		title = "components.qa.field_a",
		visible = false,
		tab = "fields"
    )
	private String fieldA;

	@Column(name = "field_b")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
		title = "components.qa.field_b",
		visible = false,
		tab = "fields"
    )
	private String fieldB;

	@Column(name = "field_c")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
		title = "components.qa.field_c",
		visible = false,
		tab = "fields"
    )
	private String fieldC;

	@Column(name = "field_d")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
		title = "components.qa.field_d",
		visible = false,
		tab = "fields"
    )
	private String fieldD;

	@Column(name = "domain_id")
	@DataTableColumn(
        inputType = DataTableColumnType.HIDDEN,
		tab="basic"
    )
	private Integer domainId;

	@Transient
    @DataTableColumnNested
	private transient QuestionsAnswersEditorFields editorFields = null;

	public Boolean getAnswerCheck() {
		return isAnswerCheck();
	}

	public Boolean isAnswerCheck() {
		if (Tools.isNotEmpty(getAnswer()) || Tools.isNotEmpty(getAnswerToEmail()) || Boolean.TRUE.equals(publishOnWeb) || getAnswerDate() != null) {
			return Boolean.TRUE;
		}
		return Boolean.FALSE;
	}
}