templates/template/view.html.twig line 1

  1. {% extends 'base.html.twig' %}
  2. {% block body %}
  3.     <div id="view" class="container">{{ html|default(template.data["html"])|raw }} </div>
  4.     <script>
  5.         $(document).ready(function () {
  6.             let elements =$("#view *")
  7.             elements.removeAllClassStartBy("has-")
  8.             elements.removeAllClassStartBy("ui-drag")
  9.             elements.removeClass("updatable updating")
  10.                 .attr("contenteditable", false)
  11.                 .attr("readonly",false)
  12.             setupOptions()
  13.             setupConditions()
  14.             setupForm()
  15.             setupValues()
  16.             setupButtons()
  17.         })
  18.         let conditions={}
  19.         function setupOptions() {
  20.             let optionsTemplate = $({{ (template.data["options"]|default([]))  | json_encode | raw  }})
  21.             optionsTemplate.each(function () {
  22.                 let res =$(this).find(".options").html().split("%%")
  23.                 let id =$(this).attr("id")
  24.                 let element = $("*[cid="+id+"]")
  25.                 if(res.length === 3){
  26.                     doAction( res[0],element,true)
  27.                     element.addClass(res[1])
  28.                 }
  29.             })
  30.         }
  31.         function setupConditions(){
  32.             let conditionsTemplate = $({{ (template.data["conditions"]|default([]))  | json_encode | raw  }})
  33.             let formatedConditions = {{ formatedConditions|default([])  | json_encode | raw  }}
  34.             conditionsTemplate.each(function () {
  35.                 let id =$(this).attr("id")
  36.                 let element = $("*[cid="+id+"]")
  37.                 let conds= $(this).find(".conds")
  38.                 conds.each(function () {
  39.                     let res =$(this).html().split("%%")
  40.                     if(res.length === 5){
  41.                         if(res[1] !== "entity"){
  42.                             if(conditions[id]===undefined){
  43.                                 conditions[id]=[]
  44.                             }
  45.                             if(conditions[id][res[1]]===undefined){
  46.                                 conditions[id][res[1]]=[]
  47.                             }
  48.                             element.addClass("condition-"+res[1])
  49.                             let cond = $("#view #"+res[1])
  50.                             cond.addClass("update-conditions")
  51.                             cond.on("input", updateConditions)
  52.                             conditions[id][res[1]].push({
  53.                                 action:res[0],
  54.                                 cond:res[3],
  55.                                 value:res[4],
  56.                             })
  57.                         }
  58.                         else {
  59.                             if(formatedConditions[res[2]+res[3]+res[4]] ===true){
  60.                                 doAction(res[0], element, true)
  61.                             }
  62.                         }
  63.                     }
  64.                 })
  65.             })
  66.             $(".update-conditions").trigger("input")
  67.         }
  68.         function setupForm() {
  69.             let view =$("#view")
  70.             if(view.find("input, select, textarea").length===0)
  71.                 return
  72.             view.wrap("<form id='form-view' method='post'></form>")
  73.             if(view.find("button[type=submit]").length>0)
  74.                 return;
  75.             view.append("<button class='btn btn-success' type='submit'>Valider</button>")
  76.             let form =view.parents("#form-view")
  77.             form.on("submit", function (e) {
  78.                 e.preventDefault()
  79.                 $.ajax({
  80.                     method:"post",
  81.                     data: form.serializeArray(),
  82.                     success:function () {
  83.                         notify("Parcours", "Le Parcours <i>"+$("#template_titre").val()+"</i> a été enregistré")
  84.                     }
  85.                 })
  86.                 return false
  87.             })
  88.         }
  89.         function setupValues() {
  90.             let view =$("#view")
  91.             let savedData ={{ (savedData|default([]))  | json_encode | raw  }};
  92.             for (const [key, value] of Object.entries(savedData)) {
  93.                 view.find("#"+key).val(value)
  94.             }
  95.         }
  96.         function setupButtons() {
  97.             let buttons = $("#view button[type=button]")
  98.             buttons.each(function () {
  99.                 let act = $(this).attr("action")??""
  100.                 if(act!==""){
  101.                     $(this).click(doActionButton)
  102.                 }
  103.             })
  104.         }
  105.         function doActionButton(event) {
  106.             let method =$(event.currentTarget).attr("action")
  107.             let url = "{{ path('app_template_action')}}"
  108.             if(method.includes("::")){
  109.                 $.ajax({
  110.                     url:url,
  111.                     data:{
  112.                         "method":method,
  113.                         "id":{{ mainId|default(0) }}
  114.                     },
  115.                     method:"post",
  116.                     success: function(response, textStatus, xhr) {
  117.                         let contentType = xhr.getResponseHeader('content-type') || '';
  118.                         if (contentType.indexOf('json') > -1) {
  119.                             // Response is JSON
  120.                             if(response.url!==undefined)
  121.                                 window.location.href= response.url
  122.                             else
  123.                                 notify("action", "action a été effectué")
  124.                         } else if (contentType.indexOf('html') > -1) {
  125.                             // Response is HTML
  126.                             $("#view").html(response.find("#view").html())
  127.                         } else {
  128.                             // Unknown response type
  129.                         }
  130.                     }
  131.                 })
  132.             }
  133.             else {
  134.                 switch (method){
  135.                     case "close":
  136.                         history.back();
  137.                         break;
  138.                 }
  139.             }
  140.         }
  141.         function updateConditions(e){
  142.             let id= $(e.target).attr("id")
  143.             let val= $(e.target).val()
  144.             let elements =$(".condition-"+id)
  145.             elements.each(function () {
  146.                 let cid = $(this).attr("cid")
  147.                 if(conditions[cid][id]!==undefined)
  148.                     testConditions(conditions[cid][id], val, $(this))
  149.             })
  150.         }
  151.         function testConditions(conditions, val, el) {
  152.             let repartition={}
  153.             for(const cond of Object.values(conditions)){
  154.                 if(repartition[cond["action"]]===undefined)
  155.                     repartition[cond["action"]] =[]
  156.                 repartition[cond["action"]].push(cond)
  157.             }
  158.             for(const [action, conds] of Object.entries(repartition)){
  159.                 let bool = false;
  160.                 for(const cond of Object.values(conds)){
  161.                     if(checkValue(cond, val)){
  162.                         bool=true;
  163.                         break;
  164.                     }
  165.                 }
  166.                 doAction((bool?"":"!")+action, el)
  167.             }
  168.             return false
  169.         }
  170.         function checkValue(cond, val) {
  171.             switch (cond["cond"]){
  172.                 case "=":
  173.                     return val === cond["value"]
  174.                 case ">":
  175.                     return val > cond["value"]
  176.                 case ">=":
  177.                     return val >= cond["value"]
  178.                 case "<":
  179.                     return val < cond["value"]
  180.                 case "<=":
  181.                     return val <= cond["value"]
  182.                 case "start":
  183.                     return val.startsWith(cond["value"])
  184.                 case "end":
  185.                     return val.endsWith(cond["value"])
  186.                 case "cont":
  187.                     return val.includes(cond["value"])
  188.                 case "in":
  189.                     return cond["value"].split(",").includes(val)
  190.             }
  191.         }
  192.         function doAction(action, el, setup=false) {
  193.             switch (action){
  194.                 case "show":
  195.                 case "!hide":
  196.                     if(setup)
  197.                         el.show()
  198.                     else
  199.                         el.slideDown()
  200.                     break
  201.                 case "hide":
  202.                 case "!show":
  203.                     if(setup)
  204.                         el.hide()
  205.                     else
  206.                         el.slideUp()
  207.                     break
  208.                 case "readOnly":
  209.                     el.prop("readonly", true)
  210.                     break
  211.                 case "!readOnly":
  212.                     el.prop("readonly", false)
  213.                     break
  214.                 case "disabled":
  215.                 case "!disabled":
  216.                     el.find("input, select, textare").prop("disabled", action==="disabled")
  217.                     break
  218.             }
  219.         }
  220.     </script>
  221. {% endblock %}
  222. {% block title %}
  223. {{ template.titre }}
  224. {% endblock %}