templates/template/view.html.twig line 1
{% extends 'base.html.twig' %}
{% block body %}
<div id="view" class="container">{{ html|default(template.data["html"])|raw }} </div>
<script>
$(document).ready(function () {
let elements =$("#view *")
elements.removeAllClassStartBy("has-")
elements.removeAllClassStartBy("ui-drag")
elements.removeClass("updatable updating")
.attr("contenteditable", false)
.attr("readonly",false)
setupOptions()
setupConditions()
setupForm()
setupValues()
setupButtons()
})
let conditions={}
function setupOptions() {
let optionsTemplate = $({{ (template.data["options"]|default([])) | json_encode | raw }})
optionsTemplate.each(function () {
let res =$(this).find(".options").html().split("%%")
let id =$(this).attr("id")
let element = $("*[cid="+id+"]")
if(res.length === 3){
doAction( res[0],element,true)
element.addClass(res[1])
}
})
}
function setupConditions(){
let conditionsTemplate = $({{ (template.data["conditions"]|default([])) | json_encode | raw }})
let formatedConditions = {{ formatedConditions|default([]) | json_encode | raw }}
conditionsTemplate.each(function () {
let id =$(this).attr("id")
let element = $("*[cid="+id+"]")
let conds= $(this).find(".conds")
conds.each(function () {
let res =$(this).html().split("%%")
if(res.length === 5){
if(res[1] !== "entity"){
if(conditions[id]===undefined){
conditions[id]=[]
}
if(conditions[id][res[1]]===undefined){
conditions[id][res[1]]=[]
}
element.addClass("condition-"+res[1])
let cond = $("#view #"+res[1])
cond.addClass("update-conditions")
cond.on("input", updateConditions)
conditions[id][res[1]].push({
action:res[0],
cond:res[3],
value:res[4],
})
}
else {
if(formatedConditions[res[2]+res[3]+res[4]] ===true){
doAction(res[0], element, true)
}
}
}
})
})
$(".update-conditions").trigger("input")
}
function setupForm() {
let view =$("#view")
if(view.find("input, select, textarea").length===0)
return
view.wrap("<form id='form-view' method='post'></form>")
if(view.find("button[type=submit]").length>0)
return;
view.append("<button class='btn btn-success' type='submit'>Valider</button>")
let form =view.parents("#form-view")
form.on("submit", function (e) {
e.preventDefault()
$.ajax({
method:"post",
data: form.serializeArray(),
success:function () {
notify("Parcours", "Le Parcours <i>"+$("#template_titre").val()+"</i> a été enregistré")
}
})
return false
})
}
function setupValues() {
let view =$("#view")
let savedData ={{ (savedData|default([])) | json_encode | raw }};
for (const [key, value] of Object.entries(savedData)) {
view.find("#"+key).val(value)
}
}
function setupButtons() {
let buttons = $("#view button[type=button]")
buttons.each(function () {
let act = $(this).attr("action")??""
if(act!==""){
$(this).click(doActionButton)
}
})
}
function doActionButton(event) {
let method =$(event.currentTarget).attr("action")
let url = "{{ path('app_template_action')}}"
if(method.includes("::")){
$.ajax({
url:url,
data:{
"method":method,
"id":{{ mainId|default(0) }}
},
method:"post",
success: function(response, textStatus, xhr) {
let contentType = xhr.getResponseHeader('content-type') || '';
if (contentType.indexOf('json') > -1) {
// Response is JSON
if(response.url!==undefined)
window.location.href= response.url
else
notify("action", "action a été effectué")
} else if (contentType.indexOf('html') > -1) {
// Response is HTML
$("#view").html(response.find("#view").html())
} else {
// Unknown response type
}
}
})
}
else {
switch (method){
case "close":
history.back();
break;
}
}
}
function updateConditions(e){
let id= $(e.target).attr("id")
let val= $(e.target).val()
let elements =$(".condition-"+id)
elements.each(function () {
let cid = $(this).attr("cid")
if(conditions[cid][id]!==undefined)
testConditions(conditions[cid][id], val, $(this))
})
}
function testConditions(conditions, val, el) {
let repartition={}
for(const cond of Object.values(conditions)){
if(repartition[cond["action"]]===undefined)
repartition[cond["action"]] =[]
repartition[cond["action"]].push(cond)
}
for(const [action, conds] of Object.entries(repartition)){
let bool = false;
for(const cond of Object.values(conds)){
if(checkValue(cond, val)){
bool=true;
break;
}
}
doAction((bool?"":"!")+action, el)
}
return false
}
function checkValue(cond, val) {
switch (cond["cond"]){
case "=":
return val === cond["value"]
case ">":
return val > cond["value"]
case ">=":
return val >= cond["value"]
case "<":
return val < cond["value"]
case "<=":
return val <= cond["value"]
case "start":
return val.startsWith(cond["value"])
case "end":
return val.endsWith(cond["value"])
case "cont":
return val.includes(cond["value"])
case "in":
return cond["value"].split(",").includes(val)
}
}
function doAction(action, el, setup=false) {
switch (action){
case "show":
case "!hide":
if(setup)
el.show()
else
el.slideDown()
break
case "hide":
case "!show":
if(setup)
el.hide()
else
el.slideUp()
break
case "readOnly":
el.prop("readonly", true)
break
case "!readOnly":
el.prop("readonly", false)
break
case "disabled":
case "!disabled":
el.find("input, select, textare").prop("disabled", action==="disabled")
break
}
}
</script>
{% endblock %}
{% block title %}
{{ template.titre }}
{% endblock %}