PageSourceSearch

https://www.ellye.fr/s/tags.js?7b59c969

js ellye.fr collected 2026-10-06 08:09:10 UTC 403,128 bytes, 3 lines download raw bytes

1riot.tag2("block-values",'<div class="list header"> <div> <ui-search data="{args}" onchange="{search}"></ui-search> <button class="ui {disabled: !data.p && !data.q} icon button" onclick="{reset}"> <i class="undo icon"></i> </button> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" link="#" onlink="{click}"></ui-list-table>',"","",function(opts){this.args={},this.data={p:null},this.on("mount",function(){this.load()}),this.load=function(){this.request({method:"GET",url:"/n/block/"+opts.block+"/values",data:this.data,success:function(res){this.cols=[{id:1,type:"text",name:this.name||"Désignation",config:{title:!0}}],this.rows=res.options.map(function(row){return{id:row.id,name:row.name,data:{1:[{text:row.name}]}}}),this.args={layout:1,search:this.data.q},this.update()}})}.bind(this),this.search=function(text){this.name=null,this.data.p=null,this.data.q=text||void 0,this.load()}.bind(this),this.reset=function(){this.name=null,this.data.p=null,this.data.q=void 0,this.update(),this.load()}.bind(this),this.click=function(row,block,e){e.preventDefault(),this.name=row.name,this.data.p=row.id,this.data.q=void 0,this.update(),this.load()}.bind(this)}),riot.tag2("cart-add",'<div if="{!sale && !gone}" class="ui active centered inline loader"></div> <div if="{sale}"> <div class="price">{sale.price.toFixed(2)} €</div> <div class="quantity"> Quantité : <select ref="quantity"> <option each="{n in range}" riot-value="{n}">{n}</option> </select> </div> <button ref="add" class="ui primary button" onclick="{add}"> Ajouter au panier </button> <div class="ui flowing popup hidden"> <div class="content"> <i class="huge green checkmark icon"></i> <p>Cet article a bien été ajouté au panier</p> <a if="{cart}" class="ui button" href="{cart.url}"> Voir le panier </a> </div> </div> <div class="stock {in: sale.stock, out: !sale.stock}"> {sale.stock ? \'En stock\' : \'Rupture\'} </div> </div> <div if="{gone}"> <i class="huge red remove icon"></i> <p>Cet article n\'est plus en vente</p> </div>','cart-add,[data-is="cart-add"]{ text-align: center; } cart-add .price,[data-is="cart-add"] .price{ font-size: 3em; line-height: 1em; } cart-add .stock,[data-is="cart-add"] .stock{ font-weight: bold; text-transform: uppercase; } cart-add .stock.in,[data-is="cart-add"] .stock.in{ color: #21ba45; } cart-add .stock.out,[data-is="cart-add"] .stock.out{ color: #db2828; }',"",function(opts){this.range=[1,2,3,4,5,6,7,8,9,10],this.on("mount",function(){this.load()}),this.load=function(){var item=UI.getItem();this.item=opts.item||item&&item.id,this.item&&this.request({method:"GET",url:"/i/item/"+this.item+"/sale",success:function(res){this.sale=res.sale,this.cart=res.cart,this.update(),$(this.refs.add).popup({on:"click",position:"bottom center",lastResort:!0})},error:function(){this.gone=!0,this.update()}})}.bind(this),this.add=function(e){var cart=JSON.parse(localStorage.getItem("cart"))||[],quantity=Number(this.refs.quantity.value),target=cart.filter(function(item){return item.id===this.item},this)[0];target?target.quantity+=quantity:cart.push({id:this.item,quantity:quantity}),localStorage.setItem("cart",JSON.stringify(cart)),e.target.classList.add("disabled"),$(this.refs.add).popup("show")}.bind(this)}),riot.tag2("cart-items",'<div if="{!order && items && !items.length}"> Le panier est vide </div> <div if="{!order && items && items.length}"> <table class="cart"> <thead> <tr> <th class="picture"></th> <th class="name">Désignation</th> <th class="number">Prix</th> <th class="number">Quantité</th> <th class="number">Sous-total</th> <th class="remove"></th> </tr> </thead> <tbody> <tr each="{item, i in items}"> <td> <img if="{item.picture}" riot-src="{item.picture}"> <i if="{!item.picture}
1" class="big grey {item.icon || \'image\'} icon"></i> </td> <td class="name"> <a if="{item.url}" href="{item.url}">{item.name}</a> <span if="{!item.url}">{item.name}</span> <div if="{item.info}" class="info">{item.info}</div> <div if="{item.stock === false}" class="out">Rupture</div> </td> <td>{item.price.toFixed(2)} €</td> <td> <select if="{item.quantity < 10}" onchange="{set}"> <option each="{n in range}" riot-value="{n}" selected="{item.quantity === n}">{n}</option> </select> <div if="{10 <= item.quantity}" class="ui input"> <input riot-value="{item.quantity}" onchange="{set}" type="{\'number\'}"> </div> </td> <td>{(item.price * (item.quantity || 1)).toFixed(2)} €</td> <td><i class="remove link icon" onclick="{remove}"></i></td> </tr> </tbody> </table> <div class="ui grid"> <div class="eight wide column"> <div class="ui action input"> <input ref="code" type="text" placeholder="Bon de réduction"> <button class="ui button" onclick="{setCode}">OK</button> </div> </div> <div class="eight wide column"> <div class="total"> Total TTC : {getTotal().toFixed(2)} € </div> </div> <div class="eight wide column"> <button class="ui button" onclick="{clear}"> Vider le panier </button> </div> <div class="eight wide column"> <button class="ui right floated {disabled: out} primary button" onclick="{checkout}"> Passer commande </button> </div> </div> </div> <cart-order if="{order}" ref="order" cart="{cart}" node="{opts.order}" register="{opts.register}" ondone="{clear}" oncancel="{init}"></cart-order>','cart-items,[data-is="cart-items"]{ display: block; max-width: 1000px; margin: 0 auto; } cart-items table,[data-is="cart-items"] table{ width: 100%; border-collapse: collapse; } cart-items th,[data-is="cart-items"] th,cart-items td,[data-is="cart-items"] td{ text-align: center; padding: 0.5em; border-bottom: 1px solid #ccc; } cart-items th,[data-is="cart-items"] th{ text-transform: uppercase; } cart-items td img,[data-is="cart-items"] td img{ width: 100px; height: 100px; vertical-align: middle; } cart-items td input,[data-is="cart-items"] td input{ width: 100%; } cart-items .picture,[data-is="cart-items"] .picture{ width: 15%; } cart-items .big.grey.icon,[data-is="cart-items"] .big.grey.icon{ width: 100px; height: 100px; line-height: 100px; background: #ddd; margin: 0; } cart-items .name,[data-is="cart-items"] .name{ text-align: left; } cart-items .name .info,[data-is="cart-items"] .name .info{ color: #999; } cart-items .name .out,[data-is="cart-items"] .name .out{ font-weight: bold; text-transform: uppercase; color: #db2828; } cart-items .number,[data-is="cart-items"] .number{ width: 10%; text-align: center; } cart-items .remove,[data-is="cart-items"] .remove{ width: 5%; } cart-items .action.input,[data-is="cart-items"] .action.input{ padding: 1.5em 0; } cart-items .action.input input::placeholder,[data-is="cart-items"] .action.input input::placeholder{ color: #333; } cart-items .total,[data-is="cart-items"] .total{ text-align: right; font-size: 2em; padding: 1em 0; }',"",function(opts){this.range=[1,2,3,4,5,6,7,8,9,"10+"],this.on("mount",function(){$(window).on("storage",this.init),this.init()}),this.init=function(e){e&&"cart"!==e.key||(this.cart=JSON.parse(localStorage.getItem("cart"))||[],this.load())}.bind(this),this.load=function(){if(0===this.cart.length)return this.items=[],void this.update();this.request({method:"PUT",url:"/c/cart/items",data:{cart:this.cart},success:function(res){this.items=res.items,this.order=!1,this.out=this.items.filter(function(item){return!1===item.stock}).length,this.update(),this.save()}})}.bind(this),this.getTotal=function(){return this.items.reduce(function(sum,item){return sum+item.price*(item.quantity||1)},0)}.bind(this),this.set=function(e){e.item.item.quantity=Number(e.target.value.replace(/[^0-9]/g,""))||0,0!==e.item.item.quantity?(this.save(),this.load()):this.remove(e)}.bind(this),this.setCode=function(e){var code=this.refs.code.value.trim();this.refs.code.value="",code&&(this.cart.push({code:code}),this.load())}.bind(this),this.remove=function(e){this.items.splice(e.item.i,1),this.save(),this.load()}.bind(this),this.clear=function(e){this.items=[],this.save(),this.update()}.bind(this),this.save=function(){this.cart=this.items.map(function(item){return{id:item.id,quantity:item.quantity,code:item.code}}),localStorage.setItem("cart",JSON.stringify(this.cart))}.bind(this),this.checkout=function(e){this.order=!0,this.update()}.bind(this)}),riot.tag2("cart-order",'<ui-message ref="message"></ui-message> <div if="{login}" class="login"> <user-login node="{opts.register}" onlogin="{load}"></user-login> </div> <div if="{items}"> <div class="ui four top attached steps"> <a each="{step in steps}" class="{active: active.id === step.id, disabled: active.id < step.id} step" onclick="{setStep}"> <i class="{step.icon} icon"></i> <div class="content"> <div class="title">{step.name}</div> </div> </a> </div> <div class="ui bottom attached segment"> <h2>{active.name}</h2> <cart-shipping show="{active.id === 1}" list="{shippings}" addresses="{addresses}" onsubmit="{setShipping}"></cart-shipping> <cart-payment show="{active.id === 2}" list="{payments}" addresses="{addresses}" amount="{getTotal()}" onsubmit="{setPayment}"></cart-payment> <div if="{active.id === 3}"> <div class="summary"> <h3>Panier</h3> <p each="{item in items}"> <b if="{item.quantity}">{item.quantity}x</b> {item.name} <span>{(item.price * (item.quantity || 1)).toFixed(2)} €</span> </p> <h3>Livraison</h3> <p>{shipping.name} <span>{shipping.price.toFixed(2)} €</span></p> <h3>Paiement</h3> <p>{payment.name}</p> <div class="total"> Total TTC : {getTotal().toFixed(2)} € </div> <div class="ui checkbox"> <input ref="tos" type="checkbox" id="tos" checked="checked" onclick="{update}"> <label for="tos">J\'accepte les conditions générales de vente</label> </div> <div class="submit"> <button ref="loading" class="ui {disabled: !refs.tos.checked} big primary button" onclick="{send}"> {transaction ? \'Payer la commande\' : \'Valider la commande\'} </button> </div> </div> </div> </div> </div> <div if="{done}"> <div class="ui huge center aligned icon header"> <i class="green circular checkmark icon"></i> Commande validée </div> <div class="submit"> <a href="/" class="ui button">Retour à l\'accueil</a> </div> </div>','cart-order .login,[data-is="cart-order"] .login{ max-width: 500px; margin: 0 auto; padding: 2em; border: 1px solid #ccc; } cart-order .ui.segment,[data-is="cart-order"] .ui.segment{ padding: 2em; } cart-order .ui.segment h2,[data-is="cart-order"] .ui.segment h2{ text-align: center; } cart-order .summary,[data-is="cart-order"] .summary{ max-width: 600px; margin: 0 auto; margin-top: 2em; } cart-order .summary p span,[data-is="cart-order"] .summary p span{ float: right; } cart-order .summary .ui.checkbox label,[data-is="cart-order"] .summary .ui.checkbox label{ cursor: pointer; } cart-order .submit,[data-is="cart-order"] .submit{ margin-top: 2em; text-align: center; }',"",function(opts){this.steps=[{id:0,name:"Panier",icon:"cart"},{id:1,name:"Livraison",icon:"truck"},{id:2,name:"Paiement",icon:"payment"},{id:3,name:"Récapitulatif",icon:"checkmark"}],this.on("mount",function(){$(window).on("unload",this.cancelTransaction),this.load()}),this.on("unmount",function(){this.cancelTransaction()}),this.load=function(e){opts.cart&&opts.cart.length&&this.request({method:"POST",url:"/c/cart/order?n="+opts.node,data:{cart:opts.cart},success:function(res){this.addresses=res.addresses,this.shippings=res.shippings,this.payments=res.payments,this.items=res.items,this.total=res.total,this.login=!1,this.active=this.steps[1],this.update()},error:function(res,xhr){401===xhr.status?(this.login=!0,this.update()):this.refs.message.set("error",res&&res.error)}})}.bind(this),this.getTotal=function(){return this.total+(this.shipping?this.shipping.price:0)}.bind(this),this.setStep=function(e){0!==e.item.step.id?(this.active=e.item.step,this.update(),this.refs.message.reset()):this.cancel()}.bind(this),this.setShipping=function(shipping,address){this.shipping=shipping,this.shippingAddress=address,this.active=this.steps[2],this.update()}.bind(this),this.setPayment=function(payment,address,transaction){this.payment=payment,this.billingAddress=address,this.transaction=transaction,this.active=this.steps[3],this.update()}.bind(this),this.send=function(){this.request({method:"POST",url:"/c/cart/order?n="+opts.node,data:{cart:opts.cart,shipping:this.shipping,shippingAddress:this.shippingAddress,payment:this.payment,billingAddress:this.billingAddress,transaction:this.transaction},success:function(res){if(this.trigger("done"),"function"==typeof this.transaction)return this.refs.loading.classList.add("loading"),void this.transaction(res.transaction);this.items=null,this.done=!0,this.update()},error:function(res,xhr){401===xhr.status?(this.login=!0,this.update()):this.refs.message.set("error",res&&res.error)}})}.bind(this),this.cancel=function(){this.cancelTransaction(),this.trigger("cancel")}.bind(this),this.cancelTransaction=function(){!this.done&&this.transaction&&"function"!=typeof this.transaction&&this.request({method:"DELETE",async:!1,url:"/c/payment/"+this.payment.id+"/transaction",data:{transaction:this.transaction},success:function(){this.transaction=null}})}.bind(this)}),riot.tag2("cart-payment",'<p>Montant à payer : <b>{opts.amount.toFixed(2)} €</b></p> <div class="ui secondary labeled icon menu"> <a each="{type in opts.list}" class="{active: active.id === type.id} item" onclick="{setType}"> <i class="{type.icon} icon"></i> {type.name} </a> </div> <div if="{active.children && active.children.length !== 1}" class="ui form"> <div class="grouped fields"> <div each="{payment in active.children}" class="field"> <div class="ui radio checkbox"> <input type="radio" id="payment-{payment.id}" name="payment-radio" onchange="{set}"> <label for="payment-{payment.id}"> <span>{payment.name}</span> <p>{payment.description}</p> </label> </div> </div> </div> </div> <div if="{payment && payment.config.connector}"> <div if="{error}" class="ui error message"> {error} </div> <div ref="payment" data-is="payment-{payment.config.connector}" payment="{payment.id}" config="{payment.config}" amount="{opts.amount}" ondone="{notify}" onerror="{alert}"></div> </div> <div if="{payment && payment.config.details}" class="details"> {payment.config.details} </div> <div class="actions"> <button ref="button" class="ui {disabled: !payment} primary button" onclick="{submit}"> Valider </button> </div>','cart-payment .ui.checkbox label,[data-is="cart-payment"] .ui.checkbox label{ cursor: pointer; } cart-payment .ui.checkbox label span,[data-is="cart-payment"] .ui.checkbox label span{ font-weight: bold; } cart-payment .details,[data-is="cart-payment"] .details{ white-space: pre-line; } cart-payment .actions,[data-is="cart-payment"] .actions{ text-align: right; }',"",function(opts){this.active={},this.on("mount",function(){this.setType()}),this.setType=function(e){this.active=e?e.item.type:opts.list[0],this.error=null,this.payment=null,this.update(),this.payment=1===this.active.children.length?this.active.children[0]:null,this.update()}.bind(this),this.set=function(e){this.error=null,this.payment=null,this.update(),this.payment=e.item.payment,this.update()}.bind(this),this.submit=function(e){this.refs.button.classList.contains("loading")||(this.refs.button.classList.add("loading"),this.refs.payment?(this.error=null,this.update(),this.refs.payment.authorize(this.payment,o
1pts.amount)):this.notify())}.bind(this),this.notify=function(transaction){this.refs.button.classList.remove("loading"),this.trigger("submit",this.payment,this.address,transaction)}.bind(this),this.alert=function(error){this.error=error,this.update(),this.refs.button.classList.remove("loading")}.bind(this)}),riot.tag2("cart-shipping",'<div class="ui secondary labeled icon menu"> <a each="{type in opts.list}" class="{active: active.id === type.id} item" onclick="{setType}"> <i class="{type.icon} icon"></i> {type.name} </a> </div> <div class="ui form"> <div class="grouped fields"> <div each="{shipping in active.children}" class="field"> <div class="ui radio checkbox"> <input type="radio" id="shipping-{shipping.id}" name="shipping-radio" checked="{active.children.length === 1}" onchange="{set}"> <label for="shipping-{shipping.id}"> <span>{shipping.name}</span> : {formatPrice(shipping)} <p>{shipping.description}</p> </label> </div> </div> </div> </div> <div class="actions"> <button class="ui {disabled: !shipping} primary button" onclick="{submit}"> Valider </button> </div>','cart-shipping .ui.checkbox label,[data-is="cart-shipping"] .ui.checkbox label{ cursor: pointer; } cart-shipping .ui.checkbox label span,[data-is="cart-shipping"] .ui.checkbox label span{ font-weight: bold; } cart-shipping .actions,[data-is="cart-shipping"] .actions{ text-align: right; }',"",function(opts){this.active={},this.on("mount",function(){this.setType()}),this.formatPrice=function(shipping){return 0<shipping.price?shipping.price.toFixed(2)+" €":"Gratuit"}.bind(this),this.setType=function(e){this.active=e?e.item.type:opts.list[0],this.shipping=1===this.active.children.length?this.active.children[0]:null,this.update()}.bind(this),this.set=function(e){this.shipping=e.item.shipping,this.update()}.bind(this),this.submit=function(){this.trigger("submit",this.shipping)}.bind(this)}),riot.tag2("data-address",'<div if="{mode === \'view\'}" class="{large: !opts.block.parent} data"> <div each="{data in dataset}"> <label if="{data.label}">{data.label}</label> {format(data)} </div> </div> <div if="{mode === \'edit\'}" onchange="{stop}"> <virtual each="{data, i in dataset}"> <div class="top fields"> <div if="{labels}" class="four wide field"> <ui-dropdown placeholder="Libellé" text="{data.label}" url="{url}" name="{i}" onchange="{setLabel}"></ui-dropdown> </div> <div class="{twelve: labels, sixteen: !labels} wide field"> <div class="ui icon input"> <input type="text" placeholder="Voie" name="line1" riot-value="{data.line1}" oninput="{set}"> <i class="plus link icon" if="{data.line2 === undefined}" onclick="{addLine}"></i> </div> </div> </div> <div show="{data.line2 !== undefined}" class="fields"> <div if="{labels}" class="four wide field">&nbsp;</div> <div class="{twelve: labels, sixteen: !labels} wide field"> <div class="ui icon input"> <input type="text" placeholder="Complément" name="line2" riot-value="{data.line2}" oninput="{set}"> <i class="plus link icon" if="{data.line3 === undefined}" onclick="{addLine}"></i> </div> </div> </div> <div show="{data.line3 !== undefined}" class="fields"> <div if="{labels}" class="four wide field">&nbsp;</div> <div class="{twelve: labels, sixteen: !labels} wide field"> <input type="text" placeholder="Autre" name="line3" riot-value="{data.line3}" oninput="{set}"> </div> </div> <div class="fields"> <div if="{labels}" class="four wide field">&nbsp;</div> <div class="{three: labels, four: !labels} wide field"> <input type="text" placeholder="Code postal" name="zipcode" riot-value="{data.zipcode}" oninput="{set}"> </div> <div class="{five: labels, six: !labels} wide field"> <input type="text" placeholder="Ville" name="city" riot-value="{data.city}" oninput="{set}"> </div> <div class="{four: labels, six: !labels} wide field"> <ui-dropdown placeholder="Pays" text="{data.country}" url="/l/list/countries/values" name="{i}" onchange="{setCountry}"></ui-dropdown> </div> </div> </virtual> <button if="{dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div> <div if="{mode === \'filter\'}" onchange="{stop}"> <virtual each="{data in dataset}"> <div class="fields"> <div class="sixteen wide field"> <input type="text" placeholder="Voie" name="line1" riot-value="{data.line1}" oninput="{set}"> </div> </div> <div class="fields"> <div class="four wide field"> <input type="text" placeholder="Code postal" name="zipcode" riot-value="{data.zipcode}" oninput="{set}"> </div> <div class="six wide field"> <input type="text" placeholder="Ville" name="city" riot-value="{data.city}" oninput="{set}"> </div> <div class="six wide field"> <ui-dropdown placeholder="Pays" text="{data.country}" url="/l/list/countries/values" name="{i}" onchange="{setCountry}"></ui-dropdown> </div> </div> </virtual> </div>','data-address .data,[data-is="data-address"] .data{ white-space: pre-line; } data-address .data label,[data-is="data-address"] .data label{ display: block; font-weight: bold; } data-address .data.large div,[data-is="data-address"] .data.large div{ display: flex; } data-address .data.large label,[data-is="data-address"] .data.large label{ width: 8em; } data-address .top.fields:not(:first-child),[data-is="data-address"] .top.fields:not(:first-child){ margin-top: 1em; }',"",function(opts){this.mixin("data"),this.on("update",function(){this.max=opts.block.config.max||1,this.url="/n/block/"+opts.block.id+"/values",this.labels=!!opts.block.config.list}),this.setLabel=function(value,i){value?this.dataset[i].label=value.name:delete this.dataset[i].label,this.trigger("change",opts.block,this.dataset)}.bind(this),this.setCountry=function(value,i){value?this.dataset[i].c
1ountry=value.name:delete this.dataset[i].country,this.trigger("change",opts.block,this.dataset)}.bind(this),this.addLine=function(e){void 0===e.item.data.line2?e.item.data.line2="":void 0===e.item.data.line3&&(e.item.data.line3=""),this.update()}.bind(this)}),riot.tag2("data-boolean",'<div if="{mode === \'view\'}" class="data"> <div each="{data in dataset}"> {format(data)} </div> </div> <div if="{mode !== \'view\'}" class="data" onchange="{stop}"> <div each="{data, i in dataset}" class="inline fields"> <div class="field"> <div class="ui {radio: !config.checkbox} checkbox"> <input type="{config.checkbox ? \'checkbox\' : \'radio\'}" name="{name}" value="true" checked="{data.state === true}" onchange="{set}"> <label>{config.label1 || \'Oui\'}</label> </div> </div> <div if="{!config.checkbox}" class="field"> <div class="ui radio checkbox"> <input type="radio" name="{name}" value="false" checked="{data.state === false}" onchange="{set}"> <label>{config.label0 || \'Non\'}</label> </div> </div> </div> </div>',"","",function(opts){this.mixin("data"),this.on("update",function(){this.name=Math.random().toString(36).slice(2),this.block=opts.block,this.config=opts.block.config}),this.on("updated",function(){$(".ui.checkbox",this.root).checkbox({uncheckable:!0})}),this.set=function(e){var state="true"===e.target.value;e.item.data.state!==state?e.item.data.state=state:delete e.item.data.state,this.trigger("change",opts.block,this.dataset)}.bind(this)}),riot.tag2("data-box",'<div if="{mode === \'view\' && dataset.length}" class="ui relaxed data list"> <div each="{data, i in dataset}" class="item"> <i class="large folder open outline icon"></i> <div class="middle aligned content"> <a href="{UI.link(link, data)}">{data.name}</a> </div> </div> </div> <div if="{mode !== \'view\'}"> <div each="{data, i in dataset}" class="fields"> <div class="sixteen wide field"> <ui-dropdown url="/f/boxes" name="{i}" text="{data.name}" onchange="{set}"></ui-dropdown> </div> </div> <button if="{mode === \'edit\' && dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div>',"","",function(opts){this.mixin("data"),this.on("update",function(){this.max=opts.block.config.max||1,this.raw=opts.block.config.raw,this.link=opts.block.config.link||"#box/$id"}),this.set=function(box,i){box?this.dataset[i]=this.raw?box:{id:box.id,name:box.name}:(this.dataset.splice(i,1),this.update()),this.trigger("change",opts.block,this.dataset),0===this.dataset.length&&this.add()}.bind(this)}),riot.tag2("data-date",'<div if="{mode === \'view\'}" class="data"> <div each="{data in dataset}"> {format(data)} </div> </div> <div if="{mode === \'edit\'}" onchange="{stop}"> <div each="{data, i in dataset}"> <ui-date-picker name="{i}" placeholder="{name}" type="{type}" range="{range}" min="{minDate}" max="{maxDate}" date="{data.date}" date2="{data.date2}" onchange="{set}"></ui-date-picker> </div> <button if="{dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div> <div if="{mode === \'filter\'}" onchange="{stop}"> <div each="{data, i in dataset}" class="fields"> <div class="six wide field"> <ui-dropdown list="{operators}" name="{i}" text="{getOperator(data.op)}" onchange="{setOperator}"></ui-dropdown> </div> <div class="ten wide field"> <ui-date-picker name="{i}" placeholder="{name}" type="{type}" range="{isRange(data)}" min="{minDate}" max="{maxDate}" date="{data.date}" date2="{data.end}" onchange="{set}" offset></ui-date-picker> </div> </div> </div>',"","",function(opts){this.mixin("data"),this.operators=UI.operator.math,this.on("update",function(){this.max=opts.block.config.max||1,this.name=opts.block.name,this.type=opts.block.config.type||"date",this.range=opts.block.config.range,this.minDate=opts.block.config.minDate,this.maxDate=opts.block.config.maxDate}),this.isRange=function(data){return"bw"===data.op||"nb"===data.op}.bind(this),this.getOperator=function(id){return(this.operators.filter(function(op){return op.id===id})[0]||this.operators[0]).name}.bind(this),this.set=function(date,field,i){"filter"===this.mode&&"date2"===field&&(field="end"),date?this.dataset[i][field]=date:delete this.dataset[i][field],this.trigger("change",opts.block,this.dataset)}.bind(this),this.setOperator=function(op,i){this.dataset[i].op=op&&op.id,this.isRange(this.dataset[i])||delete this.dataset[i].end,this.update(),this.trigger("change",opts.block,this.dataset)}.bind(this)}),riot.tag2("data-email",'<div if="{mode === \'view\'}" class="{large: !opts.block.parent} data"> <div each="{data in dataset}"> <label if="{data.label}">{data.label}</label> <a href="mailto:{data.email}">{format(data)}</a> </div> </div> <div if="{mode === \'edit\' && !recipients}" onchange="{stop}"> <div each="{data, i in dataset}" class="fields"> <div if="{labels}" class="four wide field"> <ui-dropdown placeholder="Libellé" text="{data.label}" url="{url}" name="{i}" onchange="{setLabel}"></ui-dropdown> </div> <div class="{twelve: labels, sixteen: !labels} wide field"> <input type="text" placeholder="E-mail" name="email" riot-value="{data.email}" oninput="{set}"> </div> </div> <button if="{dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div> <div if="{mode === \'edit\' && recipients}" onchange="{stop}"> <mail-recipients data="{dataset}" onchange="{setRecipients}"></mail-recipients> </div> <div if="{mode === \'filter\'}" onchange="{stop}"> <div each="{data in dataset}" class="fields"> <div class="sixteen wide field"> <input type="text" placeholder="E-mail" name="email" riot-value="{data.email}" oninput="{set}"> </div> </div> </div>','data-email .data label,[data-is="data-email"] .data label{ display: block; font-weight: bold; } data-email .data.large div,[data-is="data-email"] .data.large div{ display: flex; } data-email .data.large label,[data-is="data-email"] .data.large label{ width: 8em; } data-email mail-recipients,[data-is="data-email"] mail-recipients{ display: block; margin: 0 -0.2em 0; }',"",function(opts){this.mixin("data"),this.on("update",function(){this.max=opts.block.config.max||1,this.url="/n/block/"+opts.block.id+"/values",this.labels=!!opts.block.config.list,this.recipients=opts.block.config.recipients}),this.setLabel=function(value,i){value?this.dataset[i].label=value.name:delete this.dataset[i].label,this.trigger("change",opts.block,this.dataset)}.bind(this),this.setRecipients=function(list){this.dataset.length=0,list.forEach(function(data){this.dataset.push(data)},this),this.trigger("change",opts.block,this.dataset)}.bind(this)}),riot.tag2("data-file",'<div if="{mode === \'view\' && !thumbnails && dataset.length}" class="data"> <div each="{data, i in dataset}"> <i class="{getIcon(data)} icon"></i> <a href="{UI.getFileURL(data)}?dl" onclick="{view}">{data.name}</a> </div> </div> <div if="{mode === \'view\' && thumbnails && dataset.length}" class="data"> <a each="{data, i in dataset}" class="thumbnail" href="{UI.getFileURL(data)}?dl" onclick="{view}"> <img riot-src="{UI.getFileURL(data)}?tn" title="{data.name}"> </a> </div> <div if="{mode === \'edit\' && !thumbnails && dataset.length}"> <div each="{data, i in dataset}" class="fields"> <div class="sixteen wide field"> <ui-dropdown url="{files}" name="{i}" text="{data.name}" onchange="{set}"></ui-dropdown> </div> </div> </div> <div if="{mode === \'edit\' && thumbnails && dataset.length}" class="data"> <div each="{data, i in dataset}" class="thumbnail"> <img riot-src="{UI.getFileURL(data)}?tn" title="{data.name}"> <i class="delete link icon" onclick="{remove}"></i> </div> </div> <div if="{mode === \'edit\' && dataset.length < max}" class="insert"> <div if="{insert}" class="fields"> <div if="{!upload}" class="sixteen wide field"> <ui-dropdown url="{files}" name="{i}" onchange="{push}"></ui-dropdown> </div> <div if="{upload}" class="sixteen wide field"> <ui-upload ref="upload" url="{url}" accept="{accept}" limit="{max - dataset.length}" images="{images}
1" onsend="{hide}" onfile="{push}" ondone="{reset}"></ui-upload> </div> </div> <ui-message ref="message"></ui-message> <div class="actions"> <button if="{!insert}" class="ui button" onclick="{add}"> Ajouter </button> <button if="{insert && !upload}" class="ui button" onclick="{toggle}"> Télécharger un fichier </button> <button if="{insert && upload && select && !queue}" class="ui button" onclick="{toggle}"> Sélectionner dans les documents </button> </div> </div> <div if="{mode === \'filter\'}"> <div each="{data, i in dataset}" class="fields"> <div class="sixteen wide field"> <ui-dropdown url="{files}" name="{i}" text="{data.name}" onchange="{set}"></ui-dropdown> </div> </div> </div> <file-viewer ref="viewer" onchange="{setNames}"></file-viewer>','data-file .thumbnail,[data-is="data-file"] .thumbnail{ position: relative; display: inline-block; margin: 0 0.5em 0.5em 0; } data-file .thumbnail img,[data-is="data-file"] .thumbnail img{ width: 100px; height: 100px; vertical-align: middle; border-radius: 4px; } data-file .thumbnail .icon,[data-is="data-file"] .thumbnail .icon{ position: absolute; top: 0; right: -3px; font-size: 1.2em; color: #fff; text-shadow: -1px 0 3px #000, 0 1px 3px #000, 1px 0 3px #000, 0 -1px 3px #000; } data-file .insert:not(:first-child),[data-is="data-file"] .insert:not(:first-child){ margin-top: 0.5em; } data-file .actions,[data-is="data-file"] .actions{ text-align: right; } data-file ui-upload,[data-is="data-file"] ui-upload{ display: block; margin: 0.5em; }',"",function(opts){this.mixin("data"),this.dataset=[],this.on("update",function(){this.max=opts.block.config.max||1,this.raw=opts.block.config.raw,this.url=opts.block.config.url||"/n/block/"+opts.block.id+"/file",this.select=opts.block.config.select,this.images=opts.block.config.images,this.files="/f/files",opts.block.config.ext?(this.files+="?e="+opts.block.config.ext.join("|"),this.accept=opts.block.config.ext):opts.block.config.type&&(this.files+="?t="+opts.block.config.type,this.accept=(UI.filetype[opts.block.config.type]||{}).ext)}),this.load=function(mode,dataset){this.dataset!==dataset&&(this.dataset=dataset||[]),this.mode!==mode&&(this.insert=!this.dataset.length,this.upload=!0),this.mode=mode;var images=this.dataset.filter(function(data){return data.name&&-1!==UI.filetype.image.ext.indexOf(UI.getFileExt(data))});this.thumbnails=images.length===this.dataset.length}.bind(this),this.getIcon=function(file){var type,ext=UI.getFileExt(file);for(type in UI.filetype)if(-1!==UI.filetype[type].ext.indexOf(ext))return UI.filetype[type].icon;return"file outline"}.bind(this),this.add=function(){"edit"===this.mode?(this.refs.message.reset(),this.insert=!0):this.dataset.push({}),this.update()}.bind(this),this.toggle=function(){this.upload=!this.upload,this.update()}.bind(this),this.hide=function(){this.queue=!0,this.update()}.bind(this),this.reset=function(errors){errors&&this.refs.message.set("error",{title:"Erreur lors du téléchargement",message:errors},!1),this.insert=!1,this.queue=!1,this.update()}.bind(this),this.set=function(file,i){file?this.dataset[i]=this.raw?file:{id:file.id,name:file.name,hash:file.hash}:(this.dataset.splice(i,1),this.update()),this.trigger("change",opts.block,this.dataset),0===this.dataset.length&&this.add()}.bind(this),this.push=function(file){this.dataset.push(this.raw?file:{id:file.id,name:file.name,hash:file.hash}),this.trigger("change",opts.block,this.dataset),this.upload||(this.insert=!1,this.update())}.bind(this),this.remove=function(e){this.dataset.splice(e.item.i,1),this.update(),this.trigger("change",opts.block,this.dataset),0===this.dataset.length&&this.add()}.bind(this),this.view=function(e){opts.block.config.viewer&&(e.preventDefault(),this.refs.viewer.show(this.dataset,e.item.i))}.bind(this),this.setNames=function(list){this.dataset.forEach(function(data,i){data.name=list[i].name}),this.update()}.bind(this)}),riot.tag2("data-group",'<div if="{mode !== \'filter\' && rows.length}" class="{\'ui segments\': mode === \'view\'}"> <div each="{row, i in rows}" draggable="{mode === \'edit\' && row.mode === \'view\'}" ondragstart="{dragStart}" ondragover="{dragOver}" ondragend="{dragEnd}" ondrop="{drop}" class="ui data segment {view: row.mode === \'view\', over: row === drag.target}"> <div if="{mode === \'edit\' && row.mode === \'view\'}" class="actions"> <i if="{actions.edit}" class="write link icon" onclick="{edit}"></i> <i if="{actions.remove}" class="delete link icon" onclick="{remove}"></i> </div> <div each="{child in children}" if="{isVisible(row, child)}" class="child field"> <div class="name"> {child.name} <span if="{child.description && row.mode === \'edit\'}" class="description"> {child.description}
1 </span> </div> <div ref="data" data-is="data-{child.type}" mode="{row.mode}" block="{getBlock(child, i)}" dataset="{row.data[child.id]}" onchange="{set}"></div> </div> </div> </div> <button if="{mode === \'edit\' && rows.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button>','data-group div:not(.segments) > .ui.segment,[data-is="data-group"] div:not(.segments) > .ui.segment{ margin: 0 0 0.5rem; } data-group div:not(.segments) > .ui.segment.view,[data-is="data-group"] div:not(.segments) > .ui.segment.view{ cursor: move; } data-group .ui.segment .name,[data-is="data-group"] .ui.segment .name{ margin: 0 0 0.3rem 0; font-weight: bold; } data-group .ui.segment .name .description,[data-is="data-group"] .ui.segment .name .description{ color: #999; font-weight: normal; } data-group .ui.segment.view .field,[data-is="data-group"] .ui.segment.view .field{ margin: 0; display: flex; } data-group .ui.segment.view .name,[data-is="data-group"] .ui.segment.view .name{ flex: 1; margin: 0; } data-group .ui.segment.view [data-is],[data-is="data-group"] .ui.segment.view [data-is]{ flex: 3; } data-group .ui.segment.view [data-is] .data,[data-is="data-group"] .ui.segment.view [data-is] .data{ padding: 0; } data-group .ui.segment.view .actions,[data-is="data-group"] .ui.segment.view .actions{ position: absolute; right: 0.5em; } data-group .ui.segment.over,[data-is="data-group"] .ui.segment.over{ background: #e0e0e0; outline: 2px dashed #666; outline-offset: -2px; }',"",function(opts){this.rows=[],this.drag={},this.on("mount",function(){this.update()}),this.on("update",function(){this.max=opts.block.config.max||1,this.actions=opts.block.config.actions||{edit:!0,remove:!0},this.children=opts.block.children||[],this.load(opts.mode,opts.dataset)}),this.on("updated",function(){this.checkFilters()}),this.load=function(mode,dataset){if(this.rows!==dataset&&(this.children.forEach(function(child){child.config=child.config||{},child.config.max=1,child.parent=!0}),this.rows=dataset||[],this.rows.forEach(function(row){row.mode="view"}),this.modified=!1),"view"!==mode&&0===this.rows.length&&this.rows.push({data:{},mode:"edit"}),"view"!==this.mode&&"view"===mode)for(var i=this.rows.length;i--;)this.rows[i].mode="view",$.isEmptyObject(this.rows[i].data)&&this.rows.splice(i,1);this.mode=mode}.bind(this),this.isVisible=function(row,block){return!("view"===row.mode&&!row.data[block.id])&&("edit"!==row.mode||!block.config.readonly)}.bind(this),this.checkFilters=function(){this.rows.forEach(function(row,i){this.children.filter(function(child){return this.isVisible(row,child)},this).forEach(function(child,ii){var content,visible;child.filters&&"function"==typeof opts.get&&(content=child.filters.reduce(function(agg,filter){return agg[filter.id]=row.data[filter.id]||opts.get(filter.id),agg},{}),visible=UI.matchData(child.filters,content),$(".segment",this.root).eq(i).find(".child").eq(ii).toggle(visible),!visible&&Array.isArray(row.data[child.id])&&(row.data[child.id].length=0))},this)},this)}.bind(this),this.getBlock=function(block,i){return $.extend(!0,{row:i},block)}.bind(this),this.set=function(block,dataset){this.rows[block.row].data[block.id]=dataset,this.modified=!0,this.checkFilters(),block.config.dump&&this.dump()}.bind(this),this.add=function(e){this.rows.push({data:{},mode:"edit"}),this.update()}.bind(this),this.edit=function(e){e.item.row.mode="edit",this.update()}.bind(this),this.remove=function(e){this.rows.splice(e.item.i,1),this.modified=!0,this.update()}.bind(this),this.dragStart=function(e){"edit"===this.mode&&"edit"!==e.item.row.mode?(e.dataTransfer.setData("text",1),this.drag.source=e.item.row):e.preventDefault()}.bind(this),this.dragOver=function(e){e.preventDefault(),"edit"===this.mode&&this.drag.target!==e.item.row&&(this.drag.target=e.item.row,this.update())}.bind(this),this.dragEnd=function(e){this.drag={},this.update()}.bind(this),this.drop=function(e){var i1,i2;e.preventDefault(),this.drag.source!==this.drag.target&&(i1=this.rows.indexOf(this.drag.source),i2=this.rows.indexOf(this.drag.target),this.rows.splice(i2,0,this.rows.splice(i1,1)[0]),this.modified=!0)}.bind(this),this.dump=function(){(Array.isArray(this.refs.data)?this.refs.data:[this.refs.data]).forEac
1h(function(tag){tag&&"edit"===tag.mode&&"function"==typeof tag.dump&&tag.dump()}),this.modified&&(this.trigger("change",opts.block,this.rows.map(function(row){return $.isEmptyObject(row.data)?{}:{data:row.data}})),this.modified=!1)}.bind(this)}),riot.tag2("data-html",'<div if="{mode === \'view\'}" class="data" onchange="{stop}"> <div each="{data in dataset}"> <ui-html content="{data.html}"></ui-html> </div> </div> <div if="{mode === \'edit\'}" onkeydown="{stop}" onchange="{stop}"> <div each="{data in dataset}" class="fields"> <div class="sixteen wide field"> <ui-content-editor ref="editor" content="{data.html}" config="{config}" onchange="{set}"></ui-content-editor> </div> </div> </div> <div if="{mode === \'filter\'}" onchange="{stop}"> <div each="{data in dataset}" class="fields"> <div class="sixteen wide field"> <input type="text" placeholder="{name}" name="html" riot-value="{data.html}" oninput="{setFilter}"> </div> </div> </div>','data-html ui-content-editor,[data-is="data-html"] ui-content-editor{ background: #fff; } data-html ui-content-editor > .content,[data-is="data-html"] ui-content-editor > .content{ padding: 0.5em; }',"",function(opts){this.mixin("data"),this.on("update",function(){this.name=opts.block.name,this.config=opts.block.config}),this.set=function(html){html?this.dataset[0].html=html:delete this.dataset[0].html,this.trigger("change",opts.block,this.dataset)}.bind(this),this.setFilter=function(e){e.item.data.html=e.target.value.trim(),e.item.data.op="in",""===e.target.value&&(delete e.item.data.html,delete e.item.data.op),this.trigger("change",opts.block,this.dataset)}.bind(this),this.dump=function(){this.refs.editor.dump()}.bind(this)}),riot.tag2("data-invoice",'<div if="{mode === \'view\' && dataset.length}"> <table class="ui very compact celled table"> <thead> <tr> <th class="name">Désignation</th> <th>PU HT</th> <th>Quantité</th> <th if="{hasDuration()}">Durée</th> <th>Taux TVA</th> <th>{tax ? \'Total TTC\' : \'Total HT\'}</th> </tr> </thead> <tbody> <tr each="{data in dataset}"> <td if="{!data.id}" class="name"> {data.name} <div>{data.info}</div> </td> <td if="{data.id}" class="name"> <a href="{UI.link(link, data)}">{data.name}</a> <div>{data.info}</div> </td> <td>{data.price.toFixed(2)}</td> <td>{formatQuantity(data)}</td> <td if="{hasDuration()}">{formatDuration(data)}</td> <td>{data.rate.toFixed(2)} %</td> <td>{getTotal(data, parent.tax).toFixed(2)}</td> </tr> </tbody> </table> <table class="summary"> <tbody> <tr> <th>Total HT</th> <td class="num">{getSum().toFixed(2)} €</td> </tr> <tr each="{tax in getTaxes()}"> <th>TVA {tax.rate.toFixed(2)} %</th> <td class="num">{tax.amount.toFixed(2)} €</td> </tr> <tr> <th>Total TTC</th> <td class="num">{getSum(true).toFixed(2)} €</td> </tr> </tbody> </table> </div> <div if="{mode === \'edit\'}" onchange="{stop}"> <virtual each="{data, i in dataset}"> <div class="top fields"> <div class="sixteen wide field"> <ui-dropdown url="{url}" name="{i}" text="{data.name}" onchange="{setSale}"></ui-dropdown> </div> </div> <div class="fields"> <div class="twelve wide field"> <input type="text" placeholder="Complément" name="info" riot-value="{data.info}" oninput="{set}"> </div> <div class="four wide field"> <div class="ui right labeled input"> <input type="text" placeholder="Durée" name="duration" riot-value="{data.duration}" oninput="{setNumber}"> <div class="ui basic label">mois</div> </div> </div> </div> <div class="fields"> <div class="four wide field"> <div class="ui right labeled input"> <input type="text" placeholder="Quantité" name="quantity" riot-value="{formatQuantity(data)}" oninput="{setNumber}"> <div class="ui basic label">x</div> </div> </div> <div class="four wide field"> <div class="ui right labeled input"> <input type="text" placeholder="Prix unitaire HT" name="price" riot-value="{formatPrice(data.price)}" oninput="{setNumber}"> <div class="ui basic label">€ HT</div> </div> </div> <div class="four wide field"> <div class="ui right labeled input"> <input type="text" placeholder="Taux TVA" name="rate" riot-value="{data.rate}" oninput="{setNumber}"> <div class="ui basic label">% TVA</div> </div> </div> <div class="four wide field"> <div class="ui right labeled input"> <input type="text" placeholder="{tax ? \'Total TTC\' : \'Total HT\'}" name="total" riot-value="{formatPrice(getTotal(data, parent.tax))}" oninput="{setNumber}"> <div class="ui basic label">{tax ? \'€ TTC\' : \'€ HT\'}</div> </div> </div> </div> </virtual> <button if="{dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div> <div if="{mode === \'filter\'}" onchange="{stop}"> <div each="{data, i in dataset}" class="fields"> <div class="sixteen wide field"> <ui-dropdown url="{url}" name="{i}" text="{data.name}" onchange="{setSale}"></ui-dropdown> </div> </div> </div>','data-invoice .ui.table th,[data-is="data-invoice"] .ui.table th{ padding: .6em .6em; white-space: nowrap; } data-invoice .ui.table th.name,[data-is="data-invoice"] .ui.table th.name{ width: 50%; } data-invoice .ui.table td:not(.name),[data-is="data-invoice"] .ui.table td:not(.name){ text-align: right; white-space: nowrap; } data-invoice .ui.table td div,[data-is="data-invoice"] .ui.table td div{ color: #999; } data-invoice .summary,[data-is="data-invoice"] .summary{ width: 100%; } data-invoice .summary th,[data-is="data-invoice"] .summary th{ text-align: right; } data-invoice .summary td,[data-is="data-invoice"] .summary td{ text-align: right; width: 10em; } data-invoice .top.fields:not(:first-child),[data-is="data-invoice"] .top.fields:not(:first-child){ margin-top: 1em; }',"",function(opts){this.mixin("data"),this.on("update",function(){this.max=opts.block.config.max||1,this.raw=opts.block.config.raw,this.tax=opts.block.config.tax,this.url="/n/block/"+opts.block.id+"/sales",this.link=opts.block.config.link||"#item/$id/$token"}
1),this.hasDuration=function(){return 0<this.dataset.filter(function(data){return data.duration}).length}.bind(this),this.formatDuration=function(data){return data.duration?[data.duration,"mois"].join(" "):""}.bind(this),this.formatQuantity=function(data){return[data.quantity,data.unit].join(" ").trim()}.bind(this),this.formatPrice=function(number){return Number.isFinite(number)?Number(number.toFixed(2)):""}.bind(this),this.setSale=function(sale,i){var filter="filter"===this.mode;sale?this.dataset[i]=this.raw?sale:{id:sale.id,name:sale.name,quantity:filter?void 0:1,unit:filter?void 0:sale.unit,price:filter?void 0:sale.price,rate:filter?void 0:sale.rate}:this.dataset.splice(i,1),this.update(),this.trigger("change",opts.block,this.dataset),0===this.dataset.length&&this.add()}.bind(this),this.setNumber=function(e){var data=e.item.data;if(e.target.value=e.target.value.replace(",","."),data.quantity=data.quantity||1,data.price=data.price||0,data.rate=data.rate||0,"quantity"===e.target.name){var match=e.target.value.match(/^([0-9]+)(.*)$/);data.quantity=match&&Number(match[1])||1,data.unit=match&&match[2].trim()||null}else{if(e.target.value=e.target.value.replace(/[^0-9.-]/g,""),"-"===e.target.value)return;"total"===e.target.name?data.quantity&&(data.price=e.target.value/data.quantity/(data.duration||1),data.price/=this.tax?data.rate/100+1:1):""!==e.target.value?data[e.target.name]=Number(e.target.value)||0:delete data[e.target.name]}this.update(),this.trigger("change",opts.block,this.dataset)}.bind(this),this.getTotal=function(data,itax){var total=data.quantity*(data.duration||1)*data.price;return itax?total*(data.rate/100+1):total}.bind(this),this.getSum=function(itax){return this.dataset.reduce(function(total,data){return total+this.getTotal(data,itax)}.bind(this),0)}.bind(this),this.getTaxes=function(){var taxes=[];return this.dataset.forEach(function(data){data.rate&&-1===taxes.indexOf(data.rate)&&taxes.push(data.rate)}),taxes.sort(function(a,b){return a-b}),taxes.map(function(rate){return{rate:rate,amount:this.dataset.reduce(function(amount,data){return data.rate===rate&&(amount+=data.price*data.quantity*(data.duration||1)*(data.rate/100)),amount},0)}},this)}.bind(this)}),riot.tag2("data-item",'<div if="{mode === \'view\'}" class="data"> <div each="{data in dataset}"> <a href="{UI.link(link, data)}">{format(data)}</a> </div> </div> <div if="{mode !== \'view\'}"> <div each="{data, i in dataset}" class="fields"> <div class="sixteen wide field"> <ui-dropdown url="{url}" name="{i}" text="{data.name}" onrequest="{filter}" onchange="{set}"></ui-dropdown> </div> </div> <button if="{mode === \'edit\' && dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div>',"","",function(opts){this.mixin("data"),this.on("update",function(){this.max=opts.block.config.max||1,this.raw=opts.block.config.raw,this.url=opts.block.config.url||"/n/block/"+opts.block.id+"/items",this.link=opts.block.config.link||"#item/$id/$token"}),this.filter=function(status,data,settings){var dataset;opts.block.config.filter&&"function"==typeof opts.get&&"before"===status&&(dataset=opts.get(opts.block.config.filter),settings.url+="&i="+(dataset?dataset[0].id:0))}.bind(this),this.set=function(item,i){item?this.dataset[i]=this.raw?item:{id:item.id,name:item.name}:(this.dataset.splice(i,1),this.update()),this.trigger("change",opts.block,this.dataset),0===this.dataset.length&&this.add()}.bind(this)}),riot.tag2("data-label",'<div if="{mode === \'view\'}" class="data"> <div each="{data in dataset}" class="ui {getColor(data)} label"> {format(data)} </div> </div> <div if="{mode !== \'view\'}"> <div each="{label in labels}" onclick="{set}" class="ui {label.color} {basic: !exists(label)} button"> {label.name} </div> </div>','data-label .ui.label,[data-is="data-label"] .ui.label{ padding: 0.36em 0.63em; } data-label .ui.button,[data-is="data-label"] .ui.button{ margin-top: 0.16em; margin-bottom: 0.16em; }',"",function(opts){this.mixin("data"),this.on("update",function(){this.max=opts.block.config.max||1,this.raw=opts.block.config.raw,this.labels=opts.block.config.labels||[]}),this.getColor=function(data){return(this.labels.filter(function(label){return label.name===data.label})[0]||{}).color}
1.bind(this),this.exists=function(label){return this.dataset.filter(function(data){return data.label===label.name}).length}.bind(this),this.set=function(e){for(var removed,i=0;i<this.dataset.length;i++)this.dataset[i].label===e.item.label.name&&(removed=this.dataset.splice(i,1));removed||this.dataset.push(this.raw?e.item.label:{label:e.item.label.name,value:e.item.label.value}),"edit"===this.mode&&this.dataset.length>this.max&&this.dataset.splice(0,this.dataset.length-this.max),this.trigger("change",opts.block,this.dataset),this.update()}.bind(this)}),riot.tag2("data-message",'<div if="{mode === \'view\'}" class="data"> <div each="{data in dataset}"> <i class="mail outline icon"></i> <a href="#" onclick="{view}">{format(data)}</a> </div> </div> <div if="{mode !== \'view\'}"> <div each="{data, i in dataset}" class="fields"> <div class="sixteen wide field"> <ui-dropdown url="{url}" name="{i}" text="{data.name}" onchange="{set}"></ui-dropdown> </div> </div> <button if="{mode === \'edit\' && dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div> <mail-message ref="message"></mail-message>',"","",function(opts){this.mixin("data"),this.on("update",function(){this.max=opts.block.config.max||1,this.raw=opts.block.config.raw,this.url="/m/mails"}),this.set=function(mail,i){mail?this.dataset[i]=this.raw?mail:{id:mail.id,name:mail.name}:(this.dataset.splice(i,1),this.update()),this.trigger("change",opts.block,this.dataset),0===this.dataset.length&&this.add()}.bind(this),this.view=function(e){e.preventDefault(),this.refs.message.show(e.item.data.id)}.bind(this)}),riot.tag2("data-name",'<div if="{mode === \'view\'}" class="data"> <div each="{data in dataset}"> {data.title} {format(data)} </div> </div> <div if="{mode === \'edit\'}" onchange="{stop}"> <div each="{data, i in dataset}" class="fields"> <div class="three wide field"> <ui-dropdown placeholder="Titre" text="{data.title}" url="{url}" name="{i}" onchange="{setTitle}"></ui-dropdown> </div> <div class="six wide field"> <input type="text" placeholder="Prénom" name="firstname" riot-value="{data.firstname}" oninput="{set}"> </div> <div class="seven wide field"> <input type="text" placeholder="Nom" name="lastname" riot-value="{data.particle}{data.lastname}" oninput="{set}"> </div> </div> <button if="{dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div> <div if="{mode === \'filter\'}" onchange="{stop}"> <div each="{data in dataset}" class="fields"> <div class="eight wide field"> <input type="text" placeholder="Prénom" name="firstname" riot-value="{data.firstname}" oninput="{set}"> </div> <div class="eight wide field"> <input type="text" placeholder="Nom" name="lastname" riot-value="{data.lastname}" oninput="{set}"> </div> </div> </div>',"","",function(opts){this.mixin("data"),this.on("update",function(){this.max=opts.block.config.max||1,this.url="/n/block/"+opts.block.id+"/values"}),this.set=function(e){1===e.target.value.length&&(e.target.value=e.target.value.toUpperCase()),e.item.data[e.target.name]=e.target.value.trim(),""===e.item.data[e.target.name]&&delete e.item.data[e.target.name],"lastname"===e.target.name&&delete e.item.data.particle,this.trigger("change",this.opts.block,this.dataset)}.bind(this),this.setTitle=function(value,i){value?this.dataset[i].title=value.name:delete this.dataset[i].title,this.trigger("change",opts.block,this.dataset)}.bind(this)}),riot.tag2("data-number",'<div if="{mode === \'view\'}" class="data"> <div each="{data in dataset}"> {format(data)} </div> </div> <div if="{mode === \'edit\'}" onchange="{stop}"> <div each="{data in dataset}" class="fields"> <div class="sixteen wide field"> <div class="ui {\'right labeled\': unit} input"> <input type="text" placeholder="{name}" name="number" riot-value="{data.number}" oninput="{set}"> <div if="{unit}" class="ui basic label">{unit}</div> </div> </div> </div> <button if="{dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div> <div if="{mode === \'filter\'}" onchange="{stop}"> <div each="{data, i in dataset}" class="fields"> <div class="six wide field"> <ui-dropdown list="{operators}" name="{i}
1" text="{getOperator(data.op)}" onchange="{setOperator}"></ui-dropdown> </div> <div class="{ten: !isRange(data), five: isRange(data)} wide field"> <div class="ui {\'right labeled\': unit} input"> <input type="text" placeholder="{getLabel(data)}" name="number" riot-value="{data.number}" oninput="{set}"> <div if="{unit}" class="ui basic label">{unit}</div> </div> </div> <div if="{isRange(data)}" class="five wide field"> <div class="ui {\'right labeled\': unit} input"> <input type="text" placeholder="Maximum" name="end" riot-value="{data.end}" oninput="{set}"> <div if="{unit}" class="ui basic label">{unit}</div> </div> </div> </div> </div>',"","",function(opts){this.mixin("data"),this.operators=UI.operator.math,this.on("update",function(){this.max=opts.block.config.max||1,this.name=opts.block.name,this.unit=opts.block.config.unit}),this.isRange=function(data){return"bw"===data.op||"nb"===data.op}.bind(this),this.getLabel=function(data){return this.isRange(data)?"Minimum":opts.block.name}.bind(this),this.getOperator=function(id){return(this.operators.filter(function(op){return op.id===id})[0]||this.operators[0]).name}.bind(this),this.set=function(e){e.target.value=e.target.value.replace(",",".").replace(/[^0-9.-]/g,""),"-"!==e.target.value&&(""!==e.target.value?e.item.data[e.target.name]=Number(e.target.value)||0:delete e.item.data[e.target.name],this.trigger("change",opts.block,this.dataset))}.bind(this),this.setOperator=function(op,i){this.dataset[i].op=op&&op.id,this.isRange(this.dataset[i])||delete this.dataset[i].end,this.update(),this.trigger("change",opts.block,this.dataset)}.bind(this)}),riot.tag2("data-option",'<div if="{mode === \'view\'}" class="data"> <div each="{data in dataset}"> {format(data)} </div> </div> <div if="{mode !== \'view\'}"> <div each="{data, i in dataset}" class="fields"> <div class="sixteen wide field"> <ui-dropdown url="{url}" list="{options}" name="{i}" text="{data.name}" onchange="{set}"></ui-dropdown> </div> </div> <button if="{mode === \'edit\' && dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div>',"","",function(opts){this.mixin("data"),this.on("update",function(){this.max=opts.block.config.max||1,this.raw=opts.block.config.raw,this.url=opts.block.config.url||"/n/block/"+opts.block.id+"/values",this.options=opts.block.config.options}),this.set=function(option,i){option?this.dataset[i]=this.raw?option:{id:option.id,name:option.name}:(this.dataset.splice(i,1),this.update()),this.trigger("change",opts.block,this.dataset),0===this.dataset.length&&this.add()}.bind(this)}),riot.tag2("data-phone",'<div if="{mode === \'view\'}" class="{large: !opts.block.parent} data"> <div each="{data in dataset}"> <label if="{data.label}">{data.label}</label> <a href="tel:{data.number}">{format(data)}</a> </div> </div> <div if="{mode === \'edit\'}" onchange="{stop}"> <div each="{data, i in dataset}" class="fields"> <div if="{labels}" class="four wide field"> <ui-dropdown placeholder="Libellé" text="{data.label}" url="{url}" name="{i}" onchange="{setLabel}"></ui-dropdown> </div> <div class="{twelve: labels, sixteen: !labels} wide field"> <input type="text" placeholder="Numéro" name="number" riot-value="{data.number}" oninput="{set}"> </div> </div> <button if="{dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div> <div if="{mode === \'filter\'}" onchange="{stop}"> <div each="{data in dataset}" class="fields"> <div class="sixteen wide field"> <input type="text" placeholder="Numéro" name="number" riot-value="{data.number}" oninput="{set}"> </div> </div> </div>','data-phone .data label,[data-is="data-phone"] .data label{ display: block; font-weight: bold; } data-phone .data.large div,[data-is="data-phone"] .data.large div{ display: flex; } data-phone .data.large label,[data-is="data-phone"] .data.large label{ width: 8em; }',"",function(opts){this.mixin("data"),this.on("update",function(){this.max=opts.block.config.max||1,this.url="/n/block/"+opts.block.id+"/values",this.labels=!!opts.block.config.list}),this.setLabel=function(value,i){value?this.dataset[i].label=value.name:delete this.dataset[i].label,this.trigger("change",opts.block,this.dataset)}.bind(this)}),riot.tag2("data-text",'<div if="{mode === \'view\'}" class="data"> <div each="{data in dataset}"> {format(data)} </div> </div> <div if="{mode === \'edit\'}" onchange="{stop}"> <div each="{data in dataset}" class="fields"> <div class="sixteen wide field"> <input if="{!area}" type="{type}" name="text" riot-value="{data.text}" placeholder="{name}" autocomplete="{type === \'password\' ? \'off\' : \'on\'}" oninput="{set}"> <textarea if="{area}" name="text" oninput="{set}" onkeydown="{stop}">{data.text}</textarea> </div> </div> <button if="{dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div> <div if="{mode === \'filter\'}" onchange="{stop}"> <div each="{data, i in dataset}" class="fields"> <div class="six wide field"> <ui-dropdown list="{operators}" name="{i}
1" text="{getOperator(data.op)}" onchange="{setOperator}"></ui-dropdown> </div> <div class="ten wide field"> <input type="text" placeholder="{name}" name="text" riot-value="{data.text}" oninput="{set}"> </div> </div> </div>','data-text .data,[data-is="data-text"] .data{ white-space: pre-line; }',"",function(opts){this.mixin("data"),this.operators=UI.operator.text,this.on("update",function(){this.max=opts.block.config.max||1,this.name=opts.block.name,this.area=opts.block.config.area,this.type="password"===opts.block.config.type?"password":"text"}),this.getOperator=function(id){return(this.operators.filter(function(op){return op.id===id})[0]||this.operators[0]).name}.bind(this),this.set=function(e){opts.block.config.slug&&(e.target.value=UI.slugify(e.target.value.replace(/^\s+/,""))),e.item.data.text=e.target.value.trim(),""===e.target.value&&delete e.item.data.text,this.trigger("change",opts.block,this.dataset)}.bind(this),this.setOperator=function(op,i){this.dataset[i].op=op&&op.id,this.update(),this.trigger("change",opts.block,this.dataset)}.bind(this)}),riot.tag2("data-time",'<div if="{mode === \'view\'}" class="data"> <div each="{data in dataset}"> {format(data)} </div> </div> <div if="{mode === \'edit\'}" onchange="{stop}"> <div each="{data in dataset}" class="fields"> <div class="{eight: range, sixteen: !range} wide field"> <input type="text" placeholder="{name}" name="time" riot-value="{parse(data.time)}" oninput="{set}"> </div> <div if="{range}" class="eight wide field"> <input type="text" placeholder="Fin" name="time2" riot-value="{parse(data.time2)}" oninput="{set}"> </div> </div> <button if="{dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div> <div if="{mode === \'filter\'}" onchange="{stop}"> <div each="{data, i in dataset}" class="fields"> <div class="six wide field"> <ui-dropdown list="{operators}" name="{i}" text="{getOperator(data.op)}" onchange="{setOperator}"></ui-dropdown> </div> <div class="{ten: !isRange(data), five: isRange(data)} wide field"> <input type="text" placeholder="{getLabel(data)}" name="time" riot-value="{parse(data.time)}" oninput="{set}"> </div> <div if="{isRange(data)}" class="five wide field"> <input type="text" placeholder="Fin" name="end" riot-value="{parse(data.end)}" oninput="{set}"> </div> </div> </div>',"","",function(opts){this.mixin("data"),this.operators=UI.operator.math,this.on("update",function(){this.max=opts.block.config.max||1,this.name=opts.block.name,this.range=opts.block.config.range,this.duration=opts.block.config.duration,this.name=this.range?"Début":opts.block.name}),this.parse=function(str){return str}.bind(this),this.isRange=function(data){return"bw"===data.op||"nb"===data.op}.bind(this),this.getLabel=function(data){return this.isRange(data)?"Début":opts.block.name}.bind(this),this.getOperator=function(id){return(this.operators.filter(function(op){return op.id===id})[0]||this.operators[0]).name}.bind(this),this.set=function(e){e.target.value=e.target.value.replace(",",".").replace(/[^0-9:.]/g,""),""!==e.target.value?e.item.data[e.target.name]=e.target.value:delete e.item.data[e.target.name],this.trigger("change",opts.block,this.dataset)}.bind(this),this.setOperator=function(op,i){this.dataset[i].op=op&&op.id,this.isRange(this.dataset[i])||delete this.dataset[i].end,this.update(),this.trigger("change",opts.block,this.dataset)}.bind(this)}),riot.tag2("data-url",'<div if="{mode === \'view\'}" class="data"> <div each="{data in dataset}"> <a href="{data.url}" target="_blank">{format(data)}</a> </div> </div> <div if="{mode !== \'view\'}" onchange="{stop}"> <div each="{data in dataset}" class="fields"> <div class="sixteen wide field"> <input type="text" placeholder="Adresse URL" name="url" riot-value="{data.url}" oninput="{set}"> </div> </div> <button if="{dataset.length < max}" class="ui right floated button" onclick="{add}"> Ajouter </button> </div>',"","",function(opts){this.mixin("data"),this.on("update",function(){this.max=opts.block.config.max||1})}),riot.tag2("file-carousel",'<div if="{files}" ref="carousel" class="carousel"> <div each="{file in files}"> <img if="{!file.link}" riot-src="{UI.getFileURL(file)}" alt="{file.title || file.name}"> <a if="{file.link}" href="{file.link}"> <img riot-src="{UI.getFileURL(file)}" alt="{file.title || file.name}"> </a> <div if="{file.title || file.description || file.link}" class="content"> <div if="{file.title}" class="title"> {file.title} </div> <div if="{file.description}" class="description"> {file.description} </div> <div if="{file.link}" class="link"> <a href="{file.link}">{file.label}</a> </div> </div> </div> </div>
1','file-carousel img,[data-is="file-carousel"] img{ max-width: 100%; margin: 0 auto; } file-carousel .title,[data-is="file-carousel"] .title{ font-weight: bold; }',"",function(opts){var config=opts.config||{};config.dots=void 0!==opts.dots,config.infinite=void 0!==opts.loop,config.autoplay=void 0!==opts.autoplay,config.autoplaySpeed=Number(opts.speed)||3e3,config.slidesToShow=Number(opts.max)||1,config.slidesToScroll=Number(opts.offset)||1;var url=UI.getResourceURL("slick-carousel","1.8.1");this.on("mount",function(){UI.require([{url:url+"/slick/slick.css",sri:"sha256-3h45mwconzsKjTUULjY+EoEkoRhXcOIU4l5YAw2tSOU="},{url:url+"/slick/slick-theme.css",sri:"sha256-etrwgFLGpqD4oNAFW08ZH9Bzif5ByXK2lXNHKy7LQGo="},{url:url+"/slick/slick.min.js",sri:"sha256-DHF4zGyjT7GOMPBwpeehwoey18z8uiz98G4PRu2lV0A="}],this.init)}),this.init=function(){opts.box&&this.request({method:"GET",url:"/f/files?b="+opts.box,success:function(res){this.files=res.options.filter(function(row){return row.icon.match(/image/)}),this.update(),$(this.refs.carousel).slick(config)}})}.bind(this)}),riot.tag2("file-config",'<div show="{opts.list && opts.list[0]}" ref="button" class="ui icon top left pointing dropdown button"> <i class="setting icon"></i> <div class="menu"> <div class="header">Configuration</div> <div each="{config in opts.list}" class="item" onclick="{show}"> <i class="{config.icon} icon"></i> {config.name} </div> </div> </div> <ui-modal ref="box" type="edit" onsubmit="{notify}"></ui-modal> <ui-config ref="actions"></ui-config>',"","",function(opts){this.on("mount",function(){$(this.refs.button).dropdown({action:"hide"})}),this.show=function(e){this.refs[e.item.config.id].show(e.item.config)}.bind(this),this.notify=function(){this.trigger("change")}.bind(this)}),riot.tag2("file-gallery",'<div if="{files}" id="{id}" class="gallery"> <virtual each="{file in files}"> <img if="{!file.link}" riot-src="{UI.getFileURL(file)}" alt="{file.title || file.name}" data-description="{file.description}"> <a if="{file.link}" href="{file.link}"> <img riot-src="{UI.getFileURL(file)}" alt="{file.title || file.name}" data-description="{file.description}"> </a> </virtual> </div>','file-gallery .gallery,[data-is="file-gallery"] .gallery{ display: none; margin: 0 auto; }',"",function(opts){var mode=(opts.mode||"").split("."),config=opts.config||{};config.gallery_theme=mode[0]||"default",config.gallery_width=opts.width,config.gallery_height=opts.height,config.lightbox_type=opts.lightbox,config.theme_panel_position=opts.position,config.tiles_type=mode[1],config.tile_enable_image_effect=!!opts.effect,config.tile_image_effect_type=opts.effect,config.tile_image_effect_reverse="blur"===opts.effect,config.tile_enable_overlay=!("bw"===opts.effect||"sepia"===opts.effect),config.tile_show_link_icon=!0;var url=UI.getResourceURL("unitegallery","1.7.28");this.on("mount",function(){var core=[{url:url+"/dist/css/unite-gallery.css",sri:"sha256-qfRl/t1jT5MtiSp6T6ocwYvSwsLptGDp9SuwcPfX1O4="},{url:url+"/dist/js/unitegallery.min.js",sri:"sha256-AIxyFJSLgG/TU97rE1NzGNKELo+iJurVLKQp3KXeNVU="}],theme=[{url:url+"/dist/themes/"+config.gallery_theme+"/ug-theme-"+config.gallery_theme+".js",sri:{carousel:"sha256-lNeaBfTTXxx3zsRSi/yyI8X+jfDt2jheYjecQVFECq0=",compact:"sha256-aNBAbjSvCiZgw3U+78V0dVzlYl8NGs+Yf1NA2b6h1cM=",default:"sha256-C4/ZR1piplnwM8Vxv0T3vB6inccKo/9hV0Qp5FWsBm8=",grid:"sha256-ZueE2WepcICTU05Mm7wvIFpITzL344XSq/4jOfldEyc=",slider:"sha256-MsikEbxBLgIlbHG77it+uuzwpjBt651pALX5HYl2qn0=",tiles:"sha256-2gXMkt8VsSOxlVMjxvPGD5Ow3fNVHAPPq127DQTbIY8=",tilesgrid:"sha256-033mOCO7twS4IjJT/cnCCaYczB0fjhRpkpa2miWV+Pg=",video:"sha256-62TScRLMbYSMTCSiZIyUqqd/bZrV5s8rTPIVnN2xjN8="}[config.gallery_theme]}];"default"===config.gallery_theme&&theme.push({url:url+"/dist/themes/default/ug-theme-default.css",sri:"sha256-mwmNUV/rlGyUWoYX7twSHIMLcByV8VXyBWXmrSbtY8E="}),UI.require(core,function(){UI.require(theme,this.init)}.bind(this))}),this.init=function(){opts.box&&(this.id="ug"+Math.round(1e8*Math.random()),this.request({method:"GET",url:"/f/files?b="+opts.box,success:function(res){this.files=res.options.filter(function(row){return row.icon.match(/image/)}
1),this.update(),$("#"+this.id).unitegallery(config)}}))}.bind(this)}),riot.tag2("file-list",'<div if="{tools}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <a class="ui {disabled: !last} icon button" href="{last && last.url}" onclick="{back}"> <i class="level up icon"></i> </a> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> </div> <div if="{controls}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <a class="ui {disabled: !last} icon button" href="{last && last.url}" onclick="{back}"> <i class="level up icon"></i> </a> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> <div> <button class="ui primary button" onclick="{upload}"> Ajouter un fichier </button> <button class="ui button" onclick="{addBox}"> Créer un dossier </button> <file-upload ref="upload" box="{box}" onfinish="{load}"></file-upload> <ui-modal ref="add" type="add" onsubmit="{load}"></ui-modal> <file-config list="{config}" onchange="{load}"></file-config> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" selectable="{selectable}" link="{link}" onsort="{sort}" onselect="{select}" onlink="{view}"></ui-list-table> <file-viewer ref="viewer" onchange="{load}"></file-viewer> <div if="{tools && count}" class="list footer"> <div></div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div> <div if="{controls && count}" class="list footer"> <div> <ui-action list="{actions}" rows="{selection}" onaction="{execute}"></ui-action> <ui-modal ref="download" type="add"></ui-modal> <ui-modal ref="move" type="edit" onsubmit="{load}"></ui-modal> <ui-modal ref="delete" type="delete" onsubmit="{load}"></ui-modal> </div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>',"","",function(opts){this.tools=void 0!==opts.tools,this.controls=void 0!==opts.controls,this.viewer=void 0!==opts.viewer,this.selectable=this.controls||opts.selectable,this.link=opts.link||"$url",this.args=UI.args.files||{},this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.update()}),this.on("update",function(){this.init()}),this.init=function(){opts.box=opts.box||"0",this.box!==opts.box&&(this.box=opts.box,this.base=this.base||this.box,this.args.page=1,this.load(!0))}.bind(this),this.load=function(reset){this.request({method:"PUT",url:"/f/files?b="+this.box,data:this.args,success:function(res){this.last=res.info.parents.slice(-1)[0],this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.actions=res.actions,this.config=res.config,UI.args.files=this.args,opts.link||this.base!==this.box||(this.last=null),res.info.parents.forEach(function(parent){parent.url=UI.link(this.link,parent)},this),this.trigger("load",res.info,reset),this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.select=function(rows){this.selection=rows,this.update()}.bind(this),this.go=function(page){this.args.page=page,this.load(!0)}.bind(this),this.back=function(e){opts.link||(e.preventDefault(),this.root.setAttribute("box",this.last.id),this.update())}.bind(this),this.view=function(row,block,e){if("box"!==row.type||opts.link||(e.preventDefault(),this.root.setAttribute("box",row.id
1),this.update()),"file"===row.type&&this.viewer){e.preventDefault();for(var list=[],start=0,i=0;i<this.rows.length;i++)this.rows[i].id===row.id&&(start=list.length),"file"===this.rows[i].type&&list.push({id:this.rows[i].id,name:this.rows[i].data.name[0].text,hash:this.rows[i].hash});this.refs.viewer.show(list,start)}}.bind(this),this.addBox=function(e){this.refs.add.show({name:"Créer un dossier",size:"small",url:"/f/box?b="+this.box})}.bind(this),this.upload=function(e){this.refs.upload.show()}.bind(this),this.execute=function(action,rows){this[action.type](rows)}.bind(this),this.download=function(rows){var url;1!==rows.length||"file"!==rows[0].type?this.refs.download.show({name:"Télécharger une archive",icon:"download",size:"small",url:"/f/files",rows:rows}):(url=UI.getFileURL({name:rows[0].data.name[0].text,hash:rows[0].hash}),window.location=url+"?dl")}.bind(this),this.move=function(rows){this.refs.move.show({name:"Déplacer "+rows.length+" élément"+(1<rows.length?"s":""),icon:"share",size:"small",url:"/f/files",rows:rows})}.bind(this),this.delete=function(rows){this.refs.delete.show({name:"Supprimer",url:"/f/files",rows:rows,text:"Êtes-vous sûr de vouloir supprimer "+rows.length+" élément"+(1<rows.length?"s":"")+" ?"})}.bind(this)}),riot.tag2("file-media-text",'<div if="{!loading}" class="wrapper"> <table class="ui single line selectable striped celled table"> <thead> <tr> <th each="{label in head}"> {label} </th> </tr> </thead> <tbody> <tr each="{row in rows}"> <td each="{data in row}"> {data} </td> </tr> </tbody> </table> </div> <div if="{loading}" class="ui active loader"></div>','file-media-text .wrapper,[data-is="file-media-text"] .wrapper{ height: 100%; overflow: auto; }',"",function(opts){this.on("mount",function(){this.load()}),this.load=function(){this.request({method:"GET",url:opts.url,dataType:"text",headers:{Range:"bytes=0-1024"},success:function(res){this.set(res)},error:function(){}})}.bind(this),this.set=function(data){for(var rows=data.trim().split("\n"),sep=rows[0].split(",").length>rows[0].split(";").length?",":";",i=0;i<rows.length;i++)rows[i]=rows[i].split(sep);this.head=rows.shift(),this.rows=rows,this.update()}.bind(this)}),riot.tag2("file-upload",'<div ref="modal" class="ui tiny modal"> <div class="header"> <i class="plus icon"></i> Ajouter un fichier </div> <div ref="list" class="content"> <ui-message ref="message"></ui-message> <ui-upload ref="upload" url="{url}" onsend="{wait}" ondone="{hide}"></ui-upload> </div> <div class="actions"> <button ref="cancel" class="ui cancel button"> Annuler </button> </div> </div>',"","",function(opts){this.on("mount",function(){$(document).on("dragenter",this.drag)}),this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.on("unmount",function(){$(document).off("dragenter",this.drag)}),this.show=function(){$(this.refs.modal).modal({closable:!1}),this.url="/f/file?b="+opts.box,this.update(),this.refs.message.reset(),this.refs.upload.reset(),$(this.refs.modal).modal("show")}.bind(this),this.drag=function(e){-1!==Array.prototype.slice.call(e.originalEvent.dataTransfer.types).indexOf("Files")&&this.show()}.bind(this),this.wait=function(){this.refs.cancel.classList.add("disabled")}.bind(this),this.hide=function(errors){errors?this.refs.message.set("error",{title:"Erreur lors du téléchargement",message:errors},!1):$(this.refs.modal).modal("hide"),this.refs.cancel.classList.remove("disabled"),this.trigger("finish")}.bind(this)}),riot.tag2("file-viewer",'<div ref="modal" class="ui fullscreen viewer modal"> <i class="close icon"></i> <div class="file"> <img if="{type === \'image\'}" class="media" riot-src="{url}"> <audio if="{type === \'audio\'}" class="media" riot-src="{url}" autoplay controls loop></audio> <video if="{type === \'video\'}" class="media" riot-src="{url}" autoplay controls loop></video> <file-media-text if="{type === \'csv\'}" class="media full" url="{url}"></file-media-text> <iframe if="{type === \'pdf\'}" class="media full" riot-src="{url}"></iframe> <i if="{arrows}" class="link angle left icon" onclick="{backward}"></i> <i if="{arrows}" class="link angle right icon" onclick="{forward}"></i> </div> <div class="content"> <h3 class="ui header"> {file.name} <div class="sub header">{index + 1} sur {files.length}</div> </h3> <br> <a class="ui button" href="{url}?dl">Télécharger</a> <button class="ui button" onclick="{edit}">Modifier</button> <div if="{form}" class="form" onkeydown="{stop}"> <ui-message ref="message"></ui-message> <ui-form ref="form" blocks="{form.blocks}" data="{form.data}" onchange="{send}" flat></ui-form> <div class="actions"> <button ref="loading" class="ui primary button" onclick="{submit}">Enregistrer</button> </div> </div> </div> </div>','file-viewer .viewer.modal,[data-is="file-viewer"] .viewer.modal{ background: #000; }
1 file-viewer .file,[data-is="file-viewer"] .file{ position: relative; height: 100%; margin-right: 30em; } file-viewer .file .media,[data-is="file-viewer"] .file .media{ position: absolute; margin: auto; width: auto; height: auto; max-width: 100%; max-height: 100%; top: 0; right: 0; bottom: 0; left: 0; } file-viewer .file .media.full,[data-is="file-viewer"] .file .media.full{ width: 100%; height: 100%; border: 0; } file-viewer .file img.media,[data-is="file-viewer"] .file img.media,file-viewer .file iframe.media,[data-is="file-viewer"] .file iframe.media{ background-color: white; } file-viewer .file .icon,[data-is="file-viewer"] .file .icon{ position: absolute; top: 50%; margin-top: -0.5em; z-index: 9; opacity: 0; transition: opacity .3s; font-size: 6em; color: #fff; text-shadow: -1px 0 6px #000, 0 1px 6px #000, 1px 0 6px #000, 0 -1px 6px #000; } file-viewer .file:hover .icon,[data-is="file-viewer"] .file:hover .icon{ opacity: 1; } file-viewer .file .left.icon,[data-is="file-viewer"] .file .left.icon{ left: 0; } file-viewer .file .right.icon,[data-is="file-viewer"] .file .right.icon{ right: 0; } file-viewer .viewer.modal .content,[data-is="file-viewer"] .viewer.modal .content{ position: absolute; width: 30em; height: 100%; overflow: auto; top: 0; right: 0; border-radius: 0 .3rem .3rem 0; } file-viewer .viewer.modal .content .header,[data-is="file-viewer"] .viewer.modal .content .header{ margin-right: 2em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } file-viewer .form,[data-is="file-viewer"] .form{ margin-top: 1em; } file-viewer .form textarea,[data-is="file-viewer"] .form textarea{ height: 10em !important; } file-viewer .form .actions,[data-is="file-viewer"] .form .actions{ padding: 1em 0.5em; text-align: right; }',"",function(opts){this.files=[],this.file={},this.on("mount",function(){$(window).on("resize",this.resize),$(window).on("keydown",this.slide)}),this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.on("unmount",function(){$(window).off("resize",this.resize),$(window).off("keydown",this.slide)}),this.show=function(list,start){if(!list||0===list.length||!list[start])return!1;$(this.refs.modal).modal({context:this.root,onHidden:this.reset}),this.files=list,this.index=start,this.arrows=1<this.files.length,this.resize(),this.load(),$(this.refs.modal).modal("show")}.bind(this),this.resize=function(e){this.refs.modal.style.height=$(window).height()-100+"px"}.bind(this),this.backward=function(e){this.index=0===this.index?this.files.length-1:this.index-1,this.load()}.bind(this),this.forward=function(e){this.index=this.index===this.files.length-1?0:this.index+1,this.load()}.bind(this),this.slide=function(e){this.files.length<2||(37===e.which&&this.backward(),39===e.which&&this.forward())}.bind(this),this.load=function(){this.type=null,this.form=null,this.update(),this.file=this.files[this.index],this.url=UI.getFileURL(this.file);var type,ext=UI.getFileExt(this.file);for(type in UI.filetype)-1!==UI.filetype[type].ext.indexOf(ext)&&(this.type=type);-1!==["csv","pdf"].indexOf(ext)&&(this.type=ext),this.update()}.bind(this),this.reset=function(){this.files=[],this.type=null,this.update()}.bind(this),this.edit=function(){this.request({method:"PATCH",url:"/f/file/"+this.file.id,success:function(res){this.form=res,this.update()},error:function(res){this.refs.message.set("error",res&&res.error)}})}.bind(this),this.submit=function(e){this.refs.form.dump()}.bind(this),this.send=function(data){this.request({method:"PATCH",url:"/f/file/"+this.file.id,data:{data:data},success:function(){this.file.name=data.name[0].text,this.load(),this.trigger("change",this.files)},error:function(res){this.refs.message.set("error",res&&res.error)}})}.bind(this)}),riot.tag2("item-action",'<button each="{action in opts.data}" class="ui {action.color} basic button" onclick="{execute}"> <i class="{action.icon} icon"></i> {action.name} </button> <mail-composer ref="composer" onsubmit="{notify}"></mail-composer> <ui-modal ref="export" type="add" onsubmit="{route}"></ui-modal>','item-action .ui.basic.button,[data-is="item-action"] .ui.basic.button{ margin-top: 0.3em; }',"",function(opts){this.link=opts.link||"#item/$id/$token",this.execute=function(e){1===e.item.action.type?this.sendMail(e):3===e.item.action.type?this.exportItem(e):this.executeAction(e)}.bind(this),this.sendMail=function(e){this.refs.composer.show(null,"/m/mail?i="+opts.item+"&a="+e.item.action.id)}.bind(this),this.exportItem=function(e){this.refs.export.show({name:e.item.action.name,icon:"sign out",url:"/i/item?n="+e.item.action.node+"&i="+opts.item+"&a="+e.item.action.id})}.bind(this),this.executeAction=function(e){e.currentTarget.classList.add("loading"),this.request({method:"POST",url:"/n/action/"+e.item.action.id+"?i="+opts.item,success:function(){this.notify()}})}.bind(this),this.route=function(item){window.location=UI.link(this.link,item)}.bind(this),this.notify=function(){this.trigger("change",!0)}.bind(this)}),riot.tag2("item-calendar",'<div ref="calendar" class="ui calendar"></div> <div ref="modal" class="ui tiny modal"> <div class="header"> <i class="calendar icon"></i> {date} </div> <div class="content"> <div each="{item in items}"> <div class="ui {item.color} label"></div> <span if="{!item.slug}">{item.title}</span> <a if="{item.slug}" href="/{item.slug}">{item.title}</a> </div> </div> <div class="actions"> <button class="ui cancel button">Fermer</button> </div> </div>','item-calendar .item.link,[data-is="item-calendar"] .item.link{ background-color: #767676; color: #fff; } item-calendar .multi.link,[data-is="item-calendar"] .multi.link{ background: repeating-linear-gradient(45deg, #2185d0, #2185d0 10px, #6435c9 10px, #6435c9 20px); } item-calendar .red.link,[data-is="item-calendar"] .red.link{ background-color: #db2828; } item-calendar .orange.link,[data-is="item-calendar"] .orange.link{ background-color: #f2711c; } item-calendar .yellow.link,[data-is="item-calendar"] .yellow.link{ background-color: #fbbd08; } item-calendar .olive.link,[data-is="item-calendar"] .olive.link{ background-color: #b5cc18; } item-calendar .green.link,[data-is="item-calendar"] .green.link{ background-color: #21ba45; } item-calendar .teal.link,[data-is="item-calendar"] .teal.link{ background-color: #00b5ad; } item-calendar .blue.link,[data-is="item-calendar"] .blue.link{ background-color: #2185d0; } item-calendar .violet.link,[data-is="item-calendar"] .violet.link{ background-color: #6435c9; } item-calendar .purple.link,[data-is="item-calendar"] .purple.link{ background-color: #a333c8; } item-calendar .pink.link,[data-is="item-calendar"] .pink.link{ background-color: #e
103997; } item-calendar .brown.link,[data-is="item-calendar"] .brown.link{ background-color: #a5673f; } item-calendar .grey.link,[data-is="item-calendar"] .grey.link{ background-color: #767676; } item-calendar .black.link,[data-is="item-calendar"] .black.link{ background-color: #1b1c1d; }',"",function(opts){this.args={};var url=UI.getResourceURL("semantic-ui-calendar","0.0.8");this.on("mount",function(){this.update(),UI.require([{url:url+"/dist/calendar.min.css",sri:"sha256-KCHiPtYk/vfF5/6lDXpz5r5FuIYchVdai0fepwGft80="},{url:url+"/dist/calendar.min.js",sri:"sha256-Pnz4CK94A8tUiYWCfg/Ko25YZrHqOKeMS4JDXVTcVA0="}],this.load)}),this.on("updated",function(){this.init()}),this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.init=function(){var item;this.node===opts.node&&this.view===opts.view||(this.node=opts.node,this.view=opts.view,this.args={view:this.view?Number(this.view):void 0,sort:0,limit:opts.limit||1e3},item=UI.getItem(),opts.filter&&item&&(this.args.filters=[{id:Number(opts.filter),data:[item]}]),this.load())}.bind(this),this.load=function(){$.fn.calendar&&($(this.refs.calendar).calendar({type:"date",firstDayOfWeek:1,monthFirst:!1,ampm:!1,text:UI.date,onChange:this.show}),$(".calendar",this.refs.calendar).on("mouseup",this.refresh),this.request({method:"PUT",url:"/n/node/"+this.node+"/items",data:this.args,success:function(res){var self=this,tblock=res.cols.filter(function(col){return!0===col.config.title})[0],lblock=res.cols.filter(function(col){return"label"===col.type})[0],blocks=res.cols.filter(function(col){return"date"===col.type});this.events=res.rows.reduce(function(events,row){return events.concat(blocks.reduce(function(list,block){return list.concat((row.data[block.id]||[]).map(function(data){return data.date2?{date:new Date(data.date),date2:new Date(data.date2),title:self.getTitle(tblock,row),color:self.getColor(lblock,row),slug:row.slug}:{date:new Date(data.date),title:self.getTitle(tblock,row),color:self.getColor(lblock,row),slug:row.slug}}))},[]))},[]),this.args=res.args,this.refresh()}}))}.bind(this),this.getTitle=function(block,row){var data=row.data[block.id]&&row.data[block.id][0];return data&&UI.format[block.type].call(block.config,data)}.bind(this),this.getColor=function(block,row){var data=row.data[block.id]&&row.data[block.id][0];return data&&((block.config.labels||[]).filter(function(label){return label.name===data.label})[0]||{}).color}.bind(this),this.refresh=function(){if("day"===$(this.refs.calendar).calendar("get mode"))for(var date=$(this.refs.calendar).calendar("get focusDate"),cells=$("td.link:not(.disabled)",this.refs.calendar),i=1;i<=31;i++){var multi,item,items=this.events.filter(function(event){return event.date2?new Date(event.date).setHours(0,0,0,0)<=new Date(date.getFullYear(),date.getMonth(),i).setHours(0,0,0,0)&&new Date(event.date2).setHours(0,0,0,0)>=new Date(date.getFullYear(),date.getMonth(),i).setHours(0,0,0,0):event.date.getFullYear()===date.getFullYear()&&event.date.getMonth()===date.getMonth()&&event.date.getDate()===i});0<items.length&&(multi=1<items.length,item=items[0],$(cells[i-1]).removeClass("active").addClass("item "+(multi?"multi":item.color)).attr("data-content",multi?items.length+" éléments...":item.title).popup())}}.bind(this),this.show=function(date){var items=this.events.filter(function(event){return event.date2?new Date(event.date).setHours(0,0,0,0)<=new Date(date.getFullYear(),date.getMonth(),date.getDate()).setHours(0,0,0,0)&&new Date(event.date2).setHours(0,0,0,0)>=new Date(date.getFullYear(),date.getMonth(),date.getDate()).setHours(0,0,0,0):event.date.getFullYear()===date.getFullYear()&&event.date.getMonth()===date.getMonth()&&event.date.getDate()===date.getDate()});0!==items.length&&(1===items.length&&items[0].slug?window.location.href="/"+items[0].slug:(this.date=date.toLocaleDateString(),this.items=items,this.update(),$(this.refs.modal).modal("show")))}.bind(this)}),riot.tag2("item-comments",'<div if="{!comments}" class="ui active centered inline loader"></div> <div if="{comments}" class="ui comments"> <p if="{!comments.length}">Aucun commentaire</p> <div each="{comment in comments}" class="comment"> <a if="{comment.created.id}" href="{UI.link(link, comment.created)}" class="author"> {comment.created.by} </a> <span if="{!comment.created.id}" class="anonymous author"> Anonyme </span> <div class="metadata"> <span class="date" title="{formatDate(comment.created.at)}"> {formatDate(comment.created.at, true)}
1 </span> </div> <div class="text"> <p>{comment.message}</p> </div> </div> <div class="ui reply form" onchange="{stop}"> <div class="field"> <textarea ref="message" placeholder="Ajouter un commentaire..."></textarea> </div> <button class="ui basic button" onclick="{add}"> <i class="check icon"></i> Envoyer </button> </div> </div>','item-comments .ui.comments .comment .anonymous.author,[data-is="item-comments"] .ui.comments .comment .anonymous.author{ color: grey; } item-comments .ui.comments .comment .date,[data-is="item-comments"] .ui.comments .comment .date{ cursor: help; } item-comments .ui.comments .comment .text,[data-is="item-comments"] .ui.comments .comment .text{ white-space: pre-line; } item-comments .ui.comments .reply.form textarea,[data-is="item-comments"] .ui.comments .reply.form textarea{ height: 8em; }',"",function(opts){this.link=opts.link||"#item/$id/$token",this.on("mount",function(){return 0===opts.data.count?(this.comments=[],void this.update()):void this.load()}),this.load=function(){this.request({method:"GET",url:"/i/item/"+opts.item+"/comments",success:function(res){this.comments=res.comments,this.update()}})}.bind(this),this.formatDate=function(date,relative){return UI.format.date.call({type:"datetime",relative:!!relative},{date:date})}.bind(this),this.add=function(e){var message=this.refs.message.value.trim();message&&this.request({method:"POST",url:"/i/comment?i="+opts.item,data:{message:message},success:function(){this.refs.message.value="",this.load()}})}.bind(this)}),riot.tag2("item-content",'<div class="content"> <div if="{contents && contents.length !== 1}" class="ui secondary pointing menu"> <a each="{content in contents}" onclick="{setLanguage}" class="item {active: content.id === language}"> <i class="{content.id} flag"></i> {content.name} </a> </div> <ui-form blocks="{blocks}" data="{data}" live="true" onchange="{send}"></ui-form> </div> <aside if="{controls}"> <div ref="widgets" class="ui styled accordion"> <virtual each="{widget in widgets}"> <div class="title {active: !widget.hidden}" onclick="{initWidget}"> <i class="{widget.icon} icon"></i> {widget.name} </div> <div class="content {active: !widget.hidden}"> <div if="{!widget.hidden || widget.init}" data-is="{widget.tag}" item="{item}" data="{widget.data}" onchange="{load}"></div> </div> </virtual> </div> <div show="{links && links.length}" ref="links" class="ui styled accordion"> <virtual each="{link in links}"> <div class="title" onclick="{initLink}"> <i class="{link.icon} icon"></i> {link.name} <span if="{link.count}">({link.count})</span> </div> <div class="content"> <item-link if="{link.init}" item="{item}" data="{link.data}" onchange="{load}"></item-link> </div> </virtual> </div> </aside> <nav if="{controls}"> <i if="{context}" class="big arrow left link icon" onclick="{backward}"></i> <i class="big arrow up link icon" onclick="{scrollTop}"></i> <i if="{context}" class="big arrow right link icon" onclick="{forward}"></i> </nav>','item-content,[data-is="item-content"]{ display: flex; } item-content > .content,[data-is="item-content"] > .content{ width: 66%; } item-content > aside,[data-is="item-content"] > aside{ position: sticky; align-self: flex-start; width: 34%; top: 1em; margin-left: 1em; margin-bottom: 2em; } item-content > aside .ui.styled.accordion,[data-is="item-content"] > aside .ui.styled.accordion{ width: 100%; margin-bottom: 2em; } item-content > aside .ui.styled.accordion:first-child .title,[data-is="item-content"] > aside .ui.styled.accordion:first-child .title{ font-size: 1.3em; } item-content > aside .ui.styled.accordion .title span,[data-is="item-content"] > aside .ui.styled.accordion .title span{ font-weight: normal; } item-content > nav,[data-is="item-content"] > nav{ position: fixed; bottom: 2em; right: 2em; text-align: center; } @media print { item-content > aside,[data-is="item-content"] > aside,item-content > nav,[data-is="item-content"] > nav{ display: none; } item-content,[data-is="item-content"],item-content > .content .ui.grid,[data-is="item-content"] > .content .ui.grid{ display: block; } }',"",function(opts){this.controls=void 0!==opts.controls,this.link=opts.link||"#item/$id/$token",this.on("mount",function(){$(this.refs.widgets).accordion({exclusive:!1}),$(this.refs.links).accordion({exclusive:!0}),this.init()}),this.on("updated",function(){this.init()}),this.init=function(){this.item!==opts.item&&(this.item=opts.item,this.load(!0))}.bind(this),this.load=function(reset){this.request({method:"GET",url:"/i/item/"+this.item+"/content?t="+opts.token+(this.controls?"&c":""),success:function(res){var position,total;!0===reset&&(this.blocks=res.blocks),this.info=res.info,this.contents=res.content,this.widgets=res.widgets,this.links=res.links,this.context=this.getContext(this.info.node),this.language=reset||!this.language?res.content[0].id:this.language,this.context&&(position=this.context.position.toLocaleStr
1ing(),total=this.context.info.count.toLocaleString(),this.info.description+=" ("+position+" sur "+total+")");var content=res.content.filter(function(content){return content.id===this.language},this)[0];this.data=content?content.data:{},this.trigger("load",res.info,reset),this.update()}})}.bind(this),this.getContext=function(node){if(UI.context["items:"+node]){var context=UI.context["items:"+node];if(context.index=null,context.rows.forEach(function(row,i){context.index=row.id===Number(this.item)?i:context.index},this),null!==context.index)return context.position=(context.args.page-1)*context.args.limit+context.index+1,context}}.bind(this),this.setLanguage=function(e){this.language=e.item.content.id,this.data=e.item.content.data,this.update()}.bind(this),this.send=function(data){$.isEmptyObject(data)||this.request({method:"PATCH",url:"/i/item/"+this.item+"/content",data:{language:this.language,data:data},success:function(){this.load()}})}.bind(this),this.initWidget=function(e){e.item.widget.init=!0,this.update()}.bind(this),this.initLink=function(e){e.item.link.init=!0,this.update()}.bind(this),this.scrollTop=function(e){window.scrollTo({top:0,behavior:"smooth"})}.bind(this),this.backward=function(e){this.go(-1)}.bind(this),this.forward=function(e){this.go(1)}.bind(this),this.go=function(offset){var rows=this.context.rows,args=this.context.args,target=rows[this.context.index+offset];target?window.location=UI.link(this.link,target):args.page+offset===0||rows.length<args.limit||(args.page+=offset,this.request({method:"PUT",url:"/n/node/"+this.info.node+"/items",data:args,success:function(res){UI.context["items:"+this.info.node]=res,(target=res.rows[this.context.index?0:res.rows.length-1])&&(window.location=UI.link(this.link,target))}}))}.bind(this)}),riot.tag2("item-delete",'<div ref="modal" class="ui tiny modal"> <div class="header"> <i class="remove icon"></i> Supprimer </div> <div if="{step === 1}" class="content"> <ui-message ref="message"></ui-message> <ui-upload ref="upload" url="{url}" accept=".csv" limit="1" onfile="{process}" onerror="{alert}"></ui-upload> </div> <div if="{step === 2}" class="content"> <div class="ui blue progress"> <div class="bar" riot-style="width: {loaded}%;"></div> <div class="label"> <i class="spinner loading icon"></i> Suppression en cours, veuillez patienter... </div> </div> </div> <div if="{step === 3}" class="content"> <p>Le traitement du fichier est terminé</p> <ul> <li>{format(stats.lines, \'ligne? traitée?\')}</li> <li>{format(stats.errors, \'erreur?\')}</li> </ul> <ul> <li>{format(stats.deleted, \'élément? supprimé?\')}</li> </ul> <p if="{stats.errors !== 0}"> <a href="/log/import-{token}.csv">Télécharger le rapport d\'erreur</a> </p> </div> <div class="actions"> <button ref="disabled" class="ui cancel button">{step !== 4 ? \'Annuler\' : \'Fermer\'}</button> </div> </div>',"","",function(opts){this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.show=function(){$(this.refs.modal).modal({closable:!1}),this.step=1,this.url="/i/items?n="+opts.node,this.update(),this.refs.message.reset(),this.refs.upload.reset(),$(this.refs.modal).modal("show")}.bind(this),this.alert=function(error){this.refs.message.set("error",error)}.bind(this),this.process=function(data){this.token=data.token,this.step=2,this.loaded=0,this.update(),this.request({method:"DELETE",url:this.url,dataType:"text",data:{token:this.token},progress:function(e){this.loaded=Math.floor(e.loaded/e.total*100),this.update()},success:function(res){this.stats=this.decode(res,["lines","errors","deleted"]),this.step=3,this.update(),this.trigger("finish")}})}.bind(this),this.decode=function(str,keys){return keys.reduce(function(obj,key,i){return obj[key]=parseInt(str.substr(8*(i-keys.length),8),16),obj},{})}.bind(this),this.format=function(num,text){return num+" "+text.replace(/\?/g,1<num?"s":"")}.bind(this)}),riot.tag2("item-export",'<div ref="modal" class="ui small modal"> <div class="header"> <i class="sign out icon"></i> Exporter </div> <div if="{form}" class="content"> <ui-message ref="message"></ui-message> <ui-form ref="form" blocks="{form.blocks}" data="{form.data}" onchange="{process}
1"></ui-form> </div> <div class="actions"> <button class="ui primary button" onclick="{submit}">Exporter</button> <button ref="disabled" class="ui cancel button">Annuler</button> </div> </div>',"","",function(opts){this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.show=function(){$(this.refs.modal).modal({closable:!1}),this.request({method:"PUT",url:"/i/items?n="+opts.node,success:function(res){this.form=res,this.update(),$(this.refs.modal).modal("show")}})}.bind(this),this.submit=function(e){this.refs.form.dump()}.bind(this),this.process=function(data){var cols=opts.cols.filter(function(column){return!column.hidden}).map(function(column){return{id:column.id}});this.request({method:"PUT",url:"/i/items?n="+opts.node,data:{cols:cols,data:data,args:{sort:opts.data.sort,dir:opts.data.dir,search:opts.data.search,filters:opts.data.filters,duplicates:opts.data.duplicates}},success:function(res){window.location=res.url,$(this.refs.modal).modal("hide")},error:function(res){$(this.refs.modal).modal("show"),this.refs.message.set("error",res&&res.error)}})}.bind(this)}),riot.tag2("item-gallery",'<div if="{tools}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> </div> </div> <div class="{list: list, \'three-columns grid\': !list}"> <div each="{row in rows}" class="item"> <div if="{blocks.image && list}" class="image"> <a if="{row.data[blocks.image.id]}" href="{getLink(row)}" onclick="{show}"> <img riot-src="{UI.getFileURL(row.data[blocks.image.id][0])}"> </a> </div> <div class="content"> <div if="{blocks.image && !list}" class="image" riot-style="{getOrder(1)}"> <a if="{row.data[blocks.image.id]}" href="{getLink(row)}" onclick="{show}"> <img riot-src="{UI.getFileURL(row.data[blocks.image.id][0])}"> </a> </div> <div if="{blocks.title && row.data[blocks.title.id]}" class="title" riot-style="{getOrder(2)}"> <h3><a href="{getLink(row)}" onclick="{show}">{format(blocks.title, row)}</a></h3> </div> <div if="{blocks.label && row.data[blocks.label.id]}" class="label" riot-style="{getOrder(3)}"> <data-label mode="view" block="{blocks.label}" dataset="{row.data[blocks.label.id]}"></data-label> </div> <div if="{blocks.date && row.data[blocks.date.id]}" class="date" riot-style="{getOrder(4)}"> <data-date mode="view" block="{blocks.date}" dataset="{row.data[blocks.date.id]}"></data-date> </div> <div if="{blocks.text && row.data[blocks.text.id]}" class="text" riot-style="{getOrder(5)}"> {format(blocks.text, row)} </div> <div class="more"> <a href="{getLink(row)}" onclick="{show}">Lire la suite</a> </div> </div> </div> </div>','item-gallery .list .item,[data-is="item-gallery"] .list .item{ border-bottom: 1px solid #ccc; display: flex; padding: 0.5em 0; } item-gallery .grid .image,[data-is="item-gallery"] .grid .image{ position: relative; overflow: hidden; height: 14em; } item-gallery .list .image,[data-is="item-gallery"] .list .image{ position: relative; flex-shrink: 0; width: 8em; height: 8em; } item-gallery .image img,[data-is="item-gallery"] .image img{ position: absolute; margin: auto; max-width: 100%; top: 0; right: 0; bottom: 0; left: 0; } item-gallery .list .image img,[data-is="item-gallery"] .list .image img{ max-height: 100%; } item-gallery .content,[data-is="item-gallery"] .content{ display: flex; flex-direction: column; } item-gallery .grid .content,[data-is="item-gallery"] .grid .content{ text-align: center; } item-gallery .list .content,[data-is="item-gallery"] .list .content{ overflow: hidden; flex-grow: 1; } item-gallery .content > .title,[data-is="item-gallery"] .content > .title,item-gallery .content > .label,[data-is="item-gallery"] .content > .label,item-gallery .content > .text,[data-is="item-gallery"] .content > .text,item-gallery .content > .date,[data-is="item-gallery"] .content > .date{ margin: 0.3em 1em; } item-gallery .content > .label .data,[data-is="item-gallery"] .content > .label .data{ padding: 0; } item-gallery .more,[data-is="item-gallery"] .more{ order: 9; } item-gallery .list .more,[data-is="item-gallery"] .list .more{ text-align: right; font-weight: bold; } item-gallery .grid .more a,[data-is="item-gallery"] .grid .more a{ background: #eee; display: block; line-height: 2em; }',"",function(opts){this.args={},this.tools=void 0!==opts.tools,this.list="list"===opts.layout,this.order=opts.order||"12345",this.limit=Number(opts.limit)||3,this.on("mount",function(){this.init()}),this.on("updated",function(){this.init()}),this.init=function(){var item;this.node===opts.node&&this.view===opts.view||(this.node=opts.node,this.view=opts.view,this.args=this.view?{view:Number(this.view)}:{sort:0,dir:-1,limit:this.limit},item=UI.getItem(),opts.filter&&item&&(this.args.filters=[{id:Number(opts.filter),data:[item]}]),this.args.slug=!0,this.load())}.bind(this),this.load=function(){this.request({method:"PUT",url:"/n/node/"+this.node+"/items",data:this.args,success:function(res){this.blocks=this.getBlocks(res.cols),this.rows=res.rows.slice(0,this.limit),this.args=res.args,this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.getBlocks=function(cols){return{image:cols.filter(function(col){return"file"===col.type})[0],title:cols.filter(function(col){return!0===col.config.title})[0],label:cols.filter(function(col){return"label"===col.type})[0],date:cols.filter(function(col){return"date"===col.type})[0],text:cols.filter(function(col){return("text"===col.type||"html"===col.type)&&!col.config.title})[0]}}.bind(this),this.getOrder=function(block){return{order:this.order.indexOf(block)+1}}.bind(this),this.getLink=function(row){var path=window.location.pathname.replace(/\/$/,"");return row.slug?path+"/"+row.slug:"#"}.bind(this),this.format=function(block,row){var data=row.data[block.id]&&row.data[block.id][0],text=UI.format[block.type].call(block.config,data),length=opts.length||(this.list?200:100);return text.length>length?text.slice(0,length)+"...":text}.bind(this),this.show=function(e){opts.theme&&(document.cookie="ftheme="+opts.theme)}.bind(this)}),riot.tag2("item-history",'<div class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-menu-filter if="{!opts.item}" list="{filters}" data="{args}" class="keep" onchange="{filter}"></ui-menu-filter> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> <div></div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" link="#" onsort="{sort}" onlink="{view}"></ui-list-table> <div if="{count}" class="list footer"> <div></div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div> <div if="{form}" ref="modal" class="ui modal"> <i class="close icon"></i> <div class="header"> <i class="time icon"></i> Détails de l\'historique </div> <div class="content"> <ui-form ref="form" blocks="{form.blocks}" data="{form.data}" live="true"></ui-form> </div> <div class="actions"> <button ref="disabled" class="ui cancel button">Fermer</button> </div> </div>',"","",function(opts){this.args={},opts.item&&(this.args={filters:[{id:"target",data:[{id:opts.item}]}]}),this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.load(!0)}),this.load=function(reset){this.request({method:"PUT",url:"/i/history",data:this.args,success:function(res){this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.filters=res.filters,this.trigger("load",res.info,reset),this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.filter=function(list){this.args.filters=list,this.args.page=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.go=function(page){this.args.page=page,this.load(!0)}.bind(this),this.view=function(row,block,e){e.preventDefault(),this.request({method:"GET",url:"/i/history/"+row.id,success:function(res){this.form=res,this.update(),$(this.refs.modal).modal("show"),this.refs.modal.parentNode.scrollTop=0}})}.bind(this)}),riot.tag2("item-import",'<div ref="modal" class="ui modal"> <div class="header"> <i class="sign in icon"></i> Importer </div> <div if="{step === 1}" class="content"> <ui-message ref="message"></ui-message> <ui-upload ref="upload" url="{url}" accept=".csv" limit="1" onfile="{set}" onerror="{alert}" ondone="{match}"></ui-upload> </div> <div if="{step === 2}" class="content"> <p>
1Veuillez associer les colonnes du fichier téléchargé avec les champs existants.</p> <ui-form ref="form" blocks="{form.blocks}" data="{form.data}" onchange="{process}"></ui-form> </div> <div if="{step === 3}" class="content"> <div class="ui blue progress"> <div class="bar" riot-style="width: {loaded}%;"></div> <div class="label"> <i class="spinner loading icon"></i> Import en cours, veuillez patienter... </div> </div> </div> <div if="{step === 4}" class="content"> <p>Le traitement du fichier est terminé</p> <ul> <li>{format(stats.lines, \'ligne? traitée?\')}</li> <li>{format(stats.errors, \'erreur?\')}</li> </ul> <ul> <li>{format(stats.created, \'élément? ajouté?\')}</li> <li>{format(stats.updated, \'élément? modifié?\')}</li> </ul> <p if="{stats.errors !== 0}"> <a href="/log/import-{token}.csv">Télécharger le rapport d\'erreur</a> </p> </div> <div class="actions"> <button if="{step === 2}" class="ui primary button" onclick="{submit}">Importer</button> <button ref="disabled" class="ui cancel button">{step !== 4 ? \'Annuler\' : \'Fermer\'}</button> </div> </div>',"","",function(opts){this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.show=function(){$(this.refs.modal).modal({closable:!1}),this.step=1,this.url="/i/items?n="+opts.node,this.update(),this.refs.modal.classList.add("tiny"),this.refs.message.reset(),this.refs.upload.reset(),$(this.refs.modal).modal("show")}.bind(this),this.set=function(data){this.token=data.token,this.form=data}.bind(this),this.alert=function(error){this.refs.message.set("error",error)}.bind(this),this.match=function(){this.step=2,this.update(),this.refs.modal.classList.remove("tiny")}.bind(this),this.submit=function(e){this.refs.form.dump()}.bind(this),this.process=function(data){this.step=3,this.loaded=0,this.update(),this.refs.modal.classList.add("tiny"),this.request({method:"POST",url:this.url,dataType:"text",data:{token:this.token,match:data},progress:function(e){this.loaded=Math.floor(e.loaded/e.total*100),this.update()},success:function(res){this.stats=this.decode(res,["lines","errors","created","updated"]),this.step=4,this.update(),this.trigger("finish")}})}.bind(this),this.decode=function(str,keys){return keys.reduce(function(obj,key,i){return obj[key]=parseInt(str.substr(8*(i-keys.length),8),16),obj},{})}.bind(this),this.format=function(num,text){return num+" "+text.replace(/\?/g,1<num?"s":"")}.bind(this)}),riot.tag2("item-info",'<p if="{opts.data.created}"> Créé <span if="{opts.data.created.at}"> le {formatDate(opts.data.created.at)} </span> <span if="{opts.data.created.by && !opts.data.created.id}"> par {opts.data.created.by} </span> <span if="{opts.data.created.by && opts.data.created.id}"> par <a href="{UI.link(link, opts.data.created)}">{opts.data.created.by}</a> </span> </p> <p if="{opts.data.updated}"> Modifié <span if="{opts.data.updated.at}"> le {formatDate(opts.data.updated.at)} </span> <span if="{opts.data.updated.by && !opts.data.updated.id}"> par {opts.data.updated.by} </span> <span if="{opts.data.updated.by && opts.data.updated.id}"> par <a href="{UI.link(link, opts.data.updated)}">{opts.data.updated.by}</a> </span> </p> <p if="{opts.data.locked}"> Verrouillé <span if="{opts.data.locked.at}"> le {formatDate(opts.data.locked.at)} </span> </p> <p if="{opts.data.form}"> Ajouté via le formulaire <b>{opts.data.form}</b> </p> <button class="ui basic button" onclick="{export}"> <i class="sign out icon"></i> Exporter </button> <button class="ui basic button" onclick="{clone}"> <i class="clone icon"></i> Dupliquer </button> <button if="{!opts.data.locked}" class="ui basic red button" onclick="{delete}"> <i class="remove icon"></i> Supprimer </button> <ui-modal ref="export" type="add" onsubmit="{notify}"></ui-modal> <ui-modal ref="clone" type="add" onsubmit="{route}"></ui-modal> <ui-modal ref="delete" type="delete" onsubmit="{route}"></ui-modal>','item-info .ui.button,[data-is="item-info"] .ui.button{ margin-top: 0.3em; }',"",function(opts){this.link=opts.link||"#item/$id/$token",this.formatDate=function(date){return UI.format.date.call({type:"datetime"},{date:date})}.bind(this),this.export=function(e){this.refs.export.show({name:"Exporter",icon:"sign out",size:"small",url:"/i/item/"+opts.item})}.bind(this),this.clone=function(e){this.refs.clone.show({name:"Dupliquer",icon:"clone",url:"/i/item?n="+opts.data.node+"&i="+opts.item})}.bind(this),this.delete=function(e){this.refs.delete.show({name:"Supprimer",url:"/i/item/"+opts.item,text:"Êtes-vous sûr de vouloir supprimer cet élément ?"})}.bind(this),this.route=function(item){window.location=item.id?UI.link(this.link,item):"#node/"+opts.data.node}.bind(this),this.notify=function(){this.trigger("change")}.bind(this)}),riot.tag2("item-link",'<div class="list header"> <div> <ui-search data="{args}" onchange="{search}"></ui-search> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> <div> <button class="ui primary button" onclick="{add}"> Ajouter </button> <button class="ui icon button" onclick="{config}"> <i class="setting icon"></i> </button> <ui-modal ref="add" type="add" onsubmit="{load}"></ui-modal> <ui-modal ref="config" type="edit" onsubmit="{notify}"></ui-modal> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" link="#item/$id/$token" onsort="{sort}" onlink="{setContext}"></ui-list-table> <div class="list footer"> <div></div> <ui-pagination data="{args}" count="{count}" more="1" onchange="{go}"></ui-pagination> </div>',"","",function(opts){this.args={filters:[{id:opts.data.block,data:[{id:opts.item}]}]},this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.load()}),this.load=function(){this.request({method:"PUT",url:"/n/node/"+opts.data.node+"/items",data:this.args,success:function(res){this.data=res,this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.go=function(page){this.args.page=page,this.load()}.bind(this),this.setContext=function(){UI.context["items:"+opts.data.node]=this.data}.bind(this),this.add=function(e){this.refs.add.show({name:"Ajouter",url:"/i/item?n="+opts.data.node+"&b="+opts.data.block+"&i="+opts.item})}.bind(this),this.config=function(e){this.refs.config.show({name:"Configurer la relation",icon:"setting",size:"tiny",url:"/i/item/"+opts.item+"/link/"+opts.data.block})}.bind(this),this.notify=function(){this.trigger("change")}.bind(this)}),riot.tag2("item-list",'<div if="{tools}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-menu-filter list="{filters}" data="{args}" class="keep" onchange="{filter}"></ui-menu-filter> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> </div> <div if="{controls}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-menu-filter list="{filters}" data="{args}" class="keep" onchange="{filter}"></ui-menu-filter> <ui-menu-layout list="{layouts}" data="{args}" onchange="{setLayout}"></ui-menu-layout> <ui-menu-column list="{columns}" onchange="{setColumnOrder}"></ui-menu-column> <ui-menu-view url="/n/node/{opts.node}/views" onchange="{setView}" onadd="{addView}"></ui-menu-view> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> <div> <button class="ui primary button" onclick="{add}"> Ajouter </button> <ui-modal ref="add" type="add" onsubmit="{route}"></ui-modal> <node-toolbox list="{toolbox}" node="{opts.node}" cols="{cols}" data="{args}" onchange="{load}"></node-toolbox> <node-config list="{config}" onchange="{load}"></node-config> </div> </div> <div class="{wrapper: widgets && widgets.length}"> <div class="list"> <ui-list-table if="{layout === 1}" cols="{cols}" rows="{rows}" data="{args}" selectable="{selectable}" link="{link}" size="{opts.size}" onsort="{sort}" onselect="{select}" onlink="{show}"></ui-list-table> <ui-list-card if="{layout === 2}" cols="{cols}" rows="{rows}" data="{args}" selectable="{selectable}" link="{link}" size="{opts.size}" onselect="{select}" onlink="{show}"></ui-list-card> <node-form if="{item}" ref="form" form="{opts.form}" token="{item.token}" onsubmit="{load}" modal></node-form> <div if="{tools && count}" class="list footer"> <div></div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div> <div if="{controls && count}" class="list footer"> <div> <ui-action list="{actions}" rows="{selection}" onaction="{execute}"></ui-action> <ui-modal ref="merge" type="edit" onsubmit="{load}"></ui-modal> <ui-modal ref="delete" type="delete" onsubmit="{load}"></ui-modal> </div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div> </div> <aside if="{widgets && widgets.length}"> <div ref="widgets" class="ui styled accordion"> <virtual each="{widget in widgets}"> <div class="title active"> <i class="{widget.icon} icon"></i> {widget.name} </div> <div class="content active"> <div data-is="{widget.tag}" node="{node}" data="{widget.data}" args="{args}" onchange="{load}"></div> </div> </virtual> </div> <button class="ui fluid basic button" onclick="{hideWidgets}">Masquer</button> </aside> </div>','item-list .wrapper,[data-is="item-list"] .wrapper{ display: flex; } item-list .wrapper > .list,[data-is="item-list"] .wrapper > .list{ width: 80%; } item-list .wrapper > aside,[data-is="item-list"] .wrapper > aside{ position: sticky; align-self: flex-start; width: 20%; top: 1em; margin-left: 1em; } item-list .wrapper > aside .ui.styled.accordion,[data-is="item-list"] .wrapper > aside .ui.styled.accordion{ width: 100%; margin-bottom: 1em; }',"",function(opts){this.tools=void 0!==opts.tools,this.controls=void 0!==opts.controls,this.selectable=this.controls||opts.selectable,this.link=opts.link||(opts.form?"#":null),this.args={},this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.init()}),this.on("updated",function(){this.init()}),this.init=function(){var item;this.node===opts.node&&this.view===opts.view||(this.node=opts.node,this.view=opts.view,this.args=this.view?{view:Number(this.view)}:UI.args["items:"+this.node]||{},this.order=null,item=UI.getItem(),opts.filter&&item&&(this.args.filters=[{id:Number(opts.filter),data:[item]}]),this.controls?this.request({method:"GET",url:"/n/node/"+this.node,cache:!0,success:function(res){this.filters=res.filters,this.layouts=res.layouts,this.actions=res.actions,this.widgets=res.widgets,this.toolbox=res.toolbox,this.config=res.config,this.load(!0)}}):this.load(!0))}.bind(this),this.load=function(reset,args){this.request({method:"PUT",url:"/n/node/"+this.node+"/items",data:args||opts.args||this.args,success:function(res){this.data=res,this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.layout=res.args.layout,this.columns=res.cols,this.tools&&(this.filters=res.cols),opts.args||(UI.args["items:"+this.node]=this.args),this.setColumns(),this.trigger("load",res.info,reset),this.update(),$(this.refs.widgets).accordion({exclusive:!1})}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.filter=function(list){this.args.filters=list,this.args.page=1,this.load()}.bind(this),this.setLayout=function(id){this.args.layout=id,this.load()}.bind(this),this.setColumnOrder=function(list){this.order=list,this.setColumns(),this.update()}.bind(this),this.setView=function(id){this.order=null,this.args={view:id},this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.select=function(rows){this.selection=rows,this.update()}.bind(this),this.go=function(page){this.args.page=page,this.load(!0)}.bind(this),this.show=function(row,col,e){UI.context["items:"+this.node]=this.data,opts.form&&(e.preventDefault(),this.item=row,this.update(),this.refs.form.show())}.bind(this),this.setColumns=function(){this.order&&(this.cols=this.order.map(function(id){return this.columns.filter(function(column){return column.id===id})[0]},this).filter(function(column){return!!column}))}.bind(this),this.add=function(e){this.refs.add.show({name:"Ajouter",url:"/i/item?n="+this.node})}.bind(this),this.route=function(item){window.location=UI.link(this.link,item)}.bind(this),this.addView=function(name,self){var cols=(this.cols||this.args.view)&&this.data.cols.filter(function(column){return!column.hidden}).map(function(column){return column.view=column.view||{},column.view.id=column.id,column.view});this.request({method:"POST",url:"/n/view?n="+this.node,data:{cols:cols,args:this.args,data:{name:[{text:name}],type:[{state:!1}],self:[{state:!!self}]}},success:function(res){this.setView(res.id)}})}.bind(this),this.execute=function(action,rows){this[action.type](rows)}.bind(this),this.merge=function(rows){this.refs.merge.show({name:"Fusionner",icon:"fork",url:"/i/items?n="+this.node,rows:rows})}.bind(this),this.delete=function(rows){this.refs.delete.show({name:"Supprimer",url:"/i/items",soft:!0,rows:rows,text:"Êtes-vous sûr de vouloir supprimer "+rows.length+" élément"+(1<rows.length?"s":"")+" ?"})}.bind(this),this.hideWidgets=function(e){this.widgets=null,this.update(),$(window).trigger("resize")}.bind(this)}),riot.tag2("item-map",'<div if="{tools}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-menu-filter list="{filters}" data="{args}" class="keep" onchange="{filter}"></ui-menu-filter> </div> </div> <div class="wrapper"> <ui-map markers="{markers}" height="{opts.height}" color="{opts.color}" zoom="{opts.zoom}" onselect="{show}"></ui-map> <ui-form class="{active: form}" ref="form" flat="{opts.flat}" blocks="{form && form.blocks}" data="{form && form.data}"></ui-form> </div>','item-map .list.header,[data-is="item-map"] .list.header{ position: relative; z-index: 1000; } item-map .wrapper,[data-is="item-map"] .wrapper{ position: relative; overflow: hidden; } item-map ui-form,[data-is="item-map"] ui-form{ position: absolute; width: 40%; height: 100%; top: 0; left: -40%; z-index: 1000; overflow: auto; background: #fff; transition: all 0.3s ease; } item-map ui-form.active,[data-is="item-map"] ui-form.active{ left: 0; box-shadow: 0 0 20px rgba(0, 0, 0, 0.3); } item-map ui-form .ui.form > .row > .name.column,[data-is="item-map"] ui-form .ui.form > .row > .name.column{ width: 40%; } item-map ui-form .ui.form > .row > .data.column,[data-is="item-map"] ui-form .ui.form > .row > .data.column{ width: 60%; }',"",function(opts){this.tools=void 0!==opts.tools,this.args={},this.on("mount",function(){this.init()}),this.on("updated",function(){this.init()}),this.init=function(){var item;this.node===opts.node&&this.view===opts.view||(this.node=opts.node,this.view=opts.view,this.args={view:this.view?Number(this.view):void 0,sort:0,limit:opts.limit||1e3},item=UI.getItem(),opts.filter&&item&&(this.args.filters=[{id:Number(opts.filter),data:[item]}]),this.load())}.bind(this),this.load=function(){this.request({method:"PUT",url:"/n/node/"+this.node+"/items",data:this.args,success:function(res){var blocks=res.cols.filter(function(col){return"address"===col.type});this.markers=res.rows.reduce(function(markers,row){return markers.concat(blocks.reduce(function(list,block){return list.concat((row.data[block.id]||[]).filter(function(data){return data.latitude&&data.longitude}).map(function(data){return{latitude:data.latitude,longitude:data.longitude,data:row.data}}))},[]))},[]),this.blocks=res.cols.map(function(block){return block.config.readonly=!0,block.config.link=opts.link||"#",block}),this.tools&&(this.filters=res.cols),this.args=res.args,this.form=null,this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.filter=function(list){this.args.filters=list,this.args.page=1,this.load()}.bind(this),this.show=function(item){if(!item)return this.form=null,void this.update();this.form={blocks:this.blocks.filter(function(block){return item.data[block.id]}),data:$.extend({},item.data)},this.update(),this.refs.form.root.scrollT
1op=0}.bind(this)}),riot.tag2("item-page",'<div if="{!opts.data}"> <p> Aucune publication </p> <button class="ui basic button" onclick="{add}"> <i class="plus icon"></i> Publier sur le site </button> </div> <div if="{opts.data}"> <p> Publié sur <a href="/{opts.data.slug}" target="_blank">{opts.data.slug}</a> ({opts.data.hits.toLocaleString()} visite{opts.data.hits > 1 ? \'s\' : \'\'}) </p> <p> Mise en page <b>{opts.data.layout}</b> avec le thème <b>{opts.data.theme}</b> </p> <p if="{opts.data.use}"> Utilisé pour la page <b>{opts.data.use.name}</b> </p> <p if="{opts.data.publish_at && !opts.data.expires_at}"> Visible à partir du {formatDate(opts.data.publish_at)} </p> <p if="{opts.data.publish_at && opts.data.expires_at}"> Visible du {formatDate(opts.data.publish_at)} au {formatDate(opts.data.expires_at)} </p> <button class="ui basic button" onclick="{edit}"> <i class="write icon"></i> Modifier </button> <button class="ui basic red button" onclick="{delete}"> <i class="remove icon"></i> Dépublier </button> </div> <ui-modal ref="add" type="add" onsubmit="{notify}"></ui-modal> <ui-modal ref="edit" type="edit" onsubmit="{notify}"></ui-modal> <ui-modal ref="delete" type="delete" onsubmit="{notify}"></ui-modal>','item-page .ui.button,[data-is="item-page"] .ui.button{ margin-top: 0.3em; }',"",function(opts){this.formatDate=function(date){return UI.format.date.call({type:"datetime"},{date:date})}.bind(this),this.add=function(e){this.refs.add.show({name:"Publier sur le site",size:"small",url:"/p/page?i="+opts.item})}.bind(this),this.edit=function(e){this.refs.edit.show({name:"Modifier",size:"small",url:"/p/page/"+opts.data.id})}.bind(this),this.delete=function(e){this.refs.delete.show({name:"Supprimer",url:"/p/page/"+opts.data.id,text:"Êtes-vous sûr de vouloir supprimer la publication ?"})}.bind(this),this.notify=function(){this.trigger("change")}.bind(this)}),riot.tag2("item-payment",'<ui-message ref="message"></ui-message> <div if="{payment}" show="{!transaction}"> <p>Montant à payer : <b>{amount.toFixed(2)} €</b></p> <div if="{error}" class="ui error message"> {error} </div> <div ref="payment" data-is="payment-{payment.config.connector}" payment="{payment.id}" config="{payment.config}" amount="{amount}" ondone="{send}" onerror="{alert}"></div> <div class="actions"> <button ref="button" class="ui primary button" onclick="{submit}"> Valider </button> </div> </div>','item-payment,[data-is="item-payment"]{ display: block; max-width: 600px; margin: 2em auto; } item-payment .actions,[data-is="item-payment"] .actions{ text-align: right; }',"",function(opts){this.on("mount",function(){this.load()}),this.load=function(){this.request({method:"GET",url:"/i/transaction/"+opts.transaction,success:function(res){this.payment=res.payment,this.amount=res.amount,this.update()}})}.bind(this),this.submit=function(e){this.refs.button.classList.contains("loading")||(this.refs.button.classList.add("loading"),this.error=null,this.update(),this.refs.payment.authorize(this.payment,this.amount))}.bind(this),this.send=function(transaction){this.transaction=transaction,this.update(),this.refs.message.set("info",{title:"Traitement en cours",icon:"notched circle loading",message:"Veuillez patienter..."}),"function"!=typeof this.transaction?this.request({method:"POST",url:"/i/transaction/"+opts.transaction,data:{transaction:this.transaction},success:function(res){res.redirect?window.location=res.redirect:(this.refs.message.set("success",res.success),this.trigger("done",this.transaction))},error:function(res){this.refs.message.set("error",res&&res.error),this.trigger("error",this.transaction)}}):this.transaction({id:opts.transaction,amount:this.amount})}.bind(this),this.alert=function(error){this.error=error,this.update(),this.refs.button.classList.remove("loading")}.bind(this)}),riot.tag2("item-sale",'<div if="{!opts.data}"> <p> Aucune mise en vente </p> <button class="ui basic button" onclick="{add}"> <i class="plus icon"></i> Mettre en vente </button> </div> <div if="{opts.data}"> <p> Vendu au prix de <b>{opts.data.price} € {opts.data.type ? \'TTC\' : \'HT\'}</b> <b if="{opts.data.unit}">/ {opts.data.unit}</b>
1 ({opts.data.count.toLocaleString()} vente{opts.data.count > 1 ? \'s\' : \'\'}) </p> <p if="{typeof opts.data.stock === \'number\'}"> Stock disponible : <b>{opts.data.stock}</b> unité{Math.abs(opts.data.stock) > 1 ? \'s\' : \'\'} </p> <button class="ui basic button" onclick="{edit}"> <i class="write icon"></i> Modifier </button> <button class="ui basic red button" onclick="{delete}"> <i class="remove icon"></i> Supprimer </button> </div> <ui-modal ref="add" type="add" onsubmit="{notify}"></ui-modal> <ui-modal ref="edit" type="edit" onsubmit="{notify}"></ui-modal> <ui-modal ref="delete" type="delete" onsubmit="{notify}"></ui-modal>','item-sale .ui.button,[data-is="item-sale"] .ui.button{ margin-top: 0.3em; }',"",function(opts){this.add=function(e){this.refs.add.show({name:"Mettre en vente",size:"small",url:"/i/sale?i="+opts.item})}.bind(this),this.edit=function(e){this.refs.edit.show({name:"Modifier",size:"small",url:"/i/sale/"+opts.data.id})}.bind(this),this.delete=function(e){this.refs.delete.show({name:"Supprimer",url:"/i/sale/"+opts.data.id,text:"Êtes-vous sûr de vouloir supprimer la mise en vente ?"})}.bind(this),this.notify=function(){this.trigger("change")}.bind(this)}),riot.tag2("item-sales",'<div if="{controls}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" selectable="{selectable}" link="{opts.link}" onsort="{sort}" onselect="{select}"></ui-list-table> <div if="{controls && count}" class="list footer"> <div> <ui-action list="{actions}" rows="{selection}" onaction="{execute}"></ui-action> <ui-modal ref="delete" type="delete" onsubmit="{load}"></ui-modal> </div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>',"","",function(opts){this.controls=void 0!==opts.controls,this.selectable=this.controls||opts.selectable,this.args=UI.args.sales||{},this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.load(!0)}),this.load=function(reset){this.request({method:"PUT",url:"/i/sales",data:this.args,success:function(res){this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.actions=res.actions,this.config=res.config,UI.args.sales=this.args,this.trigger("load",res.info,reset),this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.select=function(rows){this.selection=rows,this.update()}.bind(this),this.go=function(page){this.args.page=page,this.load(!0)}.bind(this),this.execute=function(action,rows){this[action.type](rows)}.bind(this),this.delete=function(rows){this.refs.delete.show({name:"Supprimer",url:"/i/sales",rows:rows,text:"Êtes-vous sûr de vouloir supprimer "+rows.length+" élément"+(1<rows.length?"s":"")+" ?"})}.bind(this)}),riot.tag2("item-transaction",'<div if="{!opts.data}"> <p> Aucune transaction </p> <button class="ui basic button" onclick="{add}"> <i class="plus icon"></i> Créer une transaction </button> </div> <div if="{opts.data}"> <p> Paiement par <b>{opts.data.payment.name}</b> (<i class="{opts.data.status.icon} icon"></i>{opts.data.status.name}) </p> <p if="{opts.data.completed}"> Payé <span if="{opts.data.completed.at}"> le {formatDate(opts.data.completed.at)} </span> <span if="{opts.data.completed.by && !opts.data.completed.id}"> par {opts.data.completed.by} </span> <span if="{opts.data.completed.by && opts.data.completed.id}"> par <a href="{UI.link(link, opts.data.completed)}">{opts.data.completed.by}</a> </span> </p> <p if="{opts.data.refunded}"> Remboursé <span if="{opts.data.refunded.at}"> le {formatDate(opts.data.refunded.at)} </span> <span if="{opts.data.refunded.by && !opts.data.refunded.id}"> par {opts.data.refunded.by} </span> <span if="{opts.data.refunded.by && opts.data.refunded.id}"> par <a href="{UI.link(link, opts.data.refunded)}">{opts.data.refunded.by}</a> </span> </p> <div if="{opts.data.info}" class="ui info message"> <div each="{info in opts.data.info}"> <b>{info.name}</b> : {info.value} </div> </div> <button if="{opts.data.status.id === 1 && opts.data.payment.type !== 2}" class="ui basic button" onclick="{edit}"> <i class="write icon"></i> Modifier </button> <a if="{opts.data.status.id === 1 && opts.data.payment.type !== 2}" class="ui basic button" href="{getURL()}" target="_blank"> <i class="payment icon"></i> Payer </a> <button if="{opts.data.refundable}" class="ui basic button" onclick="{refund}"> <i class="undo icon"></i> Rembourser </button> </div> <ui-modal ref="add" type="add" onsubmit="{notify}"></ui-modal> <ui-modal ref="edit" type="edit" onsubmit="{notify}"></ui-modal>','item-transaction .ui.message div,[data-is="item-transaction"] .ui.message div{ padding: 0.2em 0; } item-transaction .ui.button,[data-is="item-transaction"] .ui.button{ margin-top: 0.3em; }',"",function(opts){this.link=opts.link||"#item/$id/$token",this.formatDate=function(date){return UI.format.date.call({type:"datetime"},{date:date})}.bind(this),this.getURL=function(){return"/i/transaction/"+opts.data.id}.bind(this),this.add=function(e){this.refs.add.show({name:"Créer une transaction",size:"small",url:"/i/transaction?i="+opts.item})}.bind(this),this.edit=function(e){this.refs.edit.show({name:"Modifier",size:"small",url:"/i/transaction/"+opts.data.id})}.bind(this),this.refund=function(e){this.refs.edit.show({name:"Rembourser",icon:"undo",size:"small",url:"/i/transaction/"+opts.data.id})}.bind(this),this.notify=function(){this.trigger("change")}.bind(this)}),riot.tag2("item-trash",'<div if="{controls}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> <ui-modal ref="empty" type="delete" onsubmit="{load}"></ui-modal> </div> <div> <button class="ui primary button" onclick="{empty}"> Vider la corbeille </button> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" selectable="{selectable}" link="{opts.link}" onsort="{sort}" onselect="{select}"></ui-list-table> <div if="{controls && count}" class="list footer"> <div> <ui-action list="{actions}" rows="{selection}" onaction="{execute}"></ui-action> <ui-modal ref="delete" type="delete" onsubmit="{load}"></ui-modal> </div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>',"","",function(opts){this.controls=void 0!==opts.controls,this.selectable=this.controls||opts.selectable,this.args={},this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.load(!0)}),this.load=function(reset){this.request({method:"PUT",url:"/i/trash",data:this.args,success:function(res){this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.actions=res.actions,this.trigger("load",res.info,reset),this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.select=function(rows){this.selection=rows,this.update()}.bind(this),this.go=function(page){this.args.page=page,this.load(!0)}.bind(this),this.empty=function(e){this.refs.empty.show({name:"Vider la corbeille",icon:"trash outline",url:"/i/trash",text:"Êtes-vous sûr de vouloir vider la corbeille ?"})}.bind(this),this.execute=function(action,rows){this[action.type](rows)}.bind(this),this.restore=function(rows){this.request({method:"PATCH",url:"/i/trash",data:{rows:rows.map(function(row){return{id:row.id,type:row.type}})},success:function(){this.load()}})}.bind(this),this.delete=function(rows){this.refs.delete.show({name:"Supprimer",url:"/i/items",rows:rows,text:"Êtes-vous sûr de vouloir supprimer définitivement "+rows.length+" élément"+(1<rows.length?"s":"")+" ?"})}.bind(this)}),riot.tag2("item-user",'<div if="{!opts.data}"> <p> Aucun compte utilisateur </p> <button class="ui basic button" onclick="{add}"> <i class="plus icon"></i> Créer un compte utilisateur </button> </div> <div if="{opts.data}"> <p> Identifié par <b>{opts.data.username}</b>
1 ({opts.data.role.name}) </p> <p if="{opts.data.logged_at}"> Dernière connexion <span class="date" title="{formatDate(opts.data.logged_at)}"> {formatDate(opts.data.logged_at, true)} </span> </p> <button class="ui basic button" onclick="{edit}"> <i class="write icon"></i> Modifier </button> <button class="ui basic red button" onclick="{delete}"> <i class="remove icon"></i> Supprimer </button> </div> <ui-modal ref="add" type="add" onsubmit="{notify}"></ui-modal> <ui-modal ref="edit" type="edit" onsubmit="{notify}"></ui-modal> <ui-modal ref="delete" type="delete" onsubmit="{notify}"></ui-modal>','item-user .ui.button,[data-is="item-user"] .ui.button{ margin-top: 0.3em; } item-user .date,[data-is="item-user"] .date{ cursor: help; }',"",function(opts){this.formatDate=function(date,relative){return UI.format.date.call({type:"datetime",relative:!!relative},{date:date})}.bind(this),this.add=function(e){this.refs.add.show({name:"Créer un compte utilisateur",size:"small",url:"/u/user?i="+opts.item})}.bind(this),this.edit=function(e){this.refs.edit.show({name:"Modifier",size:"small",url:"/u/user/"+opts.data.id})}.bind(this),this.delete=function(e){this.refs.delete.show({name:"Supprimer",url:"/u/user/"+opts.data.id,text:"Êtes-vous sûr de vouloir supprimer le compte utilisateur ?"})}.bind(this),this.notify=function(){this.trigger("change")}.bind(this)}),riot.tag2("list-toolbox",'<button ref="button" class="ui icon button"> <i class="wrench icon"></i> </button> <div ref="popup" class="ui flowing popup hidden"> <div class="ui secondary pointing menu"> <a each="{tab in tabs}" class="item {active: tab === active}" onclick="{showTab}"> <i class="{tab.icon} icon"></i> {tab.name} </a> </div> <div if="{active.id === \'import\'}"> <div if="{step === 1}"> <p>Veuillez sélectionner un fichier CSV au bon format (colonnes : id, Nom, Parent)</p> <ui-message ref="message"></ui-message> <ui-upload ref="upload" url="{url}" accept=".csv" limit="1" onfile="{importValues}" onerror="{alert}"></ui-upload> </div> <div if="{step === 2}"> <div class="ui blue progress"> <div class="bar" riot-style="width: {loaded}%;"></div> <div class="label"> <i class="spinner loading icon"></i> Import en cours, veuillez patienter... </div> </div> </div> <div if="{step === 3}"> <p>Le traitement du fichier est terminé</p> <ul> <li>{format(stats.lines, \'ligne? traitée?\')}</li> <li>{format(stats.errors, \'erreur?\')}</li> </ul> <ul> <li>{format(stats.created, \'valeur? ajoutée?\')}</li> <li>{format(stats.updated, \'valeur? modifiée?\')}</li> </ul> <p if="{stats.errors !== 0}"> <a href="/log/import-{token}.csv">Télécharger le rapport d\'erreur</a> </p> </div> </div> <div if="{active.id === \'export\'}"> <ui-message ref="message"></ui-message> <ui-form if="{form}" ref="form" blocks="{form.blocks}" data="{form.data}" onchange="{exportValues}"></ui-form> </div> <div if="{active.id === \'delete\'}"> <div if="{step === 1}"> <p>Veuillez sélectionner un fichier CSV au bon format (colonnes : id)</p> <ui-message ref="message"></ui-message> <ui-upload ref="upload" url="{url}" accept=".csv" limit="1" onfile="{deleteValues}" onerror="{alert}"></ui-upload> </div> <div if="{step === 2}"> <div class="ui blue progress"> <div class="bar" riot-style="width: {loaded}%;"></div> <div class="label"> <i class="spinner loading icon"></i> Suppression en cours, veuillez patienter... </div> </div> </div> <div if="{step === 3}"> <p>Le traitement du fichier est terminé</p> <ul> <li>{format(stats.lines, \'ligne? traitée?\')}</li> <li>{format(stats.errors, \'erreur?\')}</li> </ul> <ul> <li>{format(stats.deleted, \'valeur? supprimée?\')}</li> </ul> <p if="{stats.errors !== 0}"> <a href="/log/import-{token}.csv">Télécharger le rapport d\'erreur</a> </p> </div> </div> <div class="actions"> <button if="{active.id === \'export\'}" ref="loading" class="ui primary button" onclick="{submit}">Exporter</button> <button ref="disabled" class="ui button" onclick="{cancel}">Annuler</button> </div> </div>','list-toolbox .ui.popup,[data-is="list-toolbox"] .ui.popup{ width: 40em; } list-toolbox .ui.form,[data-is="list-toolbox"] .ui.form{ width: 40em !important; } list-toolbox .actions,[data-is="list-toolbox"] .actions{ float: right; margin-top: 1em; }',"",function(opts){this.tabs=[{id:"import",name:"Importer",icon:"sign in"},{id:"export",name:"Exporter",icon:"sign out"},{id:"delete",name:"Supprimer",icon:"remove"}],this.url="/l/values?l="+opts.list,this.active=this.tabs[0],this.step=1,this.on("mount",function(){$(this.refs.button).popup({on:"click",popup:this.refs.popup,position:"bottom right"})}),this.showTab=function(e){this.loading||("export"!==e.item.tab.id?(this.active=e.item.tab,this.step=1,this.update()):this.loadExport())}.bind(this),this.loadExport=function(){this.request({method:"PUT",url:this.url,success:function(res){this.form=res,this.active=this.tabs[1],this.step=1,this.update()}})}.bind(this),this.submit=function(e){this.refs.form.dump()}.bind(this),this.importValues=function(data){this.token=data.token,this.step=2,this.loaded=0,this.update(),this.request({method:"POST",url:this.url,dataType:"text",data:{token:this.token},progress:function(e){this.loaded=Math.floor(e.loaded/e.total*100),this.update()},success:function(res){this.stats=this.decode(res,["lines","errors","created","updated"]),this.step=3,this.update(),this.trigger("finish")}})}.bind(this),this.exportValues=function(data){this.request({method:"PUT",url:this.url,data:{data:data},success:function(res){window.location=res.url,$(this.refs.button).popup("hide")},error:function(res){this.refs.message.set("error",res&&res.error)}})}.bind(this),this.deleteValues=function(data){this.token=data.token,this.step=2,this.loaded=0,this.update(),this.request({method:"DELETE",url:this.url,dataType:"text",data:{token:this.token},progress:function(e){this.loaded=Math.floor(e.loaded/e.total*100),this.update()},success:function(res){this.stats=this.decode(res,["lines","errors","deleted"]),this.step=3,this.update(),this.trigger("finish")}})}.bind(this),this.decode=function(str,keys){return keys.reduce(function(obj,key,i){return obj[key]=parseInt(str.substr(8*(i-keys.length),8),16),obj},{})}.bind(this),this.format=function(num,text){return num+" "+text.replace(/\?/g,1<num?"s":"")}.bind(this),this.cancel=function(e){$(this.refs.button).popup("hide")}.bind(this),this.alert=function(error){this.refs.message.set("error",error)}.bind(this),this.notify=function(){this.trigger("change")}.bind(this)}),riot.tag2("list-values",'<div class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <button class="ui {disabled: !args.parent} icon button" onclick="{back}"> <i class="level up icon"></i> </button> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> <div> <button ref="button" class="ui primary button"> {value ? \'Modifier\' : \'Ajouter\'} </button> <div ref="popup" class="ui flowing popup hidden"> <div class="ui form" onkeydown="{submit}"> <div class="field"> <label>Nom</label> <input ref="name" type="text" riot-value="{value && value.data.name[0].text}"> </div> <div class="actions"> <button ref="loading" class="ui primary button" onclick="{submit}">Enregistrer</button> <button ref="disabled" class="ui button" onclick="{cancel}">Annuler</button> </div> </div> </div> <list-toolbox list="{opts.list}" onfinish="{load}"></list-toolbox> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" selectable="true" link="{opts.link}" onsort="{sort}" onselect="{select}" onlink="{click}"></ui-list-table> <div if="{count}" class="list footer"> <ui-action list="{actions}" rows="{selection}" onaction="{execute}"></ui-action> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>','list-values .ui.form,[data-is="list-values"] .ui.form{ width: 40em !important; } list-values .ui.form .actions,[data-is="list-values"] .ui.form .actions{ float: right; margin-top: 1em; }',"",function(opts){this.args={},this.data={},this.on("mount",function(){$(this.refs.button).popup({on:"click",popup:this.refs.popup,position:"bottom right",onVisible:function(){this.refs.name.focus()}.bind(this)}),this.on("request",this.refs.status&&this.refs.status.toggle),this.load()}),this.load=function(){this.request({method:"PUT",url:"/l/list/"+opts.list+"/values",data:this.args,success:function(res){this.info=res.info,this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.actions=res.actions,this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.back=function(){this.args.parent=this.info.parent,this.args.search=null,this.args.page=1,this.update(),this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.select=function(rows){this.selection=rows,this.value=1===rows.length?rows[0]:null,this.update()}.bind(this),this.click=function(row,block,e){e.preventDefault(),"name"===block.id&&(this.args.parent=row.id,this.args.search=null,this.args.page=1,this.update(),this.load()),"usage"===block.id&&(UI.args.search={filters:[{id:"option",data:[{id:row.id,name:row.data.name[0].text}]}]},window.location="#search")}.bind(this),this.go=function(page){this.args.page=page,this.load()}.bind(this),this.submit=function(e){var name=this.refs.name.value.trim();1!==e.which&&13!==e.which||name&&this.request({method:this.value?"PATCH":"POST",url:this.value?"/l/value/"+this.value.id:"/l/value?l="+opts.list,data:{parent:this.args.parent,name:name},success:function(){$(this.refs.button).popup("hide"),this.refs.name.value="",this.load()}})}.bind(this),this.cancel=function(e){$(this.refs.button).popup("hide")}.bind(this),this.execute=function(action,rows){this[action.type](rows)}.bind(this),this.delete=function(rows){this.request({method:"DELETE",url:"/l/values?l="+opts.list,data:{rows:rows.map(function(row){return{id:row.id}})},success:function(){this.load()}})}.bind(this)}),riot.tag2("mail-composer",'<div ref="modal" class="ui mail modal"> <div class="header"> <i class="mail outline icon"></i> Envoyer un mail </div> <div if="{data}" class="content"> <ui-message ref="message"></ui-message> <div class="ui form"> <div class="inline fields"> <div class="sixteen wide field"> <label>De</label> <ui-dropdown text="{getSender()}" url="/m/senders" onchange="{setSender}"></ui-dropdown> </div> </div> <div class="inline fields"> <div class="sixteen wide field"> <label>Pour</label> <mail-recipients data="{recipients}" onchange="{setRecipients}"></mail-recipients> </div> </div> <div class="inline fields"> <div class="sixteen wide field"> <label>Objet</label> <div class="ui icon input"> <input ref="subject" type="text" riot-value="{subject}"> </div> </div> </div> <ui-html-editor ref="editor" content="{message}" config="{config}" onchange="{setMessage}" autofocus></ui-html-editor> <data-file if="{attachments}" mode="edit" block="{upload}" dataset="{attachments}"></data-file> </div> </div> <div class="actions"> <button class="ui left floated icon button" onclick="{showAttachments}"> <i class="attach icon"></i> </button> <button ref="loading" class="ui primary button" onclick="{submit}"> Envoyer </button> <button class="ui teal button" value="save" onclick="{submit}"> Enregistrer </button> <button ref="disabled" class="ui cancel button"> Annuler </button> </div> </div>',"","",function(opts){this.config={insert:["link","image","template"],absolute:!0,source:!0,url:{file:"/f/file?r=mails",pages:"/p/pages",templates:"/m/templates"}},this.upload={config:{max:8,select:!0,url:"/f/file?r=mails"}},this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.show=function(id,url){$(this.refs.modal).modal({closable:!1}),this.url=url||(id?"/m/mail?m="+id:"/m/mail"),this.data=!1,this.update(),this.request({method:"POST",url:this.url,success:function(res){this.sender=res.sender||{},this.recipients=res.recipients,this.subject=res.subject,this.message=res.message||["<p><br></p>",this.sender.signature].join(""),this.attachments=res.attachments,this.data=!0,this.update(),$(this.refs.modal).modal("show")}})}
1.bind(this),this.getSender=function(){return this.sender.name&&this.sender.name+" <"+this.sender.address+">"}.bind(this),this.setSender=function(sender){this.message=this.refs.editor.getContent().replace(this.sender.signature,""),this.sender=sender||{},this.message=[this.message,this.sender.signature].join(""),this.update(),this.refs.editor.load()}.bind(this),this.setRecipients=function(list){this.recipients=list}.bind(this),this.setMessage=function(html){this.message=html}.bind(this),this.showAttachments=function(e){this.attachments=this.attachments||[],this.update(),$(this.refs.modal).modal("refresh")}.bind(this),this.submit=function(e){this.refs.editor.dump(),this.request({method:"POST",url:this.url,data:{draft:"save"===e.target.value,data:{sender:this.sender,recipients:this.recipients,subject:this.refs.subject.value.trim(),message:this.message,attachments:this.attachments}},success:function(res){$(this.refs.modal).modal("hide"),this.trigger("submit",{id:res.id,name:res.subject})},error:function(res){$(this.refs.modal).modal("show"),this.refs.message.set("error",res&&res.error)}})}.bind(this)}),riot.tag2("mail-list",'<div if="{controls}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <div ref="button" class="ui icon top left pointing dropdown button"> <i class="eye icon"></i> <div class="menu"> <div class="header">Affichage</div> <div class="item" onclick="{showDraft}"> <i class="pencil icon"></i> Brouillons </div> <div class="item" onclick="{showSent}"> <i class="send icon"></i> Envoyés </div> </div> </div> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> <div> <button class="ui primary button" onclick="{add}"> Envoyer un mail </button> <mail-composer ref="composer" onsubmit="{load}"></mail-composer> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" selectable="{selectable}" link="{opts.link}" onsort="{sort}" onlink="{open}" onselect="{select}"></ui-list-table> <mail-message ref="message"></mail-message> <div if="{controls && count}" class="list footer"> <div> <ui-action list="{actions}" rows="{selection}" onaction="{execute}"></ui-action> <ui-modal ref="delete" type="delete" onsubmit="{load}"></ui-modal> </div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>',"","",function(opts){this.controls=void 0!==opts.controls,this.selectable=this.controls||opts.selectable,this.args=UI.args.mails||{},this.on("mount",function(){$(this.refs.button).dropdown({action:"hide"}),this.on("request",this.refs.status&&this.refs.status.toggle),this.load(!0)}),this.load=function(reset){this.request({method:"PUT",url:"/m/mails",data:this.args,success:function(res){this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.actions=res.actions,this.config=res.config,UI.args.mails=this.args,this.trigger("load",res.info,reset),this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.showSent=function(){this.args.view=null,this.load()}.bind(this),this.showDraft=function(){this.args.view=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.select=function(rows){this.selection=rows,this.update()}.bind(this),this.go=function(page){this.args.page=page,this.load(!0)}.bind(this),this.open=function(row,block,e){e.preventDefault(),1===this.args.view?this.refs.composer.show(row.id):this.refs.message.show(row.id)}.bind(this),this.add=function(e){this.refs.composer.show()}.bind(this),this.execute=function(action,rows){this[action.type](rows)}.bind(this),this.delete=function(rows){this.refs.delete.show({name:"Supprimer",url:"/m/mails",rows:rows,text:"Êtes-vous sûr de vouloir supprimer "+rows.length+" élément"+(1<rows.length?"s":"")+" ?"})}.bind(this)}),riot.tag2("mail-message",'<div ref="modal" class="ui modal"> <div if="{mail}" class="header"> <i class="mail outline icon"></i> {mail.subject} </div> <div if="{mail}" class="content"> <p><b>De :</b> {formatUser(mail.sender)}</p> <p><b>Date :</b> {formatDate(mail.created_at)}</p> <p if="{mail.to.length}"><b>Pour :</b> {formatList(mail.to)}</p> <p if="{mail.cc.length}"><b>Copie à :</b> {formatList(mail.cc)}</p> <p if="{mail.bcc.length}"><b>Copie cachée à :</b> {formatList(mail.bcc)}</p> <div if="{mail.type === 3}" class="ui secondary pointing menu"> <a class="item {active: tab === 1}" onclick="{showMessage}"> <i class="talk outline icon"></i> Message </a> <a class="item {active: tab === 2}" onclick="{showTracking}"> <i class="line chart icon"></i> Suivi </a> </div> <div if="{mail.type !== 3}
1" class="ui divider"></div> <div if="{tab === 1}"> <ui-html content="{mail.message}"></ui-html> <div if="{mail.attachments}" class="ui divider"></div> <div each="{file in mail.attachments}"> <i class="{getIcon(file)} icon"></i> <a href="{formatFile(file)}" target="_blank">{file.name} ({UI.toFileSize(file.size)})</a> </div> </div> <mail-trackers if="{tab === 2}" mail="{mail.id}" controls></mail-trackers> </div> <div class="actions"> <button ref="disabled" class="ui cancel button">Fermer</button> </div> </div>',"","",function(opts){this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.show=function(id){$(this.refs.modal).modal(),this.request({method:"GET",url:"/m/mail/"+id,success:function(res){this.tab=1,this.mail=res.mail,this.update(),$(this.refs.modal).modal("show")}})}.bind(this),this.showMessage=function(e){this.tab=1,this.update()}.bind(this),this.showTracking=function(e){this.tab=2,this.update()}.bind(this),this.formatUser=function(user){return[user.name,user.address&&"<"+user.address+">"].join(" ").trim()}.bind(this),this.formatList=function(list){return list.map(function(u){return this.formatUser(u)},this).join(", ")}.bind(this),this.formatDate=function(date){return UI.format.date.call({type:"datetime"},{date:date})}.bind(this),this.formatFile=function(file){return UI.getFileURL(file)}.bind(this),this.getIcon=function(file){var type,ext=UI.getFileExt(file);for(type in UI.filetype)if(-1!==UI.filetype[type].ext.indexOf(ext))return UI.filetype[type].icon;return"file outline"}.bind(this)}),riot.tag2("mail-recipients",'<div ref="dropdown" class="ui fluid multiple search selection dropdown"> <i class="dropdown icon"></i> <input class="search" autocomplete="off" tabindex="0" onchange="{stop}"> <div class="default text">Destinataire</div> </div>',"","",function(opts){this.recipients=(opts.data||[]).filter(function(rcpt){return rcpt.id||rcpt.address}),this.on("mount",function(){$(this.refs.dropdown).dropdown({saveRemoteData:!1,allowAdditions:!0,onAdd:this.add,onRemove:this.remove,apiSettings:{url:"/m/recipients?q={query}",cache:!1},values:this.recipients.map(function(rcpt){return{name:rcpt.name||rcpt.address,value:rcpt.id||rcpt.address,selected:!0}})})}),this.add=function(value,text){this.recipients.some(function(rcpt){return rcpt.id===Number(value)||rcpt.address===value})||(this.recipients.push(Number(value)?{id:Number(value),name:text}:{name:text!==value?text:void 0,address:value}),this.trigger("change",this.recipients),$(this.refs.dropdown).dropdown("hide"))}.bind(this),this.remove=function(value){this.recipients=this.recipients.filter(function(rcpt){return rcpt.id!==Number(value)&&rcpt.address!==value}),this.trigger("change",this.recipients)}.bind(this)}),riot.tag2("mail-signature",'<div class="ui form"> <ui-html-editor ref="editor" content="{content}" config="{config}" onchange="{set}"></ui-html-editor> </div>',"","",function(opts){this.config={insert:["link","image","template"],absolute:!0,source:!0,url:{file:"/f/file?r=senders",pages:"/p/pages",templates:"/m/templates"}},this.on("mount",function(){this.update()}),this.on("update",function(){this.init()}),this.init=function(){opts.data&&this.sender!==opts.data.id&&(this.sender=opts.data.id,this.content=opts.data.data.signature&&opts.data.data.signature[0].text,this.update(),this.refs.editor.load())}.bind(this),this.dump=function(){this.refs.editor.dump()}.bind(this),this.set=function(content){content!==this.content&&this.trigger("change",{signature:[{text:content}]})}.bind(this)}),riot.tag2("mail-template",'<div class="ui form"> <ui-html-editor ref="editor" content="{content}" config="{config}" onchange="{set}"></ui-html-editor> </div>',"","",function(opts){this.config={insert:["link","image","template"],absolute:!0,source:!0,url:{file:"/f/file?r=templates",pages:"/p/pages",templates:"/m/templates"}},this.on("mount",function(){this.update()}),this.on("update",function(){this.init()}),this.init=function(){opts.data&&this.template!==opts.data.id&&(this.template=opts.data.id,this.content=opts.data.data.html&&opts.data.data.html[0].text,this.update(),this.refs.editor.load())}.bind(this),this.dump=function(){this.refs.editor.dump()}.bind(this),this.set=function(content){content!==this.content&&this.trigger("change",{html:[{text:content}]})}.bind(this)}),riot.tag2("mail-trackers",'<div if="{controls}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" link="#item/$id/$token" onsort="{sort}"></ui-list-table> <div if="{controls && count}" class="list footer"> <div></div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>',"","",function(opts){this.controls=void 0!==opts.controls,this.args={},this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.load()}),this.load=function(){this.request({method:"PUT",url:"/m/mail/"+opts.mail+"/trackers",data:this.args,success:function(res){this.info=res.info,this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.go=function(page){this.args.page=page,this.load()}.bind(this)}),riot.tag2("node-action",'<button each="{action in opts.data}" class="ui {action.color} basic button" onclick="{show}"> <i class="{action.icon} icon"></i> {action.name} </button> <div ref="modal" class="ui tiny modal"> <div if="{active}" class="header"> <i class="{active.icon} icon"></i> {active.name} </div> <div if="{step === 1}" class="content"> Êtes-vous sûr de vouloir appliquer cette action sur {count} éléments ? </div> <div if="{step === 2}" class="content"> <div class="ui blue progress"> <div class="bar" riot-style="width: {loaded}%;"></div> <div class="label"> <i class="spinner loading icon"></i> Traitement en cours, veuillez patienter... </div> </div> </div> <div if="{step === 3}" class="content"> <p>L\'action a été correctement appliquée</p> <ul> <li>{format(stats.applied, \'élément? concerné?\')}</li> <li>{format(stats.updated, \'élément? modifié?\')}</li> <li>{format(stats.ignored, \'élément? ignoré?\')}</li> </ul> </div> <div class="actions"> <button if="{step === 1}" ref="loading" class="ui primary button" onclick="{execute}">Appliquer</button> <button ref="disabled" class="ui cancel button">{step === 1 ? \'Annuler\' : \'Fermer\'}</button> </div> </div>','node-action .ui.basic.button,[data-is="node-action"] .ui.basic.button{ margin-top: 0.3em; }',"",function(opts){this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.show=function(e){$(this.refs.modal).modal({closable:!1}),this.active=e.item.action;var button=e.currentTarget;button.classList.add("loading"),this.request({method:"POST",url:"/n/action/"+this.active.id,data:{args:opts.args},success:function(res){this.count=res.count,this.step=1,this.update(),button.classList.remove("loading"),$(this.refs.modal).modal("show")}})}.bind(this),this.execute=function(e){this.step=2,this.loaded=0,this.update(),this.request({method:"POST",url:"/n/action/"+this.active.id,dataType:"text",data:{args:opts.args,confirm:!0},progress:function(e){this.loaded=Math.floor(e.loaded/e.total*100),this.update()},success:function(res){this.stats=this.decode(res,["applied","updated","ignored"]),this.step=3,this.update(),this.notify()}})}.bind(this),this.decode=function(str,keys){return keys.reduce(function(obj,key,i){return obj[key]=parseInt(str.substr(8*(i-keys.length),8),16),obj},{})}.bind(this),this.format=function(num,text){return num+" "+text.replace(/\?/g,1<num?"s":"")}.bind(this),this.notify=function(){this.trigger("change",!0)}.bind(this)}),riot.tag2("node-config",'<div show="{opts.list && opts.list[0]}" ref="button" class="ui icon top left pointing dropdown button"> <i class="setting icon"></i> <div class="menu"> <div class="header">Configuration</div> <div each="{config in opts.list}" class="item" onclick="{show}"> <i class="{config.icon} icon"></i> {config.name} </div> </div> </div> <ui-modal ref="node" type="edit" onsubmit="{notify}"></ui-modal> <ui-config ref="forms"></ui-config> <ui-config ref="layouts"></ui-config>
1 <ui-config ref="indicators" onclose="{notify}"></ui-config> <ui-config ref="blocks" onclose="{notify}"> <node-filter if="{tab === \'filters\'}" ref="data" menu="{data.filters}" data="{active}" onchange="{send}"></node-filter> </ui-config> <ui-config ref="views" onclose="{notify}"> <node-filter if="{tab === \'filters\'}" ref="data" menu="{data.filters}" data="{active}" onchange="{send}"></node-filter> </ui-config> <ui-config ref="actions"> <node-filter if="{tab === \'filters\'}" ref="data" menu="{data.filters}" data="{active}" onchange="{send}"></node-filter> </ui-config>',"","",function(opts){this.on("mount",function(){$(this.refs.button).dropdown({action:"hide"})}),this.show=function(e){this.refs[e.item.config.id].show(e.item.config)}.bind(this),this.notify=function(){this.trigger("change")}.bind(this)}),riot.tag2("node-filter",'<ui-filter ref="filters" menu="{menu}" data="{filters}" onchange="{set}"></ui-filter>',"","",function(opts){this.on("mount",function(){this.update()}),this.on("update",function(){this.init()}),this.init=function(){opts.data&&this.target!==opts.data.id&&(this.target=opts.data.id,this.menu=opts.menu,this.filters=opts.data.data.filters,this.update())}.bind(this),this.dump=function(ifModified){this.refs.filters.dump(ifModified)}.bind(this),this.set=function(filters){this.trigger("change",{filters:filters})}.bind(this)}),riot.tag2("node-form",'<div if="{!modal}"> <div if="{login}" class="login"> <user-login onlogin="{load}"></user-login> </div> <ui-message ref="message"></ui-message> <ui-form if="{form}" ref="form" blocks="{form.blocks}" data="{form.data}" onchange="{send}"></ui-form> <cart-payment if="{payments}" show="{!payment}" list="{payments}" amount="{amount}" onsubmit="{pay}"></cart-payment> <div if="{info && !info.readonly}" class="buttons"> <button ref="loading" class="ui primary button" onclick="{submit}">Valider</button> </div> </div> <div if="{modal}" ref="modal" class="ui modal"> <i class="close icon"></i> <div if="{info}" class="header"> <i class="{info.icon} icon"></i> {info.name} </div> <div class="content"> <ui-message ref="message"></ui-message> <ui-form if="{form}" ref="form" form="{opts.form}" blocks="{form.blocks}" data="{form.data}" onchange="{send}"></ui-form> </div> <div class="actions"> <button if="{info && !info.readonly}" ref="loading" class="ui primary button" onclick="{submit}">Valider</button> <button ref="disabled" class="ui cancel button">Fermer</button> </div> </div>','node-form .ui.message,[data-is="node-form"] .ui.message{ margin-bottom: 2em; } node-form .buttons,[data-is="node-form"] .buttons{ text-align: right; margin: 1em; }',"",function(opts){this.modal=void 0!==opts.modal,this.on("mount",function(){"user"===opts.hide&&UI.getUser()||this.modal||this.load()}),this.on("before-unmount",function(){this.modal&&$(this.refs.modal).remove()}),this.show=function(){this.modal&&($(this.refs.modal).modal(),this.load())}.bind(this),this.load=function(){opts.form&&this.request({method:"POST",url:"/n/form/"+opts.form+(opts.token?"?t="+opts.token:""),data:{item:UI.getItem()||void 0},success:function(res){this.info=res.info,this.form=res,this.login=!1,this.update(),this.modal&&(this.refs.message.reset(),$(this.refs.modal).modal("show"),this.refs.modal.parentNode.scrollTop=0)},error:function(res,xhr){401===xhr.status&&(this.login=!0,this.update()),410===xhr.status&&this.refs.message.set("error",res&&res.error,!1)}})}.bind(this),this.submit=function(e){this.refs.form.dump()}.bind(this),this.send=function(data){this.request({method:"POST",url:"/n/form/"+opts.form+(opts.token?"?t="+opts.token:""),data:{item:UI.getItem()||void 0,data:data,payment:this.payment,transaction:this.transaction},success:function(res){if(this.modal)return $(this.refs.modal).modal("hide"),void this.trigger("submit",res);this.info=null,this.form=null,this.update(),res.payments?(this.data=data,this.amount=res.amount,this.payments=res.payments,this.update(),this.refs.message.reset()):"function"==typeof this.transaction?this.transaction(res.transaction):res.redirect?window.location=res.redirect:this.refs.message.set("success",res.success)},error:function(res){this.refs.message.set("error",res&&res.error)}})}.bind(this),this.pay=function(payment,address,transaction){this.payment=payment,this.transaction=transaction,this.update(),this.refs.message.set("info",{title:"Traitement en cours",icon:"notched circle loading",message:"Veuillez patienter..."}),this.send(this.data)}.bind(this)}),riot.tag2("node-indicators",'<div if="{!indicators}" class="ui active centered inline loader"></div> <div if="{indicators}" class="ui mini one statistics"> <div each="{indicator in indicators}" class="{indicator.color} statistic"> <div class="value">{indicator.value}</div> <div class="label">{indicator.name}</div> </div> </div>',"","",function(opts){this.on("mount",function(){this.load()}),this.on("update",function(){this.load()}),this.on("unmount",function(){clearTimeout(this.timeout)}),this.load=function(){this.args!==opts.args&&(this.args=opts.args,this.timeout=setTimeout(this.clear,1e3),this.request({method:"POST",url:"/n/node/"+opts.node+"/indicators",data:{search:this.args.search,filters:this.args.filters},success:function(res){clearTimeout(this.timeout),this.indicators=res.indicators,this.update()}}))}.bind(this),this.clear=function(){this.indicators=null,this.update()}.bind(this)}),riot.tag2("node-list",'<div if="{controls}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> <div> <button class="ui primary button" onclick="{add}"> Ajouter une collection </button> <ui-modal ref="add" type="add" onsubmit="{route}"></ui-modal> <node-config list="{config}" onchange="{load}"></node-config> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" selectable="{selectable}" link="{opts.link}" onsort="{sort}" onselect="{select}"></ui-list-table> <div if="{controls && count}" class="list footer"> <div> <ui-action list="{actions}" rows="{selection}" onaction="{execute}"></ui-action> <ui-modal ref="clone" type="add" onsubmit="{load}"></ui-modal> <ui-modal ref="delete" type="delete" onsubmit="{load}"></ui-modal> </div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>',"","",function(opts){this.controls=void 0!==opts.controls,this.selectable=this.controls||opts.selectable,this.args=UI.args.nodes||{},this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.load(!0)}),this.load=function(reset){this.request({method:"PUT",url:"/n/nodes",data:this.args,success:function(res){this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.actions=res.actions,this.config=res.config,UI.args.nodes=this.args,this.trigger("load",res.info,reset),this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.select=function(rows){this.selection=rows,this.update()}.bind(this),this.go=function(page){this.args.page=page,this.load(!0)}.bind(this),this.add=function(e){this.refs.add.show({name:"Ajouter une collection",url:"/n/node"})}.bind(this),this.route=function(node){window.location=UI.link(opts.link,node)}.bind(this),this.execute=function(action,rows){this[action.type](rows)}.bind(this),this.clone=function(rows){this.refs.clone.show({name:"Dupliquer",icon:"clone",size:"small",url:"/n/nodes",rows:rows})}.bind(this),this.delete=function(rows){this.refs.delete.show({name:"Supprimer",url:"/n/nodes",rows:rows,text:"Êtes-vous sûr de vouloir supprimer "+rows.length+" élément"+(1<rows.length?"s":"")+" ?"})}.bind(this)}),riot.tag2("node-toolbox",'<div show="{opts.list && opts.list[0]}" ref="button" class="ui icon top left pointing dropdown button"> <i class="wrench icon"></i> <div class="menu"> <div class="header">Outils</div> <div each="{tool in opts.list}" class="item" onclick="{show}"> <i class="{tool.icon} icon"></i> {tool.name} </div> </div> </div> <item-import ref="import" node="{opts.node}" onfinish="{notify}"></item-import> <item-export ref="export" node="{opts.node}" cols="{opts.cols}" data="{opts.data}"></item-export> <item-delete ref="delete" node="{opts.node}" onfinish="{notify}"></item-delete> <ui-modal ref="deduplicate" type="add" onsubmit="{setView}"></ui-modal> <ui-modal ref="refresh" type="process" onsubmit="{notify}"></ui-modal> <ui-modal ref="empty" type="delete" onsubmit="{notify}"></ui-modal>',"","",function(opts){this.on("mount",function(){$(this.refs.button).dropdown({action:"hide"})}),this.show=function(e){this.refs[e.item.tool.id].show(e.item.tool)}.bind(this),this.setView=function(args){args.search=opts.data.search,args.filters=opts.data.filters,this.trigger("change",!1,args
1)}.bind(this),this.notify=function(){this.trigger("change")}.bind(this)}),riot.tag2("page-component",'<div if="{component}" onkeydown="{submit}"> <div class="ui top attached tabular menu"> <a each="{tab in tabs}" class="item {active: active === tab.id}" onclick="{show}"> <i class="{tab.icon} icon"></i> {tab.name} </a> </div> <div class="ui bottom attached tab segment {active: active === \'html\'}"> <ui-code-editor ref="html" mode="html" content="{content.html}" onchange="{setHtml}"></ui-code-editor> </div> <div class="ui bottom attached tab segment {active: active === \'css\'}"> <ui-code-editor ref="css" mode="css" content="{content.css}" onchange="{setStyle}"></ui-code-editor> </div> <div class="ui bottom attached tab segment {active: active === \'js\'}"> <ui-code-editor ref="js" mode="javascript" content="{content.js}" onchange="{setScript}"></ui-code-editor> </div> </div>','page-component .ui.tabular.menu .active.item,[data-is="page-component"] .ui.tabular.menu .active.item{ background: #f9f9f9; } page-component .ui.bottom.attached.segment,[data-is="page-component"] .ui.bottom.attached.segment{ margin: 0; padding: 0; }',"",function(opts){this.tabs=[{id:"html",name:"HTML",icon:"code"},{id:"css",name:"Style",icon:"paint brush"},{id:"js",name:"Script",icon:"setting"}],this.on("mount",function(){this.update()}),this.on("update",function(){this.init()}),this.init=function(){opts.data&&this.component!==opts.data.id&&(this.component=opts.data.id,this.modified=!1,this.active=this.tabs[0].id,this.content={html:opts.data.data.html&&opts.data.data.html[0].text,css:opts.data.data.style&&opts.data.data.style[0].text,js:opts.data.data.script&&opts.data.data.script[0].text},this.update(),this.refs.html.load(),this.refs.css.load(),this.refs.js.load())}.bind(this),this.show=function(e){this.refs[this.active].dump(),this.active=e.item.tab.id,this.update(),this.refs[this.active].load()}.bind(this),this.setHtml=function(content){this.content.html=content,this.modified=!0}.bind(this),this.setStyle=function(content){this.content.css=content,this.modified=!0}.bind(this),this.setScript=function(content){this.content.js=content,this.modified=!0}.bind(this),this.submit=function(e){(e.ctrlKey||e.metaKey)&&83===e.which&&(e.preventDefault(),this.dump())}.bind(this),this.dump=function(){this.refs.html.dump(),this.refs.css.dump(),this.refs.js.dump(),this.modified&&(this.trigger("change",{html:this.content.html&&[{text:this.content.html}],style:this.content.css&&[{text:this.content.css}],script:this.content.js&&[{text:this.content.js}]}),this.modified=!1)}.bind(this)}),riot.tag2("page-editor",'<i if="{!active}" class="inverted circular blue write link icon" onclick="{load}"></i> <i if="{active}" class="inverted circular green checkmark link icon" onclick="{save}"></i> <i if="{active}" class="inverted circular red remove link icon" onclick="{reset}"></i> <ui-modal ref="error" type="alert"></ui-modal>','page-editor .icon,[data-is="page-editor"] .icon{ position: fixed; top: 12px; left: 12px; font-size: 24px; } page-editor .remove.icon,[data-is="page-editor"] .remove.icon{ left: 72px; }',"",function(opts){this.item=UI.getItem(),this.load=function(e){this.item&&this.request({method:"GET",url:"/i/item/"+this.item.id+"/content?t="+opts.token,success:function(res){this.edit(res.blocks,res.content[0].data),this.active=!0,this.update()},error:function(res){this.refs.error.show(res&&res.error)}})}.bind(this),this.edit=function(blocks,data){this.editors=[],blocks.forEach(function(block){var html,tag,el=$(".item-data.type-html.block-"+block.id+" div")[0];el&&(block.config.source=!1,html=data[block.id]&&data[block.id][0]&&data[block.id][0].html,tag=riot.mount(el,"ui-content-editor",{config:block.config,content:html}),this.editors.push({block:block,html:html,tag:tag[0],el:el}))},this)}.bind(this),this.save=function(e){var data={};this.editors.forEach(function(editor){editor.html=editor.tag.getContent(),data[editor.block.id]=[{html:editor.html}]}),$.isEmptyObject(data)?this.reset():this.request({method:"PATCH",url:"/i/item/"+this.item.id+"/content",data:{data:data},success:function(){this.reset()},error:function(res){this.refs.error.show(res&&res.error)}})}
1.bind(this),this.reset=function(e){this.editors.forEach(function(editor){editor.tag.unmount(!0),editor.el.removeAttribute("data-is"),editor.el.innerHTML=editor.html}),this.active=!1,this.update(),riot.mount("*")}.bind(this)}),riot.tag2("page-links",'<div if="{!links}" class="ui active centered inline loader"></div> <div if="{links && !links.length}" class="ui info message"> <div class="header">Aucun élément</div> <p>Veuillez ajouter une page, un lien ou un libellé</p> </div> <div class="editor"> <virtual each="{link in links}"> <div class="before {over: link === drag.target && drag.before}" ondragover="{dragOver}" ondragend="{dragEnd}" ondrop="{drop}"> <div class="{drop: drag.source}"></div> </div> <div draggable="true" class="ui small header {child: link.parent, active: link === active,         drag: link === drag.source, over: link === drag.target && !drag.before}" onclick="{select}" ondragstart="{dragStart}" ondragover="{dragOver}" ondragend="{dragEnd}" ondrop="{drop}"> <i class="{link.icon} icon"></i> <div class="content"> {link.name} <div class="sub header">{link.description}</div> </div> <div class="toolbar" onclick="{stop}"> <i class="unhide icon {link: link.url, disabled: !link.url}" onclick="{view}"></i> <i class="setting icon link" onclick="{edit}"></i> <i class="remove icon link" onclick="{delete}"></i> </div> </div> </virtual> <div class="before {over: !drag.target && drag.before}" ondragover="{dragOver}" ondragend="{dragEnd}" ondrop="{drop}"> <div class="{drop: drag.source}"></div> </div> </div> <ui-modal ref="edit" type="edit" onsubmit="{load}"></ui-modal>','page-links .editor,[data-is="page-links"] .editor{ padding: 1em; } page-links .ui.header,[data-is="page-links"] .ui.header{ display: flex; align-items: center; margin: 0; padding: 0.5em 1em; border-radius: 4px; background: #f2f2f2; cursor: move; user-select: none; } page-links .ui.header.child,[data-is="page-links"] .ui.header.child,page-links .ui.header.child + .before.over,[data-is="page-links"] .ui.header.child + .before.over{ margin-left: 3em; } page-links .ui.header:hover,[data-is="page-links"] .ui.header:hover{ background: #e6e6e6; } page-links .ui.header.over:not(.child),[data-is="page-links"] .ui.header.over:not(.child){ background: #e6e6e6; outline: 2px dashed #666; outline-offset: -2px; } page-links .ui.header.active,[data-is="page-links"] .ui.header.active{ background: #e0e0e0; } page-links .ui.header > .icon,[data-is="page-links"] .ui.header > .icon{ height: auto; margin: 0; } page-links .ui.header .content,[data-is="page-links"] .ui.header .content{ flex: 1; } page-links .ui.header .content,[data-is="page-links"] .ui.header .content,page-links .ui.header .sub.header,[data-is="page-links"] .ui.header .sub.header{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } page-links .ui.header > .toolbar,[data-is="page-links"] .ui.header > .toolbar{ visibility: hidden; padding-left: 1em; cursor: auto; } page-links .ui.header:not(.drag):hover > .toolbar,[data-is="page-links"] .ui.header:not(.drag):hover > .toolbar{ visibility: visible; } page-links .before,[data-is="page-links"] .before{ position: relative; height: 3px; margin: 0.3em 0; } page-links .before.over,[data-is="page-links"] .before.over{ background: #666; } page-links .before .drop,[data-is="page-links"] .before .drop{ position: absolute; width: 100%; top: -1em; bottom: -1em; }',"",function(opts){this.drag={},this.on("mount",function(){this.init()}),this.on("updated",function(){this.init()}),this.init=function(){this.menu!==opts.menu&&(this.menu=opts.menu,this.links=null,this.update(),this.load())}.bind(this),this.load=function(){this.request({method:"PUT",url:"/p/menu/"+this.menu+"/links",success:function(res){this.links=res.links,this.active=null,this.update(),this.trigger("select",null)}})}.bind(this),this.select=function(e){e.item.link.parent||(this.active=this.active!==e.item.link?e.item.link:null,this.update(),this.trigger("select",this.active))}.bind(this),this.dragStart=function(e){e.dataTransfer.setData("text",1),this.drag.source=e.item.link,this.update()}.bind(this),this.dragOver=function(e){e.preventDefault();var target=e.item?e.item.link:null,before=e.currentTarget.classList.contains("before");this.drag.target===target&&this.drag.before===before||(this.drag.target=target,this.drag.before=before,this.update())}.bind(this),this.drop=function(e){e.preventDefault();var move={},source=this.drag.source,target=this.drag.target||this.links.slice(-1)[0],i1=this.links.indexOf(source),i2=this.links.indexOf(target),children=this.links.filter(function(l){return l.parent===source.id});if(this.drag.before){if(i1<i2&&this.drag.target&&(--i2,target=this.links[i2]),source===target||target.parent&&0<children.length)return;this.links.splice(i2,0,this.links.splice(i1,1)[0]),source.parent=target.parent,move.to=target.id,children.forEac
1h(function(child,i){this.links.splice(this.links.indexOf(child),1),this.links.splice(this.links.indexOf(source)+1+i,0,child)},this)}else{if(i2<i1&&(i2+=1),source===target||target.parent||0<children.length)return;this.links.splice(i2,0,this.links.splice(i1,1)[0]),source.parent=target.id,move.in=target.id}this.update(),this.request({method:"PATCH",url:"/p/link/"+source.id,data:{move:move},success:function(){this.load()}})}.bind(this),this.dragEnd=function(e){this.drag={},this.update()}.bind(this),this.view=function(e){e.item.link.url&&window.open(e.item.link.url)}.bind(this),this.edit=function(e){this.refs.edit.show({name:"Modifier l'élément de menu",size:"small",url:"/p/link/"+e.item.link.id})}.bind(this),this.delete=function(e){var index=this.links.indexOf(e.item.link);this.links.splice(index,1),this.update(),this.request({method:"DELETE",url:"/p/link/"+e.item.link.id,success:function(){this.load()}})}.bind(this)}),riot.tag2("page-list",'<div class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> <div> <button class="ui primary button" onclick="{add}"> Ajouter une page </button> <ui-modal ref="add" type="add" onsubmit="{load}"></ui-modal> </div> </div> <ui-list-table ref="list" cols="{cols}" rows="{rows}" data="{args}" selectable="true" link="{opts.link}" onsort="{sort}" onselect="{select}"></ui-list-table> <div if="{count}" class="list footer"> <div> <button class="ui {disabled: !selection || !selection.length} primary button" onclick="{insert}"> <i class="reply icon"></i> Ajouter au menu </button> <ui-action list="{actions}" rows="{selection}" onaction="{execute}"></ui-action> <ui-modal ref="delete" type="delete" onsubmit="{load}"></ui-modal> </div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>',"","",function(opts){this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.load(!0)}),this.load=function(){this.request({method:"PUT",url:"/p/pages?n="+opts.node,data:this.args,success:function(res){this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.actions=res.actions,this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.select=function(rows){this.selection=rows,this.update()}.bind(this),this.go=function(page){this.args.page=page,this.load(!0)}.bind(this),this.add=function(e){this.refs.add.show({name:"Ajouter une page",url:"/i/item?p&n="+opts.node})}.bind(this),this.insert=function(){this.trigger("insert",this.selection),this.refs.list.clear()}.bind(this),this.execute=function(action,rows){this[action.type](rows)}.bind(this),this.delete=function(rows){this.refs.delete.show({name:"Supprimer",url:"/i/items",soft:!0,rows:rows,text:"Êtes-vous sûr de vouloir supprimer "+rows.length+" élément"+(1<rows.length?"s":"")+" ?"})}.bind(this)}),riot.tag2("page-menus",'<div class="content"> <div if="{!active}" class="ui info message"> <div class="header">Aucun menu</div> <p>Veuillez ajouter un menu pour commencer l\'édition</p> </div> <div if="{active}"> <page-links ref="links" menu="{active.id}" onselect="{select}"></page-links> </div> </div> <aside> <div class="ui styled accordion"> <div class="title active"> <i class="bars icon"></i> Menu </div> <div class="content active"> <div ref="dropdown" class="ui fluid selection dropdown"> <i class="dropdown icon"></i> <div class="{default: !active} text">{active ? active.name : \'Sélectionner...\'}</div> <div class="menu"> <div each="{menu in menus}" class="item" onclick="{set}"> {menu.name} </div> </div> </div> <button if="{perms && perms.create}" class="ui primary button" onclick="{add}"> <i class="plus icon"></i> Ajouter </button> <button if="{perms && perms.update}" class="ui basic grey button {disabled: !active}" onclick="{edit}"> <i class="write icon"></i> Modifier </button> <button if="{perms && perms.delete}" class="ui basic red button {disabled: !active}" onclick="{delete}"> <i class="remove icon"></i> Supprimer </button> </div> </div> <div if="{active}" class="ui styled accordion"> <div class="title active"> <i class="plus icon"></i> Ajouter un élément de menu </div> <div class="content active"> <div class="tabs"> <div class="ui secondary pointing menu"> <a each="{node, i in nodes}" class="item {active: tab === node}" onclick="{showTab}"> <i class="{node.icon} icon"></i> {node.name} </a> <a class="item {active: tab === \'link\'}" type="link" onclick="{showTab}"> <i class="linkify icon"></i> Lien </a> <a class="item {active: tab === \'text\'}" type="text" onclick="{showTab}"> <i class="font icon"></i> Libellé </a> </div> </div> <page-list each="{node, i in nodes}" if="{tab === node}" node="{node.id}" link="#item/$id/$token" oninsert="{addPages}"></page-list> <div if="{tab === \'link\' || tab === \'text\'}"> <ui-message ref="message"></ui-message> <ui-form ref="form" blocks="{form}" onchange="{send}" flat></ui-form> <button ref="button" class="ui primary button" onclick="{submit}"> <i class="reply icon"></i> Ajouter au menu </button> </div> </div> </div> </aside> <ui-modal ref="add" type="add" onsubmit="{reset}"></ui-modal> <ui-modal ref="edit" type="edit" onsubmit="{load}"></ui-modal> <ui-modal ref="delete" type="delete" onsubmit="{reset}"></ui-modal>','page-menus,[data-is="page-menus"]{ display: flex; } page-menus > .content,[data-is="page-menus"] > .content{ width: 60%; } page-menus > aside,[data-is="page-menus"] > aside{ position: sticky; align-self: flex-start; width: 40%; top: 1em; margin-left: 1em; } page-menus > aside .ui.styled.accordion,[data-is="page-menus"] > aside .ui.styled.accordion{ width: 100%; margin-bottom: 2em; } page-menus > aside .ui.styled.accordion .title,[data-is="page-menus"] > aside .ui.styled.accordion .title{ font-size: 1.3em; } page-menus > aside .ui.styled.accordion ui-form + .ui.button,[data-is="page-menus"] > aside .ui.styled.accordion ui-form + .ui.button{ margin: 1em 0 0 1em; } page-menus > aside .ui.dropdown:not(:last-child),[data-is="page-menus"] > aside .ui.dropdown:not(:last-child){ margin-bottom: 1em; } page-menus > aside .tabs,[data-is="page-menus"] > aside .tabs{ margin-bottom: 1em; overflow-x: auto; }',"",function(opts){this.forms={link:[{id:"name",type:"text",name:"Libellé"},{id:"url",type:"url",name:"Adresse URL"}],text:[{id:"name",type:"text",name:"Libellé"}]},this.on("mount",function(){$(this.refs.dropdown).dropdown({action:"hide"}),this.load()}),this.load=function(){this.request({method:"PUT",url:"/p/menus",data:this.args,success:function(res){this.menus=res.menus,this.perms=res.perms,this.nodes=res.nodes,this.tab=res.nodes[0]||"link",this.active=res.menus.filter(function(menu){return menu.id===(this.active&&this.active.id)},this)[0]||res.menus[0],this.trigger("load",res.info),this.update()}})}.bind(this),this.set=function(e){this.active=e.item.menu,this.update()}.bind(this),this.reset=function(menu){this.active=menu.id?menu:null,this.load()}.bind(this),this.showTab=function(e){this.tab=e.item?e.item.node:e.currentTarget.type,this.form=this.forms[this.tab],this.update(),this.form&&this.refs.message.reset()}.bind(this),this.select=function(link){this.selected=link}.bind(this),this.add=function(e){this.refs.add.show({name:"Ajouter un menu",size:"small",url:"/p/menu"})}.bind(this),this.edit=function(e){this.refs.edit.show({name:"Modifier le menu",size:"small",url:"/p/menu/"+this.active.id})}.bind(this),this.delete=function(e){this.refs.delete.show({name:"Supprimer le menu",url:"/p/menu/"+this.active.id,text:"Êtes-vous sûr de vouloir supprimer le menu ?"})}.bind(this),this.addPages=function(list){this.send(list.map(function(row){return{name:row.data.name,page:[{id:row.page}]}}))}.bind(this),this.submit=function(e){this.refs.form.dump()}.bind(this),this.send=function(list){var form=!Array.isArray(list);this.request({method:"POST",url:"/p/links?m="+this.active.id,data:{parent:this.selected?this.selected.id:void 0,list:Array.isArray(list)?list:[list]},beforeSend:function(){form&&this.refs.button.classList.add("loading")},success:function(){form&&(this.refs.message.reset(),this.refs.form.reset()),this.refs.links.load()},error:function(res){this.refs.message.set("error",res&&res.error)},complete:function(){form&&this.refs.button.classList.remove("loading")}})}.bind(this)}),riot.tag2("page-password",'<div if="{!password}" class="ui info message"> <div class="header">Mot de passe requis</div> Veuillez entrer le mot de passe pour accéder à cette page </div> <div if="{password}" class="ui error message"> <div class="header">Mot de passe requis</div> Le mot de passe saisi est incorrect </div> <div class="ui left icon input"> <input ref="password" type="password" riot-value="{password}" placeholder="Mot de passe" autocomplete="off"> <i class="lock icon"></i> </div> <button class="ui primary button" onclick="{submit}">Valider</button>',"","",function(opts){this.password=(document.cookie.match(/pw=([^=;]+)/)||[])[1],this.submit=function(e){document.cookie="pw="+this.refs.password.value.trim()+"; path="+window.location.pathname,window.location.reload()}.bind(this)}),riot.tag2("page-search-private",'<ui-search onchange="{send}"></ui-search> <div if="{loader}" class="ui active centered inline loader"></div> <div if="{results && !results.length}" class="ui info message"> <div class="header">Aucun résultat</div> <p>Veuillez modifier les critères de recherche</p> </div> <div each="{result in results}" class="result hidden"> <a href="/{result.slug}">{result.name}</a> <ui-html content="{result.text}"></ui-html> </div>','page-search-private ui-search,[data-is="page-search-private"] ui-search{ display: block; text-align: center; } page-search-private ui-search .ui.input,[data-is="page-search-private"] ui-search .ui.input{ max-width: 100%; width: 30em; } page-search-private .ui.inline.loader,[data-is="page-search-private"] .ui.inline.loader{ margin-top: 1em; } page-search-private .result,[data-is="page-search-private"] .result{ margin: 2em 0; transition: opacity 0.3s; } page-search-private .result.hidden,[data-is="page-search-private"] .result.hidden{ opacity: 0; } page-search-private .result a,[data-is="page-search-private"] .result a{ display: block; font-size: 1.5em; line-height: 1.3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } page-search-private .result em,[data-is="page-search-private"] .result em{ font-style: normal; font-weight: bold; }',"",function(opts){this.on("mount",function(){UI.getUser()?$("input",this.root).focus():$("page-search-private").css("display","none")}),this.on("unmount",function(){clearTimeout(this.timeout),clearInterval(this.interval)}),this.send=function(text){if(!text)return this.results=null,void this.update();clearInterval(this.interval),this.timeout=setTimeout(this.showLoader,1e3),this.request({method:"GET",url:"/p/pages-private?s",data:{q:text},success:function(res){clearTimeout(this.timeout),this.loader=!1,this.results=res.results,this.update(),this.interval=setInterval(this.showResult,50)}})}.bind(this),this.showLoader=function(){this.loader=!0,this.update()}.bind(this),this.showResult=function(){$(".result.hidden",this.root).first().removeClass("hidden")}.bind(this)}),riot.tag2("page-search",'<ui-search onchange="{send}"></ui-search> <div if="{loader}" class="ui active centered inline loader"></div> <div if="{results && !results.length}" class="ui info message"> <div class="header">Aucun résultat</div> <p>Veuillez modifier les critères de recherche</p> </div> <div each="{result in results}" class="result hidden"> <a href="/{result.slug}">{result.name}</a> <ui-html content="{result.text}"></ui-html> </div>','page-search ui-search,[data-is="page-search"] ui-search{ display: block; text-align: center; } page-search ui-search .ui.input,[data-is="page-search"] ui-search .ui.input{ max-width: 100%; width: 30em; } page-search .ui.inline.loader,[data-is="page-search"] .ui.inline.loader{ margin-top: 1em; } page-search .result,[data-is="page-search"] .result{ margin: 2em 0; transition: opacity 0.3s; } page-search .result.hidden,[data-is="page-search"] .result.hidden{ opacity: 0; } page-search .result a,[data-is="page-search"] .result a{ display: block; font-size: 1.5em; line-height: 1.3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } page-search .result em,[data-is="page-search"] .result em{ font-style: normal; font-weight: bold; }',"",function(opts){this.on("mount",function(){$("input",this.root).focus()}),this.on("unmount",function(){clearTimeout(this.timeout),clearInterval(this.interval)}),this.send=function(text){if(!text)return this.results=null,void this.update();clearInterval(this.interval),this.timeout=setTimeout(this.showLoader,1e3),this.request({method:"GET",url:"/p/pages?s",data:{q:text},success:function(res){clearTimeout(this.timeout),this.loader=!1,this.results=res.results,this.update(),this.interval=setInterval(this.showResult,50)}})}.bind(this),this.showLoader=function(){this.loader=!0,this.update()}.bind(this),this.showResult=function(){$(".result.hidden",this.root).first().removeClass("hidden")}.bind(this)}),riot.tag2("page-style",'<div if="{style}" class="ui segment" onkeydown="{submit}"> <ui-code-editor ref="editor" mode="css" content="{content}" onchange="{set}"></ui-code-editor> </div>','page-style .ui.segment,[data-is="page-style"] .ui.segment{ padding: 0; }',"",function(opts){this.on("mount",function(){this.update()}),this.on("update",function(){this.init()}),this.init=function(){opts.data&&this.style!==opts.data.id&&(this.style=opts.data.id,this.content=opts.data.data.css&&opts.data.data.css[0].text,this.modified=!1,this.update(),this.refs.editor.load())}.bind(this),this.set=function(content){this.content=content,this.modified=!0}.bind(this),this.submit=function(e){(e.ctrlKey||e.metaKey)&&83===e.which&&(e.preventDefault(),this.dump())}.bind(this),this.dump=function(){this.refs.editor.dump(),this.modified&&(this.trigger("change",{css:[{text:this.content}]}),this.modified=!1)}.bind(this)}),riot.tag2("page-summary",'<div if="{links && links.length}" class="wrapper"> <span class="heading">Sommaire</span> <a each="{link in links}" href="#{link.id}" class="{link.type} link"> <span class="number">{link.number}</span> {link.text} </a> </div>','page-summary .wrapper,[data-is="page-summary"] .wrapper{ background: #f6f6f6; border: 1px solid #ccc; padding: 1em; } page-summary .heading,[data-is="page-summary"] .heading,page-summary .link,[data-is="page-summary"] .link{ display: block; } page-summary .heading,[data-is="page-summary"] .heading{ text-align: center; font-weight: bold; } page-summary .number,[data-is="page-summary"] .number{ margin-right: 0.5em; } page-summary .h3.link,[data-is="page-summary"] .h3.link{ margin-left: 2em; } page-summary .h4.link,[data-is="page-summary"] .h4.link{ margin-left: 4em; } page-summary .h5.link,[data-is="page-summary"] .h5.link{ margin-left: 6em; } page-summary .h6.link,[data-is="page-summary"] .h6.link{ margin-left: 8em; }',"",function(opts){this.links=[],this.number=[],this.on("mount",function(){this.init()}),this.init=function(){$("main").find("h2, h3, h4, h5, h6").each(function(i,heading){var type=heading.tagName.toLowerCase(),text=$(heading).text().trim(),id=text.replace(/[ #]+/g,"_"),number=this.getNumber(type);heading.setAttribute("id",id),this.links.push({id:id,type:type,number:number,text:text})}.bind(this)),this.update(),window.location.hash&&(window.location.href=window.location.href)}.bind(this),this.getNumber=function(type){var i=type[1]-2;return this.number[i]=this.number[i]?this.number[i]+1:1,this.number.splice(1+i),this.number.join(".")}.bind(this)}),riot.tag2("room-chat",'<div class="rooms"> <div each="{room in opts.rooms}" class="room {active: room === active}" onclick="{show}"> <i class="{user: room.type === 1, users: room.type === 2} icon"></i> {room.name} <div if="{room.unread}" class="ui blue circular label">{room.unread}</div> </div> </div> <div if="{active}" class="chat"> <div ref="events" class="events"> <room-events class="events" events="{active.events}" typing="{active.typers}"></room-events> </div> <div class="control"> <div class=
1"ui fluid icon input"> <input ref="text" type="text" placeholder="Tapez un message" oninput="{notify}" onkeydown="{send}"> </div> </div> </div>','room-chat,[data-is="room-chat"]{ display: flex; height: 50em; } room-chat .rooms,[data-is="room-chat"] .rooms{ width: 20em; max-width: 50%; overflow: auto; border: 1px solid #e0e0e0; } room-chat .room,[data-is="room-chat"] .room{ border-bottom: 1px solid #e0e0e0; padding: 1em; cursor: pointer; } room-chat .room:hover,[data-is="room-chat"] .room:hover{ background: #f2f2f2; } room-chat .room.active,[data-is="room-chat"] .room.active{ background: #e0e1e2; } room-chat .room .ui.label,[data-is="room-chat"] .room .ui.label{ float: right; } room-chat .chat,[data-is="room-chat"] .chat{ flex: 1; display: flex; flex-direction: column; } room-chat .events,[data-is="room-chat"] .events{ flex: 1; overflow: auto; background: #e0e1e2; } room-chat .control,[data-is="room-chat"] .control{ padding: 1em; background: #f5f5f5; }',"",function(opts){this.on("mount",function(){UI.require("/io.js",this.load)}),this.on("unmount",function(){this.socket&&this.socket.disconnect()}),this.load=function(){var url;this.socket&&this.socket.connected||(url=UI.getHost()+":8000/chat",this.started=(new Date).getTime(),this.socket=io(url,{withCredentials:!0}),this.socket.on("ready",this.show),this.socket.on("history",this.setHistory),this.socket.on("typing",this.setTyper),this.socket.on("event",this.push))}.bind(this),this.show=function(e){this.active=e?e.item.room:opts.rooms[0],this.active.unread&&this.socket.emit("read",{room:this.active.id}),this.active.unread=0,this.update(),this.scroll(),this.refs.text.value=this.active.text||"",this.refs.text.focus(),this.active.history||this.socket.emit("history",{room:this.active.id,before:this.started})}.bind(this),this.setHistory=function(data){var target=opts.rooms.filter(function(room){return room.id===data.room})[0];target&&!target.history&&(target.history=!0,target.events=[].concat(data.events,target.events||[]),this.update(),this.scroll())}.bind(this),this.setTyper=function(data){var target=opts.rooms.filter(function(room){return room.id===data.room})[0];target&&(target.typers=target.typers||{},data.active?target.typers[data.created.id]=data:delete target.typers[data.created.id],this.update(),this.scroll())}.bind(this),this.push=function(data){var target=opts.rooms.filter(function(room){return room.id===data.room})[0];target&&(target.events=target.events||[],target.events.push(data),target.typers&&target.typers[data.created.id]&&delete target.typers[data.created.id],target===this.active?this.socket.emit("read",{room:target.id}):target.unread=(target.unread||0)+1,this.update(),target===this.active&&this.scroll())}.bind(this),this.scroll=function(){$(this.refs.events).scrollTop(this.refs.events.scrollHeight)}.bind(this),this.notify=function(e){this.active.text=this.refs.text.value,this.active.typing||(this.active.typing=!0,this.socket.emit("typing",{room:this.active.id}),setTimeout(function(room){room.typing=!1}.bind(this,this.active),1e3))}.bind(this),this.send=function(e){var text=this.refs.text.value.trim();13===e.which&&text&&(this.socket.emit("message",{room:this.active.id,text:text}),this.active.text="",this.refs.text.value="",this.refs.text.focus())}.bind(this)}),riot.tag2("room-events",'<virtual each="{event in opts.events}"> <div if="{event.type === 4}" class="{self: event.created.id === user.id} message"> <div class="author"> {event.created.by} </div> <div class="text"> {event.data.text} <div class="time">{formatDate(event.created.at)}</div> </div> </div> </virtual> <div each="{typing in opts.typing}" class="message"> <div class="author"> {typing.created.by} </div> <div class="typing"> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> </div> </div>','room-events,[data-is="room-events"]{ display: flex; flex-direction: column; align-items: flex-start; padding: 2em; } room-events > *:not(:first-child),[data-is="room-events"] > *:not(:first-child){ margin-top: 1em; } room-events .message,[data-is="room-events"] .message{ max-width: 66%; padding: 1em; background: #f5f5f5; border-radius: 6px; } room-events .self.message,[data-is="room-events"] .self.message{ background: #2185d0; color: #f5f5f5; align-self: flex-end; } room-events .message .author,[data-is="room-events"] .message .author{ font-weight: bold; } room-events .self.message .author,[data-is="room-events"] .self.message .author{ display: none; } room-events .message .time,[data-is="room-events"] .message .time{ float: right; position: relative; bottom: -6px; font-size: 11px; padding-left: 1.5em; color: #999; } room-events .self.message .time,[data-is="room-events"] .self.message .time{ c
1olor: #ddd; } room-events .typing,[data-is="room-events"] .typing{ align-items: flex-end; display: flex; height: 20px; } room-events .typing .dot,[data-is="room-events"] .typing .dot{ animation: bounce 1s infinite ease-in-out; background-color: #999; border-radius: 50%; width: 7px; height: 7px; margin-right: 4px; vertical-align: middle; display: inline-block; } room-events .typing .dot:nth-child(1),[data-is="room-events"] .typing .dot:nth-child(1){ animation-delay: 200ms; } room-events .typing .dot:nth-child(2),[data-is="room-events"] .typing .dot:nth-child(2){ animation-delay: 300ms; } room-events .typing .dot:nth-child(3),[data-is="room-events"] .typing .dot:nth-child(3){ animation-delay: 400ms; } room-events .typing .dot:last-child,[data-is="room-events"] .typing .dot:last-child{ margin-right: 0; } @keyframes bounce { 0%, 44% { transform: translateY(0px); } 28% { transform: translateY(-7px); } }',"",function(opts){this.user=UI.getUser(),this.formatDate=function(date){return new Date(date).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}.bind(this)}),riot.tag2("room-list",'<div if="{controls}" class="list header"> <div></div> <div> <button class="ui primary button" onclick="{add}"> Nouvelle conversation </button> <button class="ui button" onclick="{addGroup}"> Nouveau groupe </button> <ui-modal ref="add" type="add" onsubmit="{load}"></ui-modal> </div> </div> <room-chat if="{rooms}" rooms="{rooms}"></room-chat>',"","",function(opts){this.controls=void 0!==opts.controls,this.args=UI.args.rooms||{},this.on("mount",function(){this.load(!0)}),this.load=function(reset){this.request({method:"PUT",url:"/r/rooms",data:this.args,success:function(res){this.rooms=res.rooms,this.args=res.args,this.count=res.info.count,UI.args.rooms=this.args,this.trigger("load",res.info,reset),this.update()}})}.bind(this),this.add=function(e){this.refs.add.show({name:"Nouvelle conversation",size:"small",url:"/r/room?p"})}.bind(this),this.addGroup=function(e){this.refs.add.show({name:"Nouveau groupe",size:"small",url:"/r/room"})}.bind(this)}),riot.tag2("site-admin",'<nav if="{menus}"> <div class="viewport"> <div if="{logo}" class="logo"> <a href="#" onclick="{closeMenu}"><img riot-src="{logo.url}"></a> </div> <div each="{menu in menus}" if="{menu.items.length}" class="ui vertical fluid text menu"> <div class="header item">{menu.name}</div> <a each="{item in menu.items}" class="item {active: item.url === active}" href="{item.url}" onclick="{closeMenu}"> <i class="{item.icon} icon"></i> {item.name} </a> </div> </div> </nav> <header if="{info}"> <site-header info="{info}" config="{config}" onmenu="{toggleMenu}"></site-header> </header> <main onclick="{closeMenu}"> <site-dashboard if="{ui.home}" show="{is.home}" onload="{show}"></site-dashboard> <site-search if="{ui.search}" show="{is.search}" link="#item/$id/$token" onload="{show}" controls></site-search> <item-list if="{ui.node}" show="{is.node}" node="{ui.node[1]}" view="{ui.node[2]}" link="#item/$id/$token" onload="{show}" controls></item-list> <item-content if="{ui.item}" show="{is.item}" item="{ui.item[1]}" token="{ui.item[2]}" onload="{show}" controls></item-content> <node-list if="{ui.nodes}" show="{is.nodes}" link="#node/$id" onload="{show}" controls></node-list> <file-list if="{ui.box}" show="{is.box}" box="{ui.box[1]}" link="{fileLink}" onload="{show}" viewer controls></file-list> <page-menus if="{ui.menus}" show="{is.menus}" onload="{show}" controls></page-menus> <item-sales if="{ui.sales}" show="{is.sales}" link="#item/$item/$token" onload="{show}" controls></item-sales> <mail-list if="{ui.mails}" show="{is.mails}" link="#" onload="{show}" controls></mail-list> <room-list if="{ui.rooms}" show="{is.rooms}" onload="{show}" controls></room-list> <user-list if="{ui.users}" show="{is.users}" link="#item/$item/$token" onload="{show}" controls></user-list> <item-trash if="{ui.trash}" show="{is.trash}" onload="{show}" controls></item-trash> <item-history if="{ui.history}" show="{is.history}" link="#" onload="{show}" controls></item-history> <site-list if="{ui.sites}" show="{is.sites}" link="#" onload="{show}
1" controls></site-list> </main> <user-login ref="login" onlogin="{retryRequests}" modal></user-login> <ui-modal ref="error" type="alert"></ui-modal>','site-admin,[data-is="site-admin"]{ position: relative; left: 0; } site-admin,[data-is="site-admin"],site-admin > *,[data-is="site-admin"] > *{ transition: all 0.3s ease; } site-admin > nav,[data-is="site-admin"] > nav{ position: fixed; margin-left: -14em; width: 14em; left: 14em; top: 0; bottom: 0; background: #f2f2f2; border-right: 1px solid #dcdcdd; overflow: hidden; z-index: 1; } site-admin > nav .viewport,[data-is="site-admin"] > nav .viewport{ overflow-y: scroll; height: 100%; margin-right: -3em; } site-admin > nav .logo,[data-is="site-admin"] > nav .logo{ width: 14em; margin-top: 1.5em; text-align: center; } site-admin > nav .logo img,[data-is="site-admin"] > nav .logo img{ max-width: 80%; } site-admin > nav .ui.vertical.text.menu,[data-is="site-admin"] > nav .ui.vertical.text.menu,site-admin > nav .ui.vertical.text.menu:first-child,[data-is="site-admin"] > nav .ui.vertical.text.menu:first-child,site-admin > nav .ui.vertical.text.menu:last-child,[data-is="site-admin"] > nav .ui.vertical.text.menu:last-child{ margin: 2em 0 1em; } site-admin > nav .ui.vertical.text.menu .item,[data-is="site-admin"] > nav .ui.vertical.text.menu .item{ margin: 0; padding: 0.6em 2.4em; outline: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } site-admin > nav .ui.vertical.text.menu .header.item,[data-is="site-admin"] > nav .ui.vertical.text.menu .header.item{ margin: 0; } site-admin > nav .ui.vertical.text.menu a.item:hover,[data-is="site-admin"] > nav .ui.vertical.text.menu a.item:hover{ background: rgba(0, 0, 0, .05); } site-admin > nav .ui.vertical.text.menu a.item.active,[data-is="site-admin"] > nav .ui.vertical.text.menu a.item.active{ background: #e0e0e0; } site-admin > header,[data-is="site-admin"] > header{ margin-left: 14em; padding: 2em 2em 0; z-index: 999; } site-admin > main,[data-is="site-admin"] > main{ margin-left: 14em; padding: 2em; } @media only screen and (max-width: 1200px) { site-admin.menu,[data-is="site-admin"].menu,site-admin.menu > nav,[data-is="site-admin"].menu > nav{ left: 14em; } site-admin.menu > header,[data-is="site-admin"].menu > header{ left: 14em; right: -14em; } site-admin > nav,[data-is="site-admin"] > nav{ left: 0; } site-admin > header,[data-is="site-admin"] > header{ position: fixed; background: #f9fafb; border-bottom: 1px solid rgba(34, 36, 38, 0.1); left: 0; top: 0; right: 0; padding: 0; margin-left: 0; } site-admin > main,[data-is="site-admin"] > main{ margin-top: 3em; margin-left: 0; padding: 1em; } } @media print { site-admin > header,[data-is="site-admin"] > header,site-admin > main,[data-is="site-admin"] > main{ margin-left: 0; padding: 1em 0; } site-admin > nav,[data-is="site-admin"] > nav{ left: 0; } }',"",function(opts){this.ui={},this.is={},this.xhr=[];var alias={docs:"box"};this.on("mount",function(){window.addEventListener("error",this.reportError),UI.on("request:error",this.handleError),this.init()}),this.init=function(){this.request({method:"GET",url:"/s/admin?init",success:function(res){this.logo=res.logo,this.menus=res.menus,this.config=res.config,this.update(),riot.route(this.route),riot.route.start(!0)}})}.bind(this),this.route=function(ui){this.target=(alias[ui]?alias[ui]:ui)||"home",this.ui[this.target]=arguments,this.update(),$(".ui.visible.modal").modal("hide")}.bind(this),this.show=function(info,top){for(var target in this.ui)target!==this.target&&delete this.ui[target];this.is={},this.is[this.target]=!0,this.info=info,this.active=info.origin||location.hash,this.update(),document.title=info.title,!0===top&&(document.documentElement.scrollTop=0)}.bind(this),this.fileLink=function(item){return item.url||(item.id?"#box/"+item.id:"#docs")}.bind(this),this.reportError=function(e){this.errorReported||(this.errorReported=!0,this.request({method:"POST",url:"/s/error",data:{url:window.location.href,agent:window.navigator.userAgent,file:e.filename,line:e.lineno,column:e.colno,message:e.message}}))}.bind(this),this.handleError=function(status,data,request){401===status?(this.xhr.push(request),this.refs.login.show()):data&&data.error&&this.refs.error.show(data.error)}.bind(this),this.retryRequests=function(){this.xhr.forEach(function(request){request.call()}),this.xhr=[]}.bind(this),this.toggleMenu=function(e){this.root.classList.toggle("menu")}.bind(this),this.closeMenu=function(e){this.root.classList.remove("menu")}.bind(this)}),riot.tag2("site-config",'<div show="{opts.list && opts.list[0]}" ref="button" class="ui icon top left pointing dropdown button"> <i class="setting icon"></i> <div class="menu"> <div class="header">Configuration</div> <div each="{config in opts.list}" class="item" onclick="{show}"> <i class="{config.icon} icon"></i> {config.name} </div> </div> </div> <ui-config ref="lists"> <list-values if="{tab === \'values\'}" list="{active.id}" link="#"></list-values> </ui-config> <ui-config ref="templates"> <mail-template ref="data" data="{active}" onchange="{send}"></mail-template> </ui-config> <ui-config ref="languages"></ui-config>',"","",function(opts){this.on("mount",function(){$(this.refs.button).dropdown({action:"hide"})}),this.show=function(e){this.refs[e.item.config.id].show(e.item.config)}.bind(this)}),riot.tag2("site-dashboard",'<div class="ui four small statistics"> <a each="{node in nodes}" href="#node/{node.id}" class="statistic"> <div class="value"><i class="{node.color} {node.icon} icon"></i>
1 {node.count.toLocaleString()}</div> <div class="label">{node.name}</div> </a> </div>',"","",function(opts){this.on("mount",function(){this.load(!0)}),this.load=function(reset){this.request({method:"GET",url:"/s/dashboard",success:function(res){this.nodes=res.nodes,this.trigger("load",res.info,reset),this.update()}})}.bind(this)}),riot.tag2("site-header",'<div class="wrapper"> <h1 class="ui header"> <i class="{opts.info.color} {opts.info.icon} icon"></i> <div class="content"> {opts.info.title} <div class="sub header"> <virtual each="{item in opts.info.parents}"> <a href="{item.url}">{item.name}</a> <i class="right angle icon"></i> </virtual> {opts.info.description} </div> </div> </h1> <div class="ui secondary icon menu"> <a class="item keep" onclick="{toggleMenu}"> <i class="sidebar icon"></i> </a> </div> <div class="ui secondary icon menu"> <div ref="search" class="ui right aligned input dropdown item"> <div ref="loading" class="ui left icon input"> <input type="text" placeholder="Recherche globale" onclick="{showSearch}" onkeydown="{stop}" oninput="{search}"> <i class="search icon"></i> </div> <div class="menu"> <a each="{item in items}" class="item" href="{UI.link(link, item)}" title="{item.name}"> <i class="{item.color} {item.icon} icon"></i> {item.name} </a> <div if="{items && items.length}" class="divider"></div> <a class="item" href="#search"> <i class="setting icon"></i> Recherche avancée </a> </div> </div> <div if="{opts.config && opts.config.length}" ref="config" class="ui icon dropdown item"> <i class="setting icon"></i> <div class="menu"> <div class="header">Configuration du site</div> <virtual each="{group, i in opts.config}"> <div if="{i !== 0}" class="divider"></div> <div each="{config in group.items}" class="item" onclick="{showConfig}"> <i class="{config.icon} icon"></i> {config.name} </div> </virtual> </div> </div> <div ref="user" class="ui icon dropdown item keep"> <i class="user outline icon"></i> <div class="menu"> <div class="header">{user.name}</div> <div class="item" onclick="{editProfile}"> <i class="user circle outline icon"></i> Profil </div> <div class="item" onclick="{editPassword}"> <i class="lock icon"></i> Mot de passe </div> <div class="item" onclick="{logout}"> <i class="power icon"></i> Déconnexion </div> </div> </div> </div> </div> <ui-config ref="lists"> <list-values if="{tab === \'values\'}" list="{active.id}" link="#"></list-values> </ui-config> <ui-config ref="sequences"></ui-config> <ui-config ref="menus"></ui-config> <ui-config ref="themes"></ui-config> <ui-config ref="styles"> <page-style ref="data" data="{active}" onchange="{send}"></page-style> </ui-config> <ui-config ref="fragments"></ui-config> <ui-config ref="pagemenus"> <page-menu data="{active}"></page-menu> </ui-config> <ui-config ref="components"> <page-component ref="data" data="{active}" onchange="{send}"></page-component> </ui-config> <ui-config ref="coupons"></ui-config> <ui-config ref="shippings"></ui-config> <ui-config ref="payments"></ui-config> <ui-config ref="senders"> <mail-signature if="{tab === \'signature\'}" ref="data" data="{active}" onchange="{send}"></mail-signature> </ui-config> <ui-config ref="templates"> <mail-template ref="data" data="{active}" onchange="{send}"></mail-template> </ui-config> <ui-config ref="roles"> <user-permissions if="{tab === \'permissions\'}" role="{active.id}"></user-permissions> </ui-config> <ui-modal ref="profile" type="edit"></ui-modal> <ui-modal ref="password" type="edit"></ui-modal>','site-header .wrapper,[data-is="site-header"] .wrapper{ display: flex; justify-content: space-between; align-items: flex-start; } site-header .ui.header,[data-is="site-header"] .ui.header{ margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } site-header .ui.secondary.menu,[data-is="site-header"] .ui.secondary.menu{ margin: 0; } site-header .menu:first-of-type,[data-is="site-header"] .menu:first-of-type{ display: none; order: -1; } site-header .ui.secondary.menu .item,[data-is="site-header"] .ui.secondary.menu .item{ margin: 0; } site-header .ui.secondary.menu .input.dropdown,[data-is="site-header"] .ui.secondary.menu .input.dropdown{ padding: 0; margin-right: 1em; } site-header .ui.secondary.menu .input.dropdown .menu,[data-is="site-header"] .ui.secondary.menu .input.dropdown .menu{ max-width: 150%; } site-header .ui.secondary.menu .input.dropdown .menu .item,[data-is="site-header"] .ui.secondary.menu .input.dropdown .menu .item{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } site-header .ui.secondary.menu .ui.dropdown .item,[data-is="site-header"] .ui.secondary.menu .ui.dropdown .item{ align-self: auto; } @media only screen and (max-width: 1200px) { site-header .wrapper,[data-is="site-header"] .wrapper{ al
1ign-items: center; } site-header .wrapper .ui.header,[data-is="site-header"] .wrapper .ui.header{ margin: 0; font-size: 1em; } site-header .ui.header .sub.header,[data-is="site-header"] .ui.header .sub.header{ display: none; } site-header .ui.secondary.menu,[data-is="site-header"] .ui.secondary.menu{ display: flex; margin: 0; } site-header .ui.secondary.menu .item:not(.keep),[data-is="site-header"] .ui.secondary.menu .item:not(.keep){ display: none; } } @media print { site-header .ui.secondary.menu,[data-is="site-header"] .ui.secondary.menu{ display: none; } }',"",function(opts){this.link=opts.link||"#item/$id/$token",this.user=UI.getUser(),this.on("mount",function(){$(this.refs.search).dropdown({action:"hide"}),$(this.refs.config).dropdown({action:"hide"}),$(this.refs.user).dropdown({action:"hide"})}),this.on("unmount",function(){clearTimeout(this.timeout)}),this.toggleMenu=function(e){this.trigger("menu")}.bind(this),this.showSearch=function(e){e.stopPropagation(),$(this.refs.search).dropdown("show")}.bind(this),this.search=function(e){clearTimeout(this.timeout);var text=e.target.value.trim();if(!text)return this.items=null,void this.update();this.timeout=setTimeout(function(){this.request({method:"GET",url:"/s/items?q="+text,success:function(res){this.items=res.options,this.update()}})}.bind(this),500)}.bind(this),this.showConfig=function(e){this.refs[e.item.config.id].show(e.item.config)}.bind(this),this.editProfile=function(e){this.refs.profile.show({name:"Informations de profil",icon:"user circle outline",url:"/u/user/profile"})}.bind(this),this.editPassword=function(e){this.refs.password.show({name:"Changement de mot de passe",icon:"lock",url:"/u/user/password"})}.bind(this),this.logout=function(e){this.request({method:"GET",url:"/u/logout",success:function(){window.location="/"}})}.bind(this)}),riot.tag2("site-list",'<div if="{controls}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> <div> <button class="ui primary button" onclick="{add}"> Ajouter un site </button> <ui-modal ref="add" type="add" onsubmit="{load}"></ui-modal> <site-config list="{config}" onchange="{load}"></site-config> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" selectable="{selectable}" link="{opts.link}" onsort="{sort}" onlink="{edit}"></ui-list-table> <ui-modal ref="edit" type="edit" onsubmit="{load}"></ui-modal> <div if="{controls && count}" class="list footer"> <div></div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>',"","",function(opts){this.controls=void 0!==opts.controls,this.selectable=this.controls||opts.selectable,this.args=UI.args.sites||{},this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.load(!0)}),this.load=function(reset){this.request({method:"PUT",url:"/s/sites",data:this.args,success:function(res){this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.config=res.config,UI.args.sites=this.args,this.trigger("load",res.info,reset),this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.go=function(page){this.args.page=page,this.load(!0)}.bind(this),this.add=function(e){this.refs.add.show({name:"Ajouter un site",url:"/s/site"})}.bind(this),this.edit=function(row,block,e){e.preventDefault(),this.refs.edit.show({name:row.data.name[0].text,icon:"world",url:"/s/site/"+row.id})}.bind(this)}),riot.tag2("site-search",'<div if="{controls}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-menu-filter list="{filters}" data="{args}" class="keep" onchange="{filter}"></ui-menu-filter> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> </div> <ui-list-table if="{criteria}" cols="{cols}" rows="{rows}" data="{args}" selectable="{selectable}" link="{opts.link}" onsort="{sort}" onselect="{select}"></ui-list-table> <div if="{!criteria}" class="ui info message"> <div class="header">Aucun critère</div> <p>Veuillez indiquer au moins un critère de recherche</p> </div> <div if="{controls && count}" class="list footer"> <div> <ui-action list="{actions}" rows="{selection}" onaction="{execute}"></ui-action> <ui-modal ref="delete" type="delete" onsubmit="{load}"></ui-modal> </div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>',"","",function(opts){this.controls=void 0!==opts.controls,this.selectable=this.controls||opts.selectable,this.args=UI.args.search||{},this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.load(!0)}),this.load=function(reset){this.request({method:"PUT",url:"/s/items",data:this.args,success:function(res){this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.criteria=this.args.search||this.args.filters,this.filters=res.filters,this.actions=res.actions,UI.args.search=this.args,this.trigger("load",res.info,reset),this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.filter=function(list){this.args.filters=list,this.args.page=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.select=function(rows){this.selection=rows,this.update()}.bind(this),this.go=function(page){this.args.page=page,this.load(!0)}.bind(this),this.execute=function(action,rows){this[action.type](rows)}.bind(this),this.delete=function(rows){this.refs.delete.show({name:"Supprimer",url:"/i/items",soft:!0,rows:rows,text:"Êtes-vous sûr de vouloir supprimer "+rows.length+" élément"+(1<rows.length?"s":"")+" ?"})}.bind(this)}
1),riot.tag2("ui-code-editor",'<div ref="content" class="content" onchange="{stop}"></div>','ui-code-editor .content,[data-is="ui-code-editor"] .content{ height: 30em; }',"",function(opts){this.on("mount",function(){UI.require({url:UI.getResourceURL("ace-builds","1.4.12")+"/src-min-noconflict/ace.js",sri:"sha256-OxkpCfqszNQNHEPsyUm4qo2ueQXCnrphYuhgMQid1H8="},this.init)}),this.init=function(){var config={mode:"ace/mode/"+(opts.mode||"html"),theme:"ace/theme/"+(opts.theme||"dawn"),newLineMode:"unix",useWorker:!1,printMargin:100,fontSize:14,tabSize:2};this.editor=ace.edit(this.refs.content,config),this.editor.session.on("change",this.taint),this.load()}.bind(this),this.load=function(){this.editor&&(this.editor.session.setValue(opts.content||""),this.editor.gotoLine(1),this.modified=!1)}.bind(this),this.taint=function(){this.modified=!0}.bind(this),this.dump=function(){this.modified&&(this.trigger("change",this.editor.session.getValue()),this.modified=!1)}.bind(this)}),riot.tag2("ui-content-editor",'<ui-editor-toolbar if="{editor}" class="toolbar" status="{status}" config="{config}" onclick="{overlap}" onaction="{apply}"></ui-editor-toolbar> <div class="content" onchange="{stop}"> <div if="{!source}" ref="editor" tabindex="-1" onkeydown="{interact}" onkeyup="{notify}" onmouseup="{notify}"></div> <textarea if="{source}" ref="source" class="source" oninput="{taint}"></textarea> </div>','ui-content-editor,[data-is="ui-content-editor"]{ display: block; } ui-content-editor > .toolbar,[data-is="ui-content-editor"] > .toolbar,ui-content-editor > .content,[data-is="ui-content-editor"] > .content{ display: block; } ui-content-editor > .toolbar,[data-is="ui-content-editor"] > .toolbar{ position: -webkit-sticky; position: sticky; top: 0; z-index: 2; padding: 0.5em; background: #fff; } ui-content-editor > .visible.toolbar,[data-is="ui-content-editor"] > .visible.toolbar{ z-index: 3; } ui-content-editor > .content,[data-is="ui-content-editor"] > .content{ margin-top: 0.5em; padding-top: 0.5em; } ui-content-editor > .content > div,[data-is="ui-content-editor"] > .content > div{ outline: none; } ui-content-editor .one-column:hover,[data-is="ui-content-editor"] .one-column:hover,ui-content-editor .two-columns:hover,[data-is="ui-content-editor"] .two-columns:hover,ui-content-editor .three-columns:hover,[data-is="ui-content-editor"] .three-columns:hover,ui-content-editor .four-columns:hover,[data-is="ui-content-editor"] .four-columns:hover,ui-content-editor .six-columns:hover,[data-is="ui-content-editor"] .six-columns:hover,ui-content-editor .eight-columns:hover,[data-is="ui-content-editor"] .eight-columns:hover{ outline: 2px dashed #999; } ui-content-editor .source,[data-is="ui-content-editor"] .source{ width: 100%; height: 20em; min-height: 10em; max-height: 40em; padding: 1em; }',"",function(opts){var regions=[];this.config=opts.config||{},this.status={},this.history=[],this.on("mount",function(){$(this.refs.editor).html($.parseHTML(opts.content));var url=UI.getResourceURL("ContentEdit","1.3.5");UI.require([{url:url+"/build/content-edit.min.css",sri:"sha256-3qSUuigPwXqeEZf22llzmCEm/c3hc2QyoSiUlj4qG1M="},{url:url+"/build/content-edit.min.js",sri:"sha256-LFbt7id52h88NV0mh1veJDiJv+mATY36kEyMr3tH3C0="}],function(){UI.require("/tools.js",this.init)}.bind(this))}),this.on("unmount",function(){clearTimeout(this.timeout),this.editor&&(ContentEdit.Root.get().unbind("drop",this.notify),ContentEdit.Root.get().unbind("paste",this.paste),ContentEdit.Root.get().unbind("taint",this.taint),ContentEdit.Root.get().unbind("detach",this.fill))}),this.init=function(){ContentEdit.DEFAULT_MIN_ELEMENT_WIDTH=100,ContentEdit.DEFAULT_MAX_ELEMENT_WIDTH=1e4,ContentEdit.INDENT="",this.editor=!0,this.load(),ContentEdit.Root.get().bind("drop",this.notify),ContentEdit.Root.get().bind("paste",this.paste),ContentEdit.Root.get().bind("taint",this.taint),ContentEdit.Root.get().bind("detach",this.fill)}.bind(this),this.load=function(){this.editor&&((this.config.components||[]).forEach(function(menu){menu.items.forEach(function(item){ContentEdit.Component.add(item)})}),this.modified=!1,this.watch=!0,this.update(),this.setContent(opts.content),this.storeState())}.bind(this),this.setContent=function(content){this.source?this.refs.source.value=content:($(this.refs.editor).html($.parseHTML(content)),this.edit(),this.fill())}.bind(this),this.getContent=function(){if(this.source)return this.refs.source.value;var content=this.refs.editor.cloneNode(!0);return $(".editable",content).each(function(i,el){el.innerHTML="\n"+regions[i].html()+"\n"}),content.innerHTML}.bind(this),this.edit=function(){for(var i=0;i<regions.length;i++)regions[i].domElement().innerHTML=regions[i].html();regions=[],this.watch=!1,$(".editable",this.refs.editor).each(function(i,el){el.innerHTML=el.innerHTML.trim()||"<p></p>",regions.push(new ContentEdit.Region(el))}.bind(this)),this.watch=!0}.bind(this),this.fill=function(){if(!this.source){var zone;this.refs.editor.innerHTML.trim()||(zone=ContentEdit.tools.zone.create(),this.refs.editor.appendChild(zone),this.edit()),this.watch=!1;for(var paragraph,i=0;i<regions.length;i++){0===regions[i].children.filter(function(element){return"Static"!==element.type()}).length&&(paragraph=new ContentEdit.Text("p",{},""),regions[i].attach(paragraph))}this.watch=!0}}.bind(this),this.focused=function(force){var element=ContentEdit.Root.get().focused();return element&&element.isMounted()&&-1!==regions.indexOf(element.parents().pop())?element:force&&(element=regions[0]&&regions[0].children[0])&&element.isMounted()&&"function"==typeof element.focus?(element.focus(),this.notify(),element):void 0}.bind(this),this.overlap=function(e){$("ui-editor-toolbar").removeClass("visible"),$("ui-editor-toolbar",this.root).addClass("visible")}.bind(this),this.apply=function(name,data){var element,selection,tool;"undo"!==name&&"redo"!==name?"source"!==name?(element=this.focused(!0))&&(selection=element.selection&&element.selection(),(tool=ContentEdit.tools[name])&&tool.canApply(element,selection)&&(tool.apply(element,selection,data,this.notify)?(this.taint(element),this.edit(),this.fill()):this.notify())):this.toggle():this.restoreState("undo"===name?-1:1)}.bind(this),this.paste=function(element,e){var data;-1!==regions.indexOf(element.parents().pop())&&(data=(e.clipboardData||window.clipboardData).getData("text").trim(),this.apply("paste",data))}.bind(this),this.taint=function(e){!e.target&&-1===regions.indexOf(e)&&-1===regions.indexOf(e.parents().pop())||(this.modified=!0,this.watch&&(clearTimeout(this.timeout),this.timeout=setTimeout(this.storeState,500)))}.bind(this),this.storeState=function(){this.history.splice((this.historyIndex||0)+1),this.history.push(this.getContent()),this.history.splice(0,Math.max(this.history.length-30,0)),this.historyIndex=this.history.length-1}.bind(this),this.restoreState=function(offset){var content,index=this.historyIndex+offset;index<0||index>this.history.length-1||(this.historyIndex=index,content=this.history[this.historyIndex],this.setContent(content),this.notify())}.bind(this),this.interact=function(e){var element=this.focused();if(element&&!element.content){if(13===e.which)return e.preventDefault(),ContentEdit.tools.paragraph.apply(element,null);if(46===e.which)return e.preventDefault(),ContentEdit.tools.remove.apply(element,null)}}.bind(this),this.notify=function(){if(!this.source){var name,element=this.focused(),selection=element&&element.selection&&element.selection();for(name in selection&&(element.selected=selection),this.status={},ContentEdit.tools)element&&"function"==typeof ContentEdit.tools[name].isApplied&&(this.status[name]=ContentEdit.tools[name].isApplied(element,selection));this.update()}}.bind(this),this.toggle=function(){var content=this.getContent();this.source=!this.source,this.status={source:this.source},this.update(),this.setContent(content)}.bind(this),this.dump=function(){this.modified&&(this.trigger("change",this.getContent()),this.modified=!1)}.bind(this)}),riot.tag2("ui-editor-component",'<div class="ui {disabled: opts.disabled} icon buttons"> <div ref="button" class="ui icon top left pointing dropdown button" title="Insérer un composant" onclick="{load}"> <i class="puzzle piece icon"></i> <div class="menu"> <div class="header">Insérer un composant</div> <div each="{menu in opts.config.components}" class="item"> <i class="dropdown icon"></i> {menu.name} <div class="menu"> <div each="{item in menu.items}" class="item" onclick="{add}"> <i class="{item.icon || \'puzzle piece\'} icon"></i> {item.name} </div> </div> </div> </div> </div> </div> <div ref="popup" class="ui flowing popup hidden"> <div class="header">Configuration du composant</div> <div if="{!form}" class="ui active centered inline loader"></div> <div if="{form && !form.tabs && !form.blocks}" class="ui icon info message"> <i class="info circle icon"></i> Ce composant ne possède pas d\'option </div> <ui-form if="{form && form.blocks}" ref="form" blocks="{form.blocks}" data="{form.data}" onchange="{set}" flat></ui-form> <div if="{form && form.tabs}" class="ui secondary pointing menu"> <a each="{tab in form.tabs}" class="item {active: active === tab}" onclick="{showTab}"> {tab.name} </a> </div> <div if="{form && form.tabs}"> <div each="{tab in form.tabs}" show="{active === tab}"> <ui-form ref="form" blocks="{tab.blocks}" data="{tab.data}" onchange="{set}" flat></ui-form> </div> </div> <div if="{form && (form.tabs || form.blocks)}" class="actions"> <button ref="loading" class="ui primary button" onclick="{submit}">Valider</button> <button ref="disabled" class="ui button" onclick="{cancel}">Annuler</button> </div> </div>','ui-editor-component .highlight.button,[data-is="ui-editor-component"] .highlight.button{ background-color: #c0c1c2; color: #000; } ui-editor-component .menu .menu,[data-is="ui-editor-component"] .menu .menu{ left: 100% !important; right: auto !important; } ui-editor-component .popup,[data-is="ui-editor-component"] .popup{ width: 40em; } ui-editor-component .popup .header,[data-is="ui-editor-component"] .popup .header{ margin-bottom: 1rem; } ui-editor-component .popup .actions,[data-is="ui-editor-component"] .popup .actions{ text-align: right; padding: 1em 0.5em 0 0; }',"",function(opts){this.on("mount",function(){$(this.refs.button).dropdown({action:"hide",onShow:function(){return!this.opts.data}.bind(this)}),$(this.refs.button).popup({on:"click",popup:this.refs.popup,position:"bottom left",lastResort:"bottom left",onShow:function(){return!!this.opts.data}.bind(this),onHide:function(){this.form=null}.bind(this)})}),this.on("update",function(){this.refs.button.classList.toggle("highlight",!!opts.data)}),this.add=function(e){this.trigger("submit",{tag:e.item.item.tag})}.bind(this),this.load=function(){opts.data&&!this.form&&(this.update(),$(this.refs.button).popup("show"),this.request({method:"PATCH",url:opts.config.url.component,data:{name:opts.data.tag,opts:opts.data.attributes},success:function(res){this.form=res,this.active=res.tabs?res.tabs[0]:null,this.update()}}))}.bind(this),this.showTab=function(e){this.active=e.item.tab,this.update()}.bind(this),this.set=function(data){this.data?$.extend(this.data,data):this.submit()}.bind(this),this.submit=function(){var forms=Array.isArray(this.refs.form)?this.refs.form:[this.refs.form];this.data={}
1,forms.forEach(function(form){form.dump()}),this.send(),delete this.data}.bind(this),this.send=function(){this.request({method:"PATCH",url:opts.config.url.component,data:{name:opts.data.tag,data:this.data},success:function(res){$(this.refs.button).popup("hide"),this.trigger("submit",{tag:opts.data.tag,attributes:res.opts})}})}.bind(this),this.cancel=function(e){$(this.refs.button).popup("hide")}.bind(this)}),riot.tag2("ui-editor-insert",'<div class="ui {disabled: opts.disabled} icon buttons"> <button each="{type in types}" class="ui {active: opts[type.id]} icon button" title="{type.name}" onclick="{setType}"> <i class="{type.icon} icon"></i> </button> </div> <div each="{type in types}" class="ui flowing popup hidden"> <div class="header">{type.name}</div> <div if="{type.tabs}" class="ui secondary pointing menu"> <a each="{tab in type.tabs}" class="item {active: active === tab}" onclick="{showTab}"> <i class="{tab.icon} icon"></i> {tab.name} </a> </div> <ui-form if="{form}" ref="form" blocks="{form.blocks}" data="{form.data}" onchange="{set}" flat></ui-form> <div class="actions"> <button class="ui primary button" onclick="{submit}">Valider</button> <button class="ui button" onclick="{cancel}">Annuler</button> </div> </div>','ui-editor-insert .popup,[data-is="ui-editor-insert"] .popup{ width: 40em; } ui-editor-insert .popup .header,[data-is="ui-editor-insert"] .popup .header{ margin-bottom: 1rem; } ui-editor-insert .popup .actions,[data-is="ui-editor-insert"] .popup .actions{ text-align: right; padding: 1em 0.5em 0 0; }',"",function(opts){var tabs=[{name:"Page",icon:"file text outline",blocks:[{id:"page",type:"option",name:"Page",config:{raw:!0,url:opts.config.url.pages}}]},{name:"Fichier",icon:"file outline",blocks:[{id:"file",type:"file",name:"Fichier",config:{raw:!0,select:!0,url:opts.config.url.file}}],set:function(type){var tab=$.extend(!0,{},this);return tab.blocks[0].config.type=type,tab}},{name:"E-mail",icon:"mail outline",blocks:[{id:"email",type:"email",name:"Adresse e-mail"}]},{name:"URL",icon:"world",blocks:[{id:"url",type:"url",name:"Adresse URL"}]}];this.types=[{id:"link",name:"Insérer un lien",icon:"linkify",tabs:tabs,blocks:[{id:"target",type:"boolean",name:"Cible du lien",config:{label1:"Nouvel onglet",label0:"Onglet actuel"}},{id:"button",type:"boolean",name:"Afficher un bouton",config:{label1:"Primaire",label0:"Secondaire"}}]},{id:"image",name:"Insérer une image",icon:"image",tabs:[tabs[1].set("image"),tabs[3]],blocks:[{id:"width",type:"number",name:"Largeur",config:{unit:"pixels"}},{id:"align",type:"boolean",name:"Alignement",config:{label1:"Gauche",label0:"Droite"}}]},{id:"video",name:"Insérer une vidéo",icon:"youtube play",tabs:[tabs[1].set("video"),tabs[3]],blocks:[{id:"width",type:"number",name:"Largeur",config:{unit:"pixels"}},{id:"height",type:"number",name:"Hauteur",config:{unit:"pixels"}},{id:"align",type:"boolean",name:"Alignement",config:{label1:"Gauche",label0:"Droite"}}]},{id:"table",name:"Insérer un tableau",icon:"table",blocks:[{id:"columns",type:"number",name:"Nombre de colonnes"},{id:"header",type:"boolean",name:"Ajouter un en-tête"}]},{id:"fragment",name:"Insérer un fragment",icon:"sticky note outline",blocks:[{id:"fragment",type:"option",name:"Fragment",config:{raw:!0,url:opts.config.url.fragments}}]},{id:"template",name:"Insérer un modèle",icon:"sticky note outline",blocks:[{id:"template",type:"option",name:"Modèle",config:{raw:!0,url:opts.config.url.templates}}]}].filter(function(type){return!opts.config.insert||-1!==opts.config.insert.indexOf(type.id)}),this.on("mount",function(){var popup=$(".popup",this.root);$(".icon.button",this.root).each(function(i){$(this).popup({on:"click",popup:popup[i],position:"bottom center",lastResort:"bottom center"})})}),this.setType=function(e){this.type=e.item.type,this.reset()}.bind(this),this.showTab=function(e){this.reset(e.item.tab)}.bind(this),this.reset=function(tab){var data=opts[this.type.id]||{};data.url&&!tab&&this.type.tabs?this.active=this.type.tabs.slice(-1)[0]:this.active=tab||this.type.tabs&&this.type.tabs[0],this.form={blocks:(this.active?this.active.blocks:[]).concat(this.t
1ype.blocks||[]),data:{url:data.url&&[{url:data.url}],target:data.target?[{state:"blank"===data.target}]:void 0,button:data.button?[{state:"primary"===data.button}]:void 0,width:data.width&&[{number:data.width}],height:data.height&&[{number:data.height}],columns:data.columns&&[{number:data.columns}],align:data.align?[{state:"left"===data.align}]:void 0,header:void 0!==data.header?[{state:data.header}]:void 0}},this.update()}.bind(this),this.set=function(data){var a,email,slug,host=UI.getHost(),config={};data.url&&data.url[0]&&((a=document.createElement("a")).href=String(data.url[0].url||""),config.url=a.href,config.target=0!==config.url.indexOf(host)?"blank":void 0),data.email&&data.email[0]&&(email=String(data.email[0].email||""),config.url="mailto:"+email,config.title=email),data.page&&data.page[0]&&(slug=String(data.page[0].slug||""),config.url=host+"/"+slug,config.title=String(data.page[0].name||"")),data.file&&data.file[0]&&(config.url=host+UI.getFileURL(data.file[0]),config.title=String(data.file[0].title||data.file[0].name||"")),data.target&&data.target[0]&&(config.target=data.target[0].state?"blank":"self"),data.button&&data.button[0]&&(config.button=data.button[0].state?"primary":"secondary"),data.width&&data.width[0]&&(config.width=Number(data.width[0].number)||void 0),data.height&&data.height[0]&&(config.height=Number(data.height[0].number)||void 0),data.columns&&data.columns[0]&&(config.columns=Number(data.columns[0].number)||void 0),data.align&&data.align[0]&&(config.align=data.align[0].state?"left":"right"),data.header&&data.header[0]&&(config.header=!!data.header[0].state),data.fragment&&data.fragment[0]&&(config.html=data.fragment[0].html),data.template&&data.template[0]&&(config.html=data.template[0].html),!opts.config.absolute&&config.url&&0===config.url.indexOf(host)&&(config.url=config.url.replace(host,"")),this.trigger("submit",this.type.id,config),$(".icon.button",this.root).popup("hide"),this.reset()}.bind(this),this.submit=function(e){var index=this.types.indexOf(this.type);this.refs.form[index].dump()}.bind(this),this.cancel=function(e){$(".icon.button",this.root).popup("hide"),this.reset()}.bind(this)}),riot.tag2("ui-editor-toolbar",'<div class="ui {disabled: is.source} icon buttons"> <button class="ui {active: is.bold} button" data-action="bold" title="Gras" onclick="{execute}"> <i class="bold icon"></i> </button> <button class="ui {active: is.italic} button" data-action="italic" title="Italique" onclick="{execute}"> <i class="italic icon"></i> </button> <button class="ui {active: is.underline} button" data-action="underline" title="Souligné" onclick="{execute}"> <i class="underline icon"></i> </button> </div> <div class="ui {disabled: is.source} icon buttons"> <div class="ui icon top left pointing dropdown button" title="Format"> <i class="font icon"></i> <div class="menu"> <div class="header">Format</div> <div class="item" data-action="heading" data-type="h2" onclick="{execute}"> <i class="header icon"></i> Titre </div> <div class="item" data-action="heading" data-type="h3" onclick="{execute}"> <i class="grey header icon"></i> Sous-titre </div> <div class="item" data-action="paragraph" onclick="{execute}"> <i class="paragraph icon"></i> Paragraphe </div> <div class="item" data-action="preformatted" onclick="{execute}"> <i class="code icon"></i> Préformaté </div> <div class="divider"></div> <div class="item"> <i class="dropdown icon"></i> <span class="text">Autres titres</span> <div class="menu"> <div class="item" data-action="heading" data-type="h1" onclick="{execute}"> Titre de niveau 1 </div> <div class="item" data-action="heading" data-type="h2" onclick="{execute}"> Titre de niveau 2 </div> <div class="item" data-action="heading" data-type="h3" onclick="{execute}"> Titre de niveau 3 </div> <div class="item" data-action="heading" data-type="h4" onclick="{execute}"> Titre de niveau 4 </div> <div class="item" data-action="heading" data-type="h5" onclick="{execute}"> Titre de niveau 5 </div> <div class="item" data-action="heading" data-type="h6" onclick="{execute}"> Titre de niveau 6 </div> </div> </div> </div> </div> <div class="ui icon top left pointing dropdown button" title="Listes"> <i class="unordered list icon"></i> <div class="menu"> <div class="header">Listes</div> <div class="item" data-action="unorderedList" onclick="{execute}"> <i class="unordered list icon"></i> Liste à puces </div> <div class="item" data-action="orderedList" onclick="{execute}"> <i class="ordered list icon"></i> Liste numérotée </div> <div class="item" data-action="indent" onclick="{execute}"> <i class="indent icon"></i> Niveau supérieur </div>
1 <div class="item" data-action="outdent" onclick="{execute}"> <i class="outdent icon"></i> Niveau inférieur </div> </div> </div> <div class="ui icon top left pointing dropdown button" title="Alignement"> <i class="align left icon"></i> <div class="menu"> <div class="header">Alignement</div> <div class="item" data-action="alignLeft" onclick="{execute}"> <i class="align left icon"></i> Gauche </div> <div class="item" data-action="alignCenter" onclick="{execute}"> <i class="align center icon"></i> Centré </div> <div class="item" data-action="alignRight" onclick="{execute}"> <i class="align right icon"></i> Droite </div> <div class="item" data-action="alignJustify" onclick="{execute}"> <i class="align justify icon"></i> Justifié </div> </div> </div> </div> <ui-editor-insert link="{is.link}" image="{is.image}" video="{is.video}" table="{is.table}" config="{config}" disabled="{is.source}" onsubmit="{insert}"></ui-editor-insert> <ui-editor-component if="{config.components}" config="{config}" data="{is.component}" disabled="{is.source}" onsubmit="{setComponent}"></ui-editor-component> <div class="ui {disabled: is.source} icon buttons"> <div if="{config.zones}" class="ui icon top left pointing dropdown button" title="Insérer une zone"> <i class="dashed icon"></i> <div class="menu"> <div class="header">Insérer une zone</div> <div class="item"> <i class="dropdown icon"></i> 1 colonne <div class="menu"> <div class="item" data-action="zone" data-type="c1" onclick="{execute}"> normale </div> <div class="item" data-action="zone" data-type="c1c" onclick="{execute}"> centrée </div> </div> </div> <div class="item"> <i class="dropdown icon"></i> 2 colonnes <div class="menu"> <div class="item" data-action="zone" data-type="c2" onclick="{execute}"> moitié / moitié </div> <div class="item" data-action="zone" data-type="c2tl" onclick="{execute}"> 1 tiers / 2 tiers </div> <div class="item" data-action="zone" data-type="c2tr" onclick="{execute}"> 2 tiers / 1 tiers </div> <div class="item" data-action="zone" data-type="c2ql" onclick="{execute}"> 1 quart / 3 quarts </div> <div class="item" data-action="zone" data-type="c2qr" onclick="{execute}"> 3 quarts / 1 quart </div> </div> </div> <div class="item" data-action="zone" data-type="c3" onclick="{execute}"> 3 colonnes </div> <div class="item" data-action="zone" data-type="c4" onclick="{execute}"> 4 colonnes </div> <div class="item" data-action="zone" data-type="c6" onclick="{execute}"> 6 colonnes </div> <div class="item" data-action="zone" data-type="c8" onclick="{execute}"> 8 colonnes </div> </div> </div> <button class="ui button" data-action="remove" title="Supprimer" onclick="{remove}"> <i class="trash outline icon"></i> </button> </div> <div class="ui icon buttons"> <button class="ui button" data-action="undo" title="Annuler" onclick="{execute}"> <i class="undo icon"></i> </button> <button class="ui button" data-action="redo" title="Rétablir" onclick="{execute}"> <i class="repeat icon"></i> </button> </div> <div if="{config.source}" class="ui icon buttons"> <button class="ui button" data-action="source" title="Code source" onclick="{execute}"> <i class="code icon"></i> </button> </div>',"","",function(opts){this.is=opts.status||{},this.config=opts.config||{},this.on("mount",function(){$(".ui.dropdown.button",this.root).dropdown({action:"hide"})}),this.on("update",function(){this.is=opts.status||{},this.config=opts.config||{}}),this.execute=function(e){e.stopPropagation(),this.trigger("action",$(e.currentTarget).data("action"),$(e.currentTarget).data("type")),$(".ui.visible.dropdown",this.root).dropdown("hide")}.bind(this),this.insert=function(type,object){this.trigger("action",type,object)}.bind(this),this.setComponent=function(data){this.trigger("action","component",data)}.bind(this),this.remove=function(e){this.trigger("action","remove",e.ctrlKey||e.metaKey)}.bind(this)}),riot.tag2("ui-html-editor",'<ui-editor-toolbar if="{editor}" class="toolbar" status="{status}" config="{opts.config}" onaction="{apply}"></ui-editor-toolbar> <div if="{!editor}" class="ui active centered inline loader"></div>
1 <textarea ref="content" class="content" onchange="{stop}"></textarea>','ui-html-editor .toolbar,[data-is="ui-html-editor"] .toolbar{ display: block; margin-bottom: 0.5em; } ui-html-editor .content,[data-is="ui-html-editor"] .content{ height: 30em !important; max-height: 30em !important; }',"",function(opts){this.tools={bold:["bold"],italic:["italic"],underline:["underline"],heading:["formatBlock"],paragraph:["formatBlock","p"],preformatted:["formatBlock","pre"],unorderedList:["insertUnorderedList"],orderedList:["insertOrderedList"],alignLeft:["justifyLeft"],alignCenter:["justifyCenter"],alignRight:["justifyRight"],alignJustify:["justifyFull"],indent:["indentList"],outdent:["outdentList"],undo:["undo"],redo:["redo"],link:function(data){return[data.url?"createLink":"removeLink",{href:data.url}]},image:function(data){var style=data.align?"float:"+data.align+";margin:"+{left:"0 10px 10px 0",right:"0 0 10px 10px"}[data.align]+";":void 0;return["insertImage",{src:data.url,width:data.width,style:style}]},template:function(data){return["insertHTML",data.html||" "]}},this.on("mount",function(){UI.require({url:UI.getResourceURL("wysihtml","0.6.0-beta1")+"/dist/minified/wysihtml.min.js",sri:"sha256-2LD/0Y86IVtHwnC+dbb3Xz5bNtyVDA0hj3UvsGF0GhA="},this.init)}),this.init=function(){wysihtml.commands.insertImage={exec:function(composer,command,value){var textNode,key,doc=composer.doc,image=this.state(composer);if(image&&!value.src){composer.selection.setBefore(image);var parent=image.parentNode;
1return parent.removeChild(image),wysihtml.dom.removeEmptyTextNodes(parent),"A"!==parent.nodeName||parent.firstChild||(composer.selection.setAfter(parent),parent.parentNode.removeChild(parent)),void wysihtml.quirks.redraw(composer.element)}for(key in image||(image=doc.createElement("IMG"),composer.selection.insertNode(image),wysihtml.browser.hasProblemsSettingCaretAfterImg()?(textNode=doc.createTextNode(wysihtml.INVISIBLE_SPACE),composer.selection.insertNode(textNode),composer.selection.setAfter(textNode)):composer.selection.setAfter(image)),value)value[key]&&value.hasOwnProperty(key)&&image.setAttribute(key,value[key])},state:function(composer){var doc=composer.doc;if(!wysihtml.dom.hasElementWithTagName(doc,"IMG"))return!1;var selectedNode=composer.selection.getSelectedNode();if(!selectedNode)return!1;if("IMG"===selectedNode.nodeName)return selectedNode;if(selectedNode.nodeType!==wysihtml.ELEMENT_NODE)return!1;var text=composer.selection.getText();if(text=wysihtml.lang.string(text).trim())return!1;var imagesInSelection=composer.selection.getNodes(wysihtml.ELEMENT_NODE,function(node){return"IMG"===node.nodeName});return 1===imagesInSelection.length&&imagesInSelection[0]}};this.editor=new wysihtml.Editor(this.refs.content,{useLineBreaks:!1,parserRules:{attributes:{"*":"any"},classes:"any",tags:{a:{},b:{},br:{},div:{},em:{rename_tag:"i"},h1:{},h2:{},h3:{},i:{},img:{},li:{},ol:{},p:{},pre:{},s:{},span:{},strong:{rename_tag:"b"},sub:{},sup:{},table:{},tbody:{},td:{},tfoot:{},th:{},thead:{},tr:{},u:{},ul:{}}}}),this.editor.on("load",this.load),this.editor.on("interaction",this.notify),this.update()}.bind(this),this.load=function(){this.editor&&(this.composer=this.editor.composer.commands,this.editor.setValue(opts.content||""),void 0!==opts.autofocus&&this.editor.focus())}.bind(this),this.getContent=function(){return this.editor.getValue()}.bind(this),this.apply=function(name,data){var tool;"source"!==name?(tool=this.tools[name])&&("function"==typeof tool&&(tool=tool(data)),this.composer.exec(tool[0],tool[1]||data)):this.toggle()}.bind(this),this.notify=function(){for(var name in this.status={},this.tools){var tool=this.tools[name];"function"!=typeof tool&&(this.status[name]=!!this.composer.state(tool[0],tool[1]))}this.update()}.bind(this),this.toggle=function(){this.source=!this.source,this.status={source:this.source},this.editor.fire("change_view",this.source?"textarea":"composer"),this.update()}.bind(this),this.dump=function(){this.trigger("change",this.getContent())}.bind(this)}),riot.tag2("ui-list-card",'<div if="{cols && cols.length && rows && rows.length}"> <div class="ui cards"> <div each="{row in rows}" class="card {active: row.selected}" onclick="{select}"> <div class="content">
1 <p each="{column in cols}" if="{row.data[column.id]}" class="cell block-{column.id} type-{column.type}" title="{column.name}"> {renderData(row, column)} </p> </div> </div> </div> </div> <div if="{rows && !rows.length}" class="ui info message"> <div class="header">Aucun résultat</div> <p if="{search}">Veuillez modifier les critères de recherche</p> <p if="{!search}">La liste ne contient aucun élément</p> </div>','ui-list-card .ui.cards .card:hover,[data-is="ui-list-card"] .ui.cards .card:hover{ background: #f2f2f2; } ui-list-card .ui.cards .card.active,[data-is="ui-list-card"] .ui.cards .card.active{ background: #e0e0e0; } ui-list-card .ui.cards .card .title,[data-is="ui-list-card"] .ui.cards .card .title{ font-weight: bold; font-size: 1.2em; } ui-list-card .ui.cards .card .title,[data-is="ui-list-card"] .ui.cards .card .title,ui-list-card .ui.cards .card .cell,[data-is="ui-list-card"] .ui.cards .card .cell{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }',"",function(opts){this.selectable=void 0!==opts.selectable,this.on("mount",function(){this.update()}),this.on("update",function(){this.load()}),this.load=function(){!opts.cols||this.blocks===opts.cols&&this.rows===opts.rows||(this.blocks=opts.cols,this.rows=opts.rows,this.blocks.forEach(function(block){block.config=block.config||{},block.format=block.config.format&&new Function("data","item","i",block.config.format)}),this.cols=this.blocks.slice(0,opts.size||5),this.search=opts.data.search||opts.data.filters,this.update(),this.unescape(".cell"),this.trigger("select",[]))}.bind(this),this.renderData=function(row,block){var dataset=row.data[block.id]||[];return(UI.render[block.type]||UI.render.default).call(block,dataset,row,opts.link)}.bind(this),this.select=function(e){var selected,parent,i;"A"!==e.target.tagName?this.selectable&&(e.item.row.selected=!e.item.row.selected,selected=this.rows.filter(function(row){return row.selected}),this.update(),this.trigger("select",selected)):(parent=e.target.parentNode,i=Array.prototype.indexOf.call(parent.parentNode.children,parent),this.trigger("link",e.item.row,this.cols[i],e))}.bind(this),this.clear=function(){this.selectable&&(this.rows.forEach(function(row){row.selected=!1}),this.update(),this.trigger("select",[]))}.bind(this)}),riot.tag2("ui-list-table",'<div if="{cols && cols.length && rows && rows.length}"> <table class="ui very compact unstackable selectable sortable table"> <thead> <tr> <th if="{selectable}" class="box"> <div class="ui checkbox"> <input type="checkbox" value="all" checked="{all}" onclick="{select}"> <label></label> </div> </th> <th each="{column in cols}" riot-style="{column.style}" onclick="{sortBy}" class="{sorted: sort === column.id, ascending: dir === 1, descending: dir === -1}"> {column.name} </th> </tr> </thead> <tbody> <tr each="{row in rows}" class="{active: row.selected}" onclick="{select}"> <td if="{selectable}" class="box"> <div class="ui checkbox"> <input type="checkbox" checked="{row.selected}"> <label></label> </div> </td> <td class="cell" each="{column in cols}"> {renderData(row, column)} </td> </tr> </tbody> </table> </div> <div if="{rows && !rows.length}" class="ui info message"> <div class="header">Aucun résultat</div> <p if="{search}">Veuillez modifier les critères de recherche</p> <p if="{!search}">La liste ne contient aucun élément</p> </div>','ui-list-table,[data-is="ui-list-table"]{ display: block; } ui-list-table .ui.table,[data-is="ui-list-table"] .ui.table{ table-layout: fixed; } ui-list-table .ui.table th,[data-is="ui-list-table"] .ui.table th{ padding: 0.6em 0.6em; } ui-list-table .ui.table th.box,[data-is="ui-list-table"] .ui.table th.box{ width: 2.4em; } ui-list-table .ui.table th:not(.box),[data-is="ui-list-table"] .ui.table th:not(.box),ui-list-table .ui.table td:not(.box),[data-is="ui-list-table"] .ui.table td:not(.box){ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } ui-list-table .ui.table .cell .icon,[data-is="ui-list-table"] .ui.table .cell .icon{ margin: 0 0.6rem 0 0; } ui-list-table .ui.table .ui.label,[data-is="ui-list-table"] .ui.table .ui.label{ padding: 0.36em 0.63em; } ui-list-table .ui.table .thumbnail,[data-is="ui-list-table"] .ui.table .thumbnail{ width: 100px; height: 100px; margin-right: 0.5em; vertical-align: middle; border-radius: 4px; }',"",function(opts){this.selectable=void 0!==opts.selectable,this.on("mount",function(){$(window).on("resize",this.resize),this.update()}),this.on("update",function(){this.load()}),this.on("unmount",function(){$(window).off("resize",this.resize)}),this.load=function(){!opts.cols||this.blocks===opts.cols&&this.rows===opts.rows||(this.blocks=opts.cols,this.rows=opts.rows,this.blocks.forEach(function(block){block.config=block.config||{},block.format=block.config.format&&new Function("data","item","i",block.config.format),block.style=block.config.width&&{width:block.config.width+"px"}}),this.cols=this.slice(this.blocks),this.search=opts.data.search||opts.data.filters,this.all=!1,this.sort=opts.data.sort,this.dir=opts.data.dir,this.update(),this.unescape(".cell"),this.trigger("select",[]))}.bind(this),this.slice=function(list){if(list){var n=opts.size;if(!opts.size)for(var listWidth=this.root.clientWidth-(this.selectable?35:0),n=0;list[n]&&0<=listWidth-(list[n].config.width||250);)listWidth-=list[n].config.width||250,n+=1;return list.slice(0,Math.max(n,1))}}.bind(this),this.resize=function(e){this.cols=this.slice(this.blocks),this.update(),this.unescape(".cell")}.bind(this),this.renderData=function(row,block){var dataset=row.data[block.id]||[];
1return(UI.render[block.type]||UI.render.default).call(block,dataset,row,opts.link)}.bind(this),this.sortBy=function(e){var dir=this.sort===e.item.column.id&&1===this.dir?-1:1;this.trigger("sort",e.item.column.id,dir)}.bind(this),this.select=function(e){var selected,i;"A"!==e.target.tagName?this.selectable&&("all"===e.target.value?this.rows.forEach(function(row){row.selected=e.target.checked}):e.item.row.selected=!e.item.row.selected,selected=this.rows.filter(function(row){return row.selected}),this.all=selected.length===this.rows.length,this.update(),this.trigger("select",selected)):(i=e.target.parentNode.cellIndex-(this.selectable?1:0),this.trigger("link",e.item.row,this.cols[i],e))}.bind(this),this.clear=function(){this.selectable&&(this.rows.forEach(function(row){row.selected=!1}),this.all=!1,this.update(),this.trigger("select",[]))}.bind(this)}),riot.tag2("ui-menu-column",'<div ref="button" class="ui icon top left pointing dropdown button"> <i class="columns icon"></i> <div class="menu"> <div class="header">Colonnes</div> <div each="{column in columns}" class="item {over: column === drag.target}" draggable="true" onclick="{toggle}" ondragstart="{dragStart}" ondragover="{dragOver}" ondragend="{dragEnd}" ondrop="{drop}"> <i class="checkmark {transparent: column.hidden} icon"></i> {column.name} </div> </div> </div>','ui-menu-column .transparent.icon,[data-is="ui-menu-column"] .transparent.icon{ color: transparent; } ui-menu-column .ui.dropdown .menu,[data-is="ui-menu-column"] .ui.dropdown .menu{ max-height: 65vh; overflow-y: auto; } ui-menu-column .ui.dropdown .menu > .item.over,[data-is="ui-menu-column"] .ui.dropdown .menu > .item.over{ background: #e0e0e0; outline: 2px dashed #666; outline-offset: -2px; }',"",function(opts){this.drag={},this.on("mount",function(){$(this.refs.button).dropdown({action:"nothing"}),this.update()}),this.on("update",function(){this.load()}),this.load=function(){this.columns=opts.list}.bind(this),this.toggle=function(e){e.item.column.hidden=!e.item.column.hidden,this.update(),this.notify()}.bind(this),this.dragStart=function(e){e.dataTransfer.setData("text",1),this.drag.source=e.item.column}.bind(this),this.dragOver=function(e){e.preventDefault(),this.drag.target!==e.item.column&&(this.drag.target=e.item.column,this.update())}.bind(this),this.drop=function(e){var i1,i2;e.preventDefault(),this.drag.source!==this.drag.target&&(i1=this.columns.indexOf(this.drag.source),i2=this.columns.indexOf(this.drag.target),this.columns.splice(i2,0,this.columns.splice(i1,1)[0]),this.notify())}.bind(this),this.dragEnd=function(e){this.drag={},this.update()}.bind(this),this.notify=function(){var list=this.columns.filter(function(column){return!column.hidden}).map(function(column){return column.id});this.trigger("change",list)}.bind(this)}),riot.tag2("ui-menu-filter",'<div ref="button" class="ui icon top left pointing dropdown button"> <i class="filter icon"></i> <div if="{count}" class="ui floating grey tiny circular label"> {count} </div> <div class="menu"> <div class="header"> Recherche avancée </div> <div each="{block in menu}" class="item" onclick="{add}"> <i if="{block.children && block.children.length}" class="dropdown icon"></i> <span class="text"> {block.name} </span> <div if="{block.children && block.children.length}" class="menu"> <div each="{block in block.children}" class="item" onclick="{add}"> {block.name} </div> </div> </div> </div> </div> <div class="ui flowing popup hidden"> <div class="header"> Recherche avancée </div> <ui-filter ref="filters" menu="{menu}" data="{filters}" onchange="{set}"></ui-filter> <div class="actions"> <button class="ui primary button" onclick="{submit}"> Rechercher </button> <button class="ui button" onclick="{reset}"> Réinitialiser </button> </div> </div>','ui-menu-filter .ui.flowing.popup,[data-is="ui-menu-filter"] .ui.flowing.popup{ width: 40em; max-width: 100vw; } ui-menu-filter .actions,[data-is="ui-menu-filter"] .actions{ text-align: right; margin-top: 1em; }',"",function(opts){this.on("mount",function(){$(this.refs.button).dropdown({action:"hide",onShow:function(){return 0===this.count}.bind(this)}),$(this.refs.button).popup({on:"click",position:"bottom left",lastResort:"bottom center",onShow:function(){return 0<this.count}.bind(this)}),this.update()}),this.on("update",function(){this.load()}),this.load=function(){!opts.list||this.menu===opts.list&&this.filters===opts.data.filters||(this.menu=opts.list,this.filters=opts.data.filters,this.count=(this.filters||[]).reduce(function(sum,filter){return sum+((filter.data||[]).length||1)},0),this.update())}.bind(this),this.add=function(e){this.refs.filters.add(e),this.count++,$(this.refs.button).popup("show")}.bind(this),this.submit=function(e){1!==e.which&&13!==e.which||this.refs.filters.dump()}.bind(this),this.reset=function(e){this.refs.filters.reset(),this.count=0}.bind(this),this.set=function(data){this.trigger("change",data),$(this.refs.button).popup("hide")}.bind(this)}),riot.tag2("ui-menu-layout",'<div ref="button" class="ui icon top left pointing dropdown button"> <i class="{icon} icon"></i> <div class="menu"> <div class="header">Disposition</div> <div each="{layout in layouts}" class="item" onclick="{select}"> <i class="{layout.icon} icon"></i> {layout.name} </div> </div> </div>',"","",function(opts){this.on("mount",function(){$(this.refs.button).dropdown({action:"hide"}),this.update()}),this.on("update",function(){this.load()}),this.load=function(){this.layouts=opts.list;var active=(this.layouts||[]).filter(function(layout){return layout.id===opts.data.layout})[0];active&&(this.icon=active.icon)}.bind(this),this.select=function(e){this.icon=e.item.layout.icon,this.update(),this.trigger("change",e.item.layout.id)}.bind(this)}),riot.tag2("ui-menu-view",'<div ref="button" class="ui icon top left pointing dropdown button"> <i class="eye icon"></i> <div class="menu"> <div class="header">Affichage</div> <div class="item" onclick="{reset}"> <i class="undo icon"></i> Réinitialiser l\'affichage </div> <div class="item" onclick="{add}"> <i class="plus icon"></i> Enregistrer l\'affichage courant </div> <div if="{input}" ref="loading" class="ui left icon right action input" onchange="{stop}"> <i class="{unlock: !private, lock: private} link icon" onclick="{toggle}"></i>
1 <input ref="text" type="text" placeholder="Nom" onkeydown="{save}"> <button class="ui blue icon button" onclick="{save}"> <i class="checkmark icon"></i> </button> </div> <div if="{views && views.length}" class="divider"></div> <div each="{view in views}" class="item" onclick="{select}"> <i if="{view.icon}" class="{view.icon} icon"></i> {view.name} </div> </div> </div>','ui-menu-view .ui.dropdown .menu,[data-is="ui-menu-view"] .ui.dropdown .menu{ max-height: 65vh; overflow-y: auto; } ui-menu-view .ui.dropdown .menu > .ui.input .icon,[data-is="ui-menu-view"] .ui.dropdown .menu > .ui.input .icon{ padding-top: 0; padding-bottom: 0; }',"",function(opts){this.on("mount",function(){$(this.refs.button).dropdown({action:"hide",onShow:this.init})}),this.init=function(){this.input=!1,this.views=null,this.update(),this.load()}.bind(this),this.load=function(){this.request({method:"GET",url:opts.url,success:function(res){this.views=res.options,this.update()}})}.bind(this),this.reset=function(e){this.trigger("change",null)}.bind(this),this.add=function(e){e.stopPropagation(),this.input=!this.input,this.update(),this.input&&this.refs.text.focus()}.bind(this),this.toggle=function(e){this.private=!this.private,this.update()}.bind(this),this.save=function(e){1!==e.which&&13!==e.which||""!==this.refs.text.value.trim()&&(this.trigger("add",this.refs.text.value.trim(),this.private),$(this.refs.button).dropdown("hide"),this.private=!1,this.update())}.bind(this),this.select=function(e){this.trigger("change",e.item.view.id)}.bind(this)}),riot.tag2("ui-color-picker",'<div ref="input" class="ui labeled input"> <div class="ui label" riot-style="background: {color || \'#ffffff\'};" onclick="{keep}"></div> <input type="text" placeholder="Couleur" riot-value="{color}" onclick="{keep}" oninput="{set}"> </div> <div class="ui popup"> <div ref="picker"></div> </div>','ui-color-picker .ui.label,[data-is="ui-color-picker"] .ui.label{ width: 4em; cursor: pointer; border: 1px solid #999; } ui-color-picker .ui.input input,[data-is="ui-color-picker"] .ui.input input{ width: 7em; } ui-color-picker .IroColorPicker,[data-is="ui-color-picker"] .IroColorPicker{ white-space: nowrap; }',"",function(opts){this.color=opts.color,this.on("mount",function(){UI.require({url:UI.getResourceURL("@jaames/iro","5.2.3")+"/dist/iro.min.js",sri:"sha256-6YAVVO+TUtkDv0eAe0qB2utTazxfJ/zQrwj7LR1aqx0="},this.init)}),this.init=function(){$(this.refs.input).popup({on:"click",position:"bottom left",lastResort:"bottom right",maxSearchDepth:2}),this.picker=new iro.ColorPicker(this.refs.picker,{width:250,color:this.color||"#ffffff",layoutDirection:"horizontal",layout:[{component:iro.ui.Wheel},{component:iro.ui.Slider,options:{sliderType:"saturation"}},{component:iro.ui.Slider,options:{sliderType:"value"}}]}),this.picker.on("input:change",this.select),this.picker.on("input:end",this.notify)}.bind(this),this.keep=function(e){$(this.refs.input).popup("is visible")&&e.stopPropagation()}.bind(this),this.set=function(e){e.target.value=e.target.value.slice(0,7).replace(/[^0-9a-f#]/g,""),e.target.value[0]&&"#"!==e.target.value[0]&&(e.target.value="#"+e.target.value),-1!==[0,4,7].indexOf(e.target.value.length)&&(this.color=e.target.value||null,this.update(),this.notify(),this.picker&&(this.picker.color.hexString=this.color||"#ffffff"))}.bind(this),this.select=function(color){this.color=color.hexString,this.update()}.bind(this),this.notify=function(){this.trigger("change",this.color,opts.name)}.bind(this)}),riot.tag2("ui-date-picker",'<div class="fields" onchange="{stop}"> <div each="{field in list}" if="{!field.hidden}" class="{eight: opts.range, sixteen: !opts.range} wide field"> <div if="{!field.offset}" ref="{field.id}" class="ui calendar left icon input" data-field="{field.id}"> <i class="calendar link icon" onclick="{toggle}"></i> <input type="text" placeholder="{field.name}" riot-value="{format(field)}"> </div> <div if="{field.offset}" class="ui offset left icon {\'right labeled\': field.value} input"> <i class="calendar check link icon" onclick="{toggle}"></i> <input type="text" placeholder="Aujourd\'hui" riot-value="{format(field)}" oninput="{set}"> <div if="{field.value}" class="ui basic label" onclick="{loop}">{units[field.unit]}</div> </div> </div> </div>','ui-date-picker .ui.offset.input input::placeholder,[data-is="ui-date-picker"] .ui.offset.input input::placeholder{ color: #000; } ui-date-picker .basic.label,[data-is="ui-date-picker"] .basic.label{ cursor: pointer; user-select: none; }',"",function(opts){var self=this,url=UI.getResourceURL("semantic-ui-calendar","0.0.8");this.units={d:"jours",M:"mois",y:"ans"},this.offset=void 0!==opts.offset,this.list=[{id:"date",name:"Début"},{id:"date2",name:"Fin"}],this.on("mount",function(){this.update(),UI.require([{url:url+"/dist/calendar.min.css",sri:"sha256-KCHiPtYk/vfF5/6lDXpz5r5FuIYchVdai0fepwGft80="},{url:url+"/dist/calendar.min.js",sri:"sha256-Pnz4CK94A8tUiYWCfg/Ko25YZrHqOKeMS4JDXVTcVA0="}],this.load)}),this.on("update",function(){this.init()}),this.on("updated",function(){this.load()}),this.init=function(){this.list[0].name=opts.range?"Début":opts.placeholder,this.list[0].value=opts.date,this.list[1].value=opts.date2,this.list[1].hidden=!opts.range,this.list.forEach(function(field){var offset=this.getOffset(field.value);offset&&(field.offset=!0,field.value=offset.value,field.unit=offset.unit)},this)}.bind(this),this.load=function(){$.fn.calendar&&(this.settings=this.settings||{type:opts.type,firstDayOfWeek:1,monthFirst:!1,ampm:!1,minDate:this.parse(opts.min),maxDate:this.parse(opts.max),text:UI.date,formatter:$.extend({},$.fn.calendar.settings.formatter,{datetime:function(date,settings){return date?("time"===settings.type?"":settings.formatter.date(date,settings))+("datetime"===settings.type?settings.text.separator||" ":"")+(settings.type.indexOf("time")<0?"":settings.formatter.time(date,settings,!1)):""},date:function(date,settings){return date?"year"===settings.type?date.getFullYear():"month"===settings.type?settings.text.months[date.getMonth()]+" "+date.getFullYear():date.toLocaleDateString():""}}),onChange:function(date){date=date&&new Date(date.getTime()-6e4*date.getTimezoneOffset()).toISOString().slice(0,19),self.trigger("change",date,$(this).data("field"),opts.name)}},$(this.refs.date).calendar($.extend({endCalendar:$(this.refs.date2)},this.settings)),$(this.refs.date2).calendar($.extend({startCalendar:$(this.refs.date)},this.settings)))}.bind(this),this.getOffset=function(value){var match=String(value).match(/^([+-]?[0-9]+)([dMy])$/);return match&&{value:Number(match[1]),unit:match[2]}}.bind(this),this.parse=function(value){if("string"!=typeof value)return null;var offset=this.getOffset(value),date=offset?new Date:new Date(value);return offset&&("d"===offset.unit&&date.setDate(date.getDate()+offset.value),"M"===offset.unit&&date.setMonth(date.getMonth()+offset.value),"y"===offset.unit&&date.setFullYear(date.getFullYear()+offset.value)),date}.bind(this),this.format=function(field){return field.offset?(0<field.value?"+":"")+(field.value||""):field.value&&String(field.value).replace(/^(....)-(..)-(..).(.+)$/,"$3/$2/$1 $4")}.bind(this),this.toggle=function(e){this.offset?(e.item.field.offset=!e.item.field.offset,e.item.field.value=null,e.item.field.unit=e.item.field.offset?"d":null,this.notify(e.item.field),this.update()):$(this.refs.date).calendar("focus")}.bind(this),this.set=function(e){e.target.value=e.target.value.replace(/[^0-9+-]/g,""),e.item.field.value=Number(e.target.value)||null,this.notify(e.item.field),this.update()}.bind(this),this.loop=function(e){var units=Object.keys(this.units),index=units.indexOf(e.item.field.unit);e.item.field.unit=units[index+1>=units.length?0:index+1],this.notify(e.item.field),this.update()}.bind(this),this.notify=function(field){var value=field.offset?(field.value||0)+(field.unit||"d"):null;this.trigger("change",value,field.id,opts.name)}.bind(this)}),riot.tag2("ui-action",'<div if="{actions}" class="ui icon buttons"> <button each="{action in actions}" data-content="{action.name}" onclick="{execute}" class="ui icon button {action.color} {disabled: (!count || count > action.max)}"> <i class="{action.icon} icon"></i> </button> </div> <div if="{actions}" class="ui buttons"> <button class="ui basic button">
1 {count.toLocaleString()} sélectionné{count > 1 ? \'s\' : \'\'} </button> </div>','@media only screen and (max-width: 600px) { ui-action .ui.buttons:not(.icon),[data-is="ui-action"] .ui.buttons:not(.icon){ display: none; } }',"",function(opts){this.count=0,this.on("mount",function(){$(window).on("keydown",this.interact),this.update()}),this.on("update",function(){this.load()}),this.on("updated",function(){$(".ui.icon.button",this.root).popup()}),this.on("unmount",function(){$(window).off("keydown",this.interact)}),this.load=function(){this.actions=opts.list,this.rows=opts.rows,this.count=opts.rows.length}.bind(this),this.interact=function(e){var action,tag=e.target.tagName.toLowerCase();0===this.count||tag.match(/^(input|textarea)$/)||(action=this.actions.filter(function(action){return action.key===e.which})[0])&&this.trigger("action",action,this.rows)}.bind(this),this.execute=function(e){this.trigger("action",e.item.action,this.rows)}.bind(this)}),riot.tag2("ui-config",'<div ref="modal" class="ui large config modal"> <div class="header"> <i class="{args.icon} icon"></i> {args.name} </div> <div class="content"> <div if="{rows}" class="ui grid"> <div class="four wide column"> <ui-menu list="{rows}" active="{active}" move="{args.move}" onselect="{edit}" onmove="{move}"></ui-menu> </div> <div if="{mode === \'add\'}" class="twelve wide column"> <div class="ui secondary pointing menu"> <a class="item active"> <i class="plus icon"></i> Ajouter </a> </div> <ui-message ref="message"></ui-message> <ui-form ref="form" blocks="{form.blocks}" data="{form.data}" onchange="{send}"></ui-form> </div> <div if="{mode === \'edit\'}" class="twelve wide column"> <div class="ui secondary pointing menu"> <a class="item {active: tab === 0}" onclick="{showTab}"> <i class="options icon"></i> Propriétés </a> <a each="{args.tabs}" class="item {active: tab === id}" onclick="{showTab}"> <i class="{icon} icon"></i> {name} </a> </div> <div if="{form}" class="form"> <ui-message ref="message"></ui-message> <ui-form ref="form" blocks="{form.blocks}" data="{form.data}" onchange="{send}"></ui-form> </div> <yield></yield> </div> </div> </div> <div class="actions"> <button class="ui left floated {disabled: !active} green button" onclick="{add}"> Ajouter </button> <button ref="popup" class="ui left floated {disabled: !active} red button"> Supprimer </button> <div class="ui flowing popup hidden"> <div class="content"> <button class="ui red button" onclick="{delete}">Confirmer la suppression</button> </div> </div> <button ref="loading" class="ui primary button" onclick="{submit}">Valider</button> <button ref="disabled" class="ui cancel button">Fermer</button> </div> </div>',"","",function(opts){this.args={},this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.show=function(args){$(this.refs.modal).modal(),$(this.refs.popup).popup({on:"click"}),this.args=args,this.mode="edit",this.rows=null,this.active=null,this.update(),this.load()}.bind(this),this.load=function(id){this.request({method:"PUT",url:this.args.url,success:function(res){var show=!this.rows;this.data=res,this.blocks=res.blocks,this.rows=res.rows,0===this.rows.length?this.add():id?(this.active=this.getRow(id),this.showTab()):this.active?this.active=this.getRow(this.active.id):(this.active=this.rows[0],this.showTab()),this.update(),0!==this.tab&&this.form&&this.loadForm(),show&&$(this.refs.modal).modal("show")}})}.bind(this),this.loadForm=function(){this.loading=!1,this.active&&this.request({method:"GET",url:this.active.url+"?t="+this.tab,success:function(res){this.form=res,this.form.data=this.form.data||{},this.update()}})}.bind(this),this.getRow=function(id){return this.rows.reduce(function(found,row){return found||row.id===id&&row||(row.children||[]).filter(function(child){return child.id===id})[0]},null)}.bind(this),this.add=function(e){this.request({method:"POST",url:this.args.add.url,success:function(res){this.mode="add",this.tab=0,this.form=res,this.form.data=this.form.data||{},this.update()}})}.bind(this),this.edit=function(row){this.dump(),this.active=row,this.showTab()}.bind(this),this.showTab=function(e){this.active&&(this.dump(),this.mode="edit",e&&e.item?(this.tab=e.item.id,e.item.form?this.loadForm():(this.form=null,this.update())):(this.tab=0,this.form={blocks:this.blocks,data:this.active.data},this.update()))}.bind(this),this.dump=function(e){this.refs.form&&this.refs.form.dump(!0),this.refs.data&&this.refs.data.dump(!0)}.bind(this),this.send=function(data){$.isEmptyObject(data)||this.request({method:"add"===this.mode?"POST":"PATCH",url:"add"===this.mode?this.args.add.url:this.active.url+"?t="+this.tab,data:{data:data,after:"add"===this.mode&&this.active?this.active.id:void 0},success:function(res){this.load(res.id)},error:function(res){this.refs.message.set("error",res&&res.error)}})}.bind(this),this.move=function(row,target){target&&this.request({method:"PATCH",url:row.url,data:{move:{to:target.id}},success:function(){this.load()}})}.bind(this),this.delete=function(){this.request({method:"DELETE",url:this.active.url,success:function(){this.active=null,this.load(),$(this.refs.popup).popup("hide")}})}.bind(this),this.submit=function(e){this.dump(),"edit"===this.mode&&($(this.refs.modal).modal("hide"),this.trigger("close"))}.bind(this)}),riot.tag2("ui-cropper",'<div class="toolbar"> <div class="ui icon buttons"> <button class="ui button" data-action="zoom-in" title="Zoom avant" onclick="{execute}">
1 <i class="zoom in icon"></i> </button> <button class="ui button" data-action="zoom-out" title="Zoom arrière" onclick="{execute}"> <i class="zoom out icon"></i> </button> <button class="ui button" data-action="zoom-full" title="Taille normale" onclick="{execute}"> <i class="maximize icon"></i> </button> </div> <div class="ui icon buttons"> <button class="ui button" data-action="rotate-left" title="Rotation à gauche" onclick="{execute}"> <i class="undo icon"></i> </button> <button class="ui button" data-action="rotate-right" title="Rotation à droite" onclick="{execute}"> <i class="repeat icon"></i> </button> </div> <div class="ui icon buttons"> <button class="ui button" data-action="flip-horizontal" title="Miroir horizontal" onclick="{execute}"> <i class="resize horizontal icon"></i> </button> <button class="ui button" data-action="flip-vertical" title="Miroir vertical" onclick="{execute}"> <i class="resize vertical icon"></i> </button> </div> <div class="ui icon buttons"> <button class="ui button" data-action="reset" title="Réinitialiser" onclick="{execute}"> <i class="refresh icon"></i> </button> </div> <div class="ui right floated icon buttons"> <button class="ui green button" title="Valider" onclick="{crop}"> <i class="checkmark icon"></i> </button> </div> </div> <img if="{src}" ref="image" class="image" riot-src="{src}">','ui-cropper,[data-is="ui-cropper"]{ display: block; } ui-cropper .toolbar,[data-is="ui-cropper"] .toolbar{ background: #fff; padding: 0.5em; border-radius: 4px 4px 0 0; } ui-cropper .image,[data-is="ui-cropper"] .image{ display: block; max-width: 100%; }',"",function(opts){var url=UI.getResourceURL("cropperjs","1.5.9");this.on("mount",function(){UI.require([{url:url+"/dist/cropper.min.css",sri:"sha256-tO0Ov5t+pn1fVU8K2Kx29pJ/TyxYAN2KnH7qC4/viWE="},{url:url+"/dist/cropper.min.js",sri:"sha256-kgAUh68I+54DIMFWTLmeh3G9L8hL83+w9DwxIHMqUM8="}],this.load)}),this.on("update",function(){this.load()}),this.load=function(){window.Cropper&&this.file!==opts.file&&(this.src&&URL.revokeObjectURL(this.src),this.file=opts.file,this.src=URL.createObjectURL(this.file),this.cropper?this.cropper.replace(this.src):(this.update(),this.cropper=new Cropper(this.refs.image,{aspectRatio:opts.ratio,dragMode:"move",viewMode:2})))}.bind(this),this.execute=function(e){var args={"zoom-in":["zoom",.1],"zoom-out":["zoom",-.1],"zoom-full":["zoomTo",1],"rotate-left":["rotate",-45],"rotate-right":["rotate",45],"flip-horizontal":["scaleX",-this.cropper.getData().scaleX||-1],"flip-vertical":["scaleY",-this.cropper.getData().scaleY||-1],reset:["reset"]}[$(e.currentTarget).data("action")],method=args.shift();this.cropper[method].apply(this.cropper,args)}.bind(this),this.crop=function(e){this.cropper.getCroppedCanvas().toBlob(this.notify,this.file.type)}.bind(this),this.notify=function(blob){blob.name=this.file.name,this.trigger("done",blob,this.file)}.bind(this)}),riot.tag2("ui-dropdown",'<div ref="dropdown" class="ui fluid {search: !opts.list} selection dropdown" onclick="{show}"> <i class="{dropdown: !text, delete: text} icon" onclick="{remove}"></i> <input if="{!opts.list}" class="search" autocomplete="off" tabindex="0" oninput="{set}" onchange="{stop}"> <div ref="text" class="{default: !text} text">{text || opts.placeholder || \'Sélectionner...\'}</div> <div class="menu hidden" onclick="{select}"> <div show="{false}" class="message">fix</div> <div if="{options && !options.length}" class="message">Aucun résultat</div> <div each="{option in options}" class="{disabled: option.disabled} item" data-id="{option.id}"> <i if="{option.icon}" class="{option.color} {option.icon} icon"></i> {option.name} </div> </div> </div>','ui-dropdown .ui.active.dropdown .text:not(.default),[data-is="ui-dropdown"] .ui.active.dropdown .text:not(.default){ color: #858585 !important; }',"",function(opts){this.args={p:null},this.text=opts.text,this.on("mount",function(){$(this.refs.dropdown).dropdown({action:"nothing",showOnFocus:!1,preserveHTML:!1}),$(this.refs.dropdown).off(),opts.list&&(this.options=opts.list,this.update())}),this.on("unmount",function(){clearTimeout(this.timeout)}),this.show=function(e){opts.list?$(this.refs.dropdown).dropdown("toggle"):($(this.refs.dropdown).dropdown("is hidden")&&(this.args.q=void 0,this.load()),$("input",this.refs.dropdown).focus())}.bind(this),this.load=function(){this.request({method:"GET",url:opts.url,data:this.args,beforeSend:function(){$(this.refs.dropdown).addClass("loading")},success:function(res){if(this.args.p&&!this.args.q&&0===res.options.length)return this.args={p:null},void(this.options=void 0);this.children=res.children,this.options=res.options,this.update(),$(this.refs.dropdown).dropdown("show")},complete:function(){$(this.refs.dropdown).removeClass("loading")}})}.bind(this),this.set=function(e){var search=e.target.value.trim();this.refs.text.classList.toggle("filtered",!!search),clearTimeout(this.timeout),this.timeout=setTimeout(function(){this.args.q=search||void 0,this.load()}.bind(this),500)}.bind(this),this.select=function(e){var id,option;this.options&&(e.stopPropagation(),id=$(e.target).data("id"),(option=this.options.filter(function(o){return String(o.id)===String(id)})[0])&&!option.disabled&&(this.text=option.name,this.update(),this.trigger("change",option,opts.name),$(this.refs.dropdown).dropdown("hide"),this.children?(this.args={p:id},this.load()):opts.list||(this.args={p:null},this.options=void 0)))}.bind(this),this.remove=function(e){e.target.classList.contains("dropdown")||(this.text=null,this.update(),this.trigger("change",null,opts.name),$(this.refs.dropdown).dropdown("hide"),e.stopPropagation())}.bind(this)}),riot.tag2("ui-filter",'<div class="buttons"> <div ref="plus" class="ui top right pointing dropdown"> <i class="circle large plus icon"></i> <div class="menu"> <div each="{block in menu}" class="item" onclick="{add}"> <i if="{block.children && block.children.length}" class="dropdown icon"></i> <span class="text"> {block.name} </span> <div if="{block.children && block.children.length}" class="menu"> <div each="{block in block.children}" class="item" onclick="{add}"> {block.name} </div> </div> </div> </div> </div> <div ref="minus" class="ui top right pointing dropdown"> <i class="circle large minus icon"></i> <div class="menu"> <div each="{row, i in rows}" class="item" onclick="{remove}"> {row.block.name} </div> </div> </div> </div> <div if="{!rows || !rows.length}"> Aucun filtre </div> <div class="ui form" onkeydown="{submit}"> <div each="{row in rows}" class="field"> <div class="name" onclick="{setFilter}"> <div class="ui inline dropdown"> <i class="{row.type.icon} icon"></i> {row.block.name} <span if="{row.block.description}" class="description"> {row.block.description}
1 </span> <div class="menu"> <div each="{type in types}" class="item" onclick="{setType}"> <i class="{type.icon} icon"></i> {type.name} </div> </div> </div> </div> <div if="{row.type.id !== 3 && row.type.id !== 4}" data-is="data-{row.block.type}" mode="filter" block="{row.block}" dataset="{row.dataset}" onchange="{set}"></div> </div> </div>','ui-filter .buttons,[data-is="ui-filter"] .buttons{ text-align: right; } ui-filter .ui.form .fields,[data-is="ui-filter"] .ui.form .fields{ margin-bottom: 0.5rem; } ui-filter .ui.form .name,[data-is="ui-filter"] .ui.form .name{ margin: 0 0 0.3rem 0; font-weight: bold; } ui-filter .ui.form .name .description,[data-is="ui-filter"] .ui.form .name .description{ color: #999; font-weight: normal; }',"",function(opts){this.types=[{id:1,name:"inclut",icon:"green plus"},{id:2,name:"exclut",icon:"red minus"},{id:3,name:"existe",icon:"green checkmark"},{id:4,name:"absent",icon:"red ban"}],this.on("mount",function(){$(this.refs.plus).dropdown({action:"hide"}),$(this.refs.minus).dropdown({action:"hide"}),this.update()}),this.on("update",function(){this.load()}),this.load=function(){if(opts.menu&&(this.menu!==opts.menu||this.filters!==opts.data)){this.menu=opts.menu,this.filters=opts.data,this.rows=[],this.modified=!1;for(var i=0;i<(this.filters||[]).length;i++){var filter=this.filters[i],block=this.menu.reduce(function(found,b){return found||b.id===filter.id&&b||(b.children||[]).filter(function(child){return child.id===filter.id})[0]},null);
1block?this.rows.push({block:block,type:this.types.filter(function(type){return type.id===filter.type})[0]||this.types[0],dataset:filter.data}):this.modified=!0}this.update(),$(".ui.inline.dropdown",this.root).dropdown({action:"hide"})}}.bind(this),this.add=function(e){var row;"group"!==e.item.block.type&&((row=this.rows.filter(function(r){return r.block.id===e.item.block.id})[0])?row.dataset.push({}):this.rows.push({block:e.item.block,type:this.types[0],dataset:[{}]}),this.modified=!0,this.update(),$(".ui.inline.dropdown",this.root).dropdown({action:"hide"}))}.bind(this),this.remove=function(e){this.rows.splice(e.item.i,1),this.modified=!0,this.update(),$(this.refs.minus).dropdown("hide")}.bind(this),this.set=function(block,dataset){var row=this.rows.filter(function(r){return r.block.id===block.id})[0];row&&(row.dataset=dataset,this.modified=!0)}.bind(this),this.setFilter=function(e){this.active=e.item.row}.bind(this),this.setType=function(e){1===e.item.type.id||2===e.item.type.id?this.active.dataset=this.active.dataset||[{}]:delete this.active.dataset,this.active.type=e.item.type,this.modified=!0,this.update()}.bind(this),this.submit=function(e){13===e.which&&this.dump()}.bind(this),this.dump=function(ifModified){ifModified&&!this.modified||(this.trigger("change",this.rows.map(function(row){return{id:row.block.id,type:row.type.id,data:row.dataset&&row.dataset.filter(function(data){return!$.isEmptyObject(data)})}})),this.modified=!1)}.bind(this),this.reset=function(){this.rows=[],this.modified=!1,this.update(),this.trigger("change",null)}.bind(this)}),riot.tag2("ui-form",'<div class="ui {live: live, flat: flat} form grid" onkeydown="{submit}"> <div each="{row in rows}" ref="{row.block.ref}" class="{row.block.class} row {active: row.mode === \'edit\', readonly: row.block.config.readonly}"> <div if="{row.info}" class="info {header: !row.block.config.message} column"> <h2 if="{!row.block.config.message}" class="ui header"> <div class="content"> {row.block.name} <div if="{row.block.description}" class="sub header"> {row.block.description} </div> </div> </h2> <div if="{row.block.config.message}" class="ui icon info message"> <i class="info circle icon"></i> <div class="content"> <div class="header">{row.block.name}</div> <p if="{row.block.description}">{row.block.description}</p> </div> </div> </div> <div if="{!row.info && row.block.name}" class="name column" onclick="{edit}"> <i if="{row.block.config.i18n}" class="world icon"></i> <span class="{required: row.block.config.required}">{row.block.name}</span> <div if="{row.block.description}" class="description"> {row.block.description} </div> </div> <div if="{!row.info}" class="{large: !row.block.name} data column"> <div ref="data" data-is="data-{row.block.type}" mode="{row.mode}" block="{row.block}" dataset="{row.dataset}" get="{get}" onchange="{set}"></div> </div> </div> </div>','ui-form .ui.form.grid,[data-is="ui-form"] .ui.form.grid{ margin: 0 !important; } ui-form .ui.form > .row,[data-is="ui-form"] .ui.form > .row{ padding: 0 !important; } ui-form .ui.form > .row > .info.column,[data-is="ui-form"] .ui.form > .row > .info.column{ padding: 0; margin-top: 1em; margin-bottom: 1em; } ui-form .ui.form > .row > .info.header.column,[data-is="ui-form"] .ui.form > .row > .info.header.column{ margin-top: 3em; margin-left: 15%; } ui-form .ui.form > .row:first-child > .info.column,[data-is="ui-form"] .ui.form > .row:first-child > .info.column{ margin-top: 0; } ui-form .ui.form > .row > .name.column,[data-is="ui-form"] .ui.form > .row > .name.column{ width: 20%; padding-top: 1.15rem; padding-bottom: 1.15rem; border-right: 1px solid #ccc; text-align: right; text-overflow: ellipsis; overflow: hidden; font-weight: bold; } ui-form .ui.form.flat > .row > .name.column,[data-is="ui-form"] .ui.form.flat > .row > .name.column{ width: 100%; padding-top: 0; padding-bottom: 0; margin-top: 0.5em; border: none; text-align: left; } ui-form .ui.form > .row > .name.column .description,[data-is="ui-form"] .ui.form > .row > .name.column .description{ color: #999; font-weight: normal; } ui-form .ui.form.flat > .row > .name.column .description,[data-is="ui-form"] .ui.form.flat > .row > .name.column .description{ display: inline; } ui-form .ui.form.live > .row:not(.readonly) > .name.column:hover,[data-is="ui-form"] .ui.form.live > .row:not(.readonly) > .name.column:hover{ background: #f2f2f2; cursor: pointer; } ui-form .ui.form.live > .row.active > .name.column,[data-is="ui-form"] .ui.form.live > .row.active > .name.column,ui-form .ui.form:not(.live):not(.flat) > .row:hover > .name.column,[data-is="ui-form"] .ui.form:not(.live):not(.flat) > .row:hover > .name.column{ background: #e0e0e0 !important; border-radius: 4px 0 0 4px; } ui-form .ui.form > .row > .data.column,[data-is="ui-form"] .ui.form > .row > .data.column{ width: 80%; padding-top: 0.5rem; padding-bottom: 0.5rem; word-wrap: break-word; } ui-form .ui.form.flat > .row > .data.column,[data-is="ui-form"] .ui.form.flat > .row > .data.column{ width: 100%; padding-top: 0.3rem; } ui-form .ui.form > .row > .large.data.column,[data-is="ui-form"] .ui.form > .row > .large.data.column{ width: 100%; padding: 0; margin: 1em 0; } ui-form .ui.form .data,[data-is="ui-form"] .ui.form .data{ padding-top: 0.65rem; padding-bottom: 0.65rem; } ui-form .ui.form .fields,[data-is="ui-form"] .ui.form .fields{ margin-bottom: 0.5rem; } ui-form .ui.form .fields .wide.field,[data-is="ui-form"] .ui.form .fields .wide.field{ padding-left: 0.25rem; padding-right: 0.25rem; } ui-form .ui.form.live > .row.active > .data.column,[data-is="ui-form"] .ui.form.live > .row.active > .data.column,ui-form .ui.form:not(.live):not(.flat) > .row:hover > .data.column,[data-is="ui-form"] .ui.form:not(.live):not(.flat) > .row:hover > .data.column{ background: #f2f2f2 !important; border-radius: 0 4px 4px 0; } ui-form .ui.form > .row.old,[data-is="ui-form"] .ui.form > .row.old{ background: #ffe8e6; } ui-form .ui.form > .row.new,[data-is="ui-form"] .ui.form > .row.new{ background: #e5f9e7; }',"",function(opts){this.live=void 0!==opts.live,this.flat=void 0!==opts.flat,this.data={},this.on("mount",function(){$(window).on("mousedown",this.close),$(window).on("keydown",this.reset),this.update()}),this.on("update",function(){this.load()}),this.on("unmount",function(){$(window).off("mousedown",this.close),$(window).off("keydown",this.reset)}),this.load=function(){opts.blocks&&this.blocks!==opts.blocks&&(this.blocks=opts.blocks,this.setRows()),opts.data&&this.cache!==opts.data&&(this.cache=opts.data,this.setData(),this.checkFilters())}.bind(this),this.setRows=function(){this.rows=this.blocks.map(function(block){return block.config=block.config||{},{mode:this.live||block.config.readonly?"view":"edit",block:block,info:"info"===block.type}},this),this.update()}.bind(this),this.setData=function(){this.data=this.live?{}:$.extend(!0,{},this.cache),this.modified=!1,this.rows.forEach(function(row){row.dataset=$.extend(!0,[],this.cache&&this.cache[row.block.id])},this),this.update()}.bind(this),this.checkFilters=function(){this.rows.forEach(function(row,i){var visible;row.block.filters&&(visible=UI.matchData(row.block.filters,this.live?this.cache:this.data),$(".row",this.root).eq(i).toggle(visible),!visible&&Array.isArray(this.data[row.block.id])&&(this.data[row.block.id].length=0))},this),(Array.isArray(this.refs.data)?this.refs.data:[this.refs.data]).forEac
1h(function(tag){tag&&"edit"===tag.mode&&"function"==typeof tag.checkFilters&&tag.checkFilters()})}.bind(this),this.reset=function(e){e&&27!==e.which||this.live||(this.setRows(),this.setData())}.bind(this),this.edit=function(e){"edit"!==e.item.row.mode&&(this.close(),e.item.row.block.config.readonly||(e.item.row.mode="edit",this.update()))}.bind(this),this.set=function(block,dataset){this.data[block.id]=dataset,this.modified=!0,this.checkFilters(),block.config.dump&&this.dump()}.bind(this),this.get=function(id){var block=this.blocks.filter(function(b){return b.id===id})[0];if(block)return this.data[block.id]||(this.cache||{})[block.id]}.bind(this),this.submit=function(e){(e.ctrlKey||e.metaKey)&&83===e.which&&(e.preventDefault(),this.dump()),13===e.which&&(this.live?this.close():this.dump())}.bind(this),this.close=function(e){e&&1!==e.which||e&&$(e.target).parents(".row.active").length||this.live&&this.rows&&(this.dump(),this.rows.forEach(function(row){"edit"===row.mode&&(row.mode="view",this.update())},this))}.bind(this),this.dump=function(ifModified){if((Array.isArray(this.refs.data)?this.refs.data:[this.refs.data]).forEach(function(tag){tag&&"edit"===tag.mode&&"function"==typeof tag.dump&&tag.dump()}),!this.live&&!ifModified||this.modified){for(var i in this.data)this.data[i]=this.data[i].filter(function(data){return!$.isEmptyObject(data)});this.trigger("change",this.data),this.modified=!1,this.live&&(this.data={})}}.bind(this)}),riot.tag2("ui-html",'<div ref="content" class="content"></div>','ui-html .content,[data-is="ui-html"] .content{ overflow: hidden; }',"",function(opts){this.on("mount",function(){this.load()}),this.on("update",function(){this.load()}),this.load=function(){var tags;this.content!==opts.content&&(this.content=opts.content||"",$(this.refs.content).html($.parseHTML(this.content)),tags=riot.util.tags.selectTags(),(this.content.match(/<[a-z0-9]+-[a-z0-9-]+/gi)||[]).map(function(str){return str.slice(1)}).filter(function(tag,i,self){return self.indexOf(tag)===i}).forEach(function(tag){$(tag,this.refs.content).each(function(i,el){tags.match('"'+tag+'"')&&riot.mount(el,tag)})},this))}.bind(this)}),riot.tag2("ui-map",'<div ref="map" class="map" riot-style="{style}"></div>','ui-map .map,[data-is="ui-map"] .map{ height: 400px; } ui-map .map .marker.icon,[data-is="ui-map"] .map .marker.icon{ font-size: 48px; line-height: 1; text-shadow: 1px 0 0 #fff, -1px 0 0 #fff, 0 1px 0 #fff, 0 -1px 0 #fff; }',"",function(opts){this.style=opts.height&&{height:opts.height+"px"};var url=UI.getResourceURL("leaflet","1.7.1");this.on("mount",function(){UI.require([{url:url+"/dist/leaflet.css",sri:"sha256-BPfK9M5v34c2XP6p0cxVz1mUQLst0gTLk0mlc7kuodA="},{url:url+"/dist/leaflet.js",sri:"sha256-yDc0eil8GjWFKqN1OSzHSVCiuGghTosZCcRje4tj7iQ="}],this.load)}),this.on("update",function(){this.load()}),this.load=function(){var icon;window.L&&(L.CustomTileLayer=L.TileLayer.extend({createTile:function(coords,done){var tile=L.TileLayer.prototype.createTile.call(this,coords,done);return tile.setAttribute("referrerpolicy","strict-origin-when-cross-origin"),tile}}),L.customTileLayer=function(url,options){return new L.CustomTileLayer(url,options)},this.map||(this.map=L.map(this.refs.map,{tap:!1}).on("click",this.clear).setView([0,0],1),this.map.attributionControl.setPrefix(),this.group=L.featureGroup().addTo(this.map),L.customTileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{crossOrigin:"anonymous",attribution:'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}).addTo(this.map)),this.markers!==opts.markers&&(this.markers=opts.markers,this.group.clearLayers(),icon=L.divIcon({className:"",iconSize:[56,48],iconAnchor:[28,48],html:'<i class="'+(opts.color||"blue")+' marker icon"></i>'}),this.markers.filter(function(data){return data.latitude&&data.longitude}).forEach(function(data){var marker=L.marker([data.latitude,data.longitude],{icon:icon}).addTo(this.group);marker.on("click",this.select.bind(this,data,marker))},this),0<this.group.getLayers().length&&this.map.flyToBounds(this.group.getBounds(),{maxZoom:Number(opts.zoom)||void 0,duration:2})))}.bind(this),this.select=function(data,marker){this.selected!==data?(this.selected=data,this.trigger("select",data,marker),this.group.eachLayer(function(layer){layer.setOpacity(layer===marker?1:.5)})):this.clear()}.bind(this),this.clear=function(){this.selected=null,this.trigger("select",null),this.group.eachLayer(function(layer){layer.setOpacity(1)})}.bind(this)}),riot.tag2("ui-menu",'<div class="ui vertical fluid text menu"> <virtual each="{item in menu}"> <a draggable="true" onclick="{select}" ondrop="{drop}" ondragstart="{dragStart}" ondragover="{dragOver}" ondragend="{dragEnd}" class="item {active: item.id === active.id, over: item === drag.target}"> <i if="{item.icon}" class="{item.icon} icon"></i> {item.name} </a> <a each="{item in item.children}" draggable="true" onclick="{select}" ondrop="{drop}" ondragstart="{dragStart}" ondragover="{dragOver}" ondragend="{dragEnd}" class="item child {active: item.id === active.id, over: item === drag.target}"> <i if="{item.icon}" class="{item.icon} icon"></i> {item.name} </a> </virtual> </div>','ui-menu .ui.vertical.text.menu .item,[data-is="ui-menu"] .ui.vertical.text.menu .item{ margin: 0; padding: 0.6em 0.4em; border-radius: 0.2em !important; outline: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } ui-menu .ui.vertical.text.menu .item:hover,[data-is="ui-menu"] .ui.vertical.text.menu .item:hover{ background: #f2f2f2; } ui-menu .ui.vertical.text.menu .item.active,[data-is="ui-menu"] .ui.vertical.text.menu .item.active{ background: #e0e0e0; } ui-menu .ui.vertical.text.menu .item.child,[data-is="ui-menu"] .ui.vertical.text.menu .item.child{ margin-left: 1em; } ui-menu .ui.vertical.text.menu .item.over,[data-is="ui-menu"] .ui.vertical.text.menu .item.over{ background: #e0e0e0; outline: 2px dashed #666; outline-offset: -2px; }',"",function(opts){this.drag={},this.on("mount",function(){this.update()}),this.on("update",function(){this.load()}),this.load=function(){this.menu!==opts.list&&(this.menu=opts.list,this.active=opts.active)}.bind(this),this.select=function(e){this.active=e.item.item,this.update(),this.trigger("select",e.item.item)}.bind(this),this.dragStart=function(e){opts.move?(e.dataTransfer.setData("text",1),this.drag.source=e.item.item,this.drag.context=this.menu.reduce(function(list,item){return 0<=(item.children||[]).indexOf(e.item.item)?
1item.children:list},this.menu)):e.preventDefault()}.bind(this),this.dragOver=function(e){e.preventDefault(),this.drag.target!==e.item.item&&-1!==this.drag.context.indexOf(e.item.item)&&(this.drag.target=e.item.item,this.update())}.bind(this),this.drop=function(e){e.preventDefault(),this.drag.source!==this.drag.target&&this.trigger("move",this.drag.source,this.drag.target)}.bind(this),this.dragEnd=function(e){this.drag={},this.update()}.bind(this)}),riot.tag2("ui-message",'<div if="{messages}" class="ui {type} message"> <i if="{icon}" class="{icon} icon"></i> <div class="content"> <div if="{title}" class="header">{title}</div> <p if="{messages.length === 1}">{messages[0]}</p> <ul if="{messages.length !== 1}" class="list"> <li each="{message in messages}">{message}</li> </ul> </div> </div>','ui-message .ui.message,[data-is="ui-message"] .ui.message{ display: flex !important; margin-bottom: 1em !important; } ui-message .ui.message .content,[data-is="ui-message"] .ui.message .content{ padding: 0 !important; }',"",function(opts){this.set=function(type,args,scroll){this.type=type+(args.icon?" icon":""),this.title=args.title,this.icon=args.icon,this.messages=Array.isArray(args.message)?args.message:[args.message],this.update(),!1!==scroll&&this.root.scrollIntoView()}.bind(this),this.reset=function(){this.messages=null,this.update()}.bind(this)}),riot.tag2("ui-modal",'<div ref="modal" class="ui {size} modal"> <i if="{type === \'form\'}" class="close icon"></i> <div class="header"> <i class="{icon} icon"></i> {name} </div> <div if="{type === \'form\'}" class="content"> <ui-message ref="message"></ui-message> <ui-form if="{form && form.blocks}" ref="form" blocks="{form.blocks}" data="{form.data}" onchange="{set}"></ui-form> <div if="{form && form.tabs}" class="ui secondary pointing menu" style="margin-top: 0;"> <a each="{tab in form.tabs}" class="item {active: active === tab}" onclick="{showTab}"> <i class="{tab.icon} icon"></i> {tab.name} </a> </div> <div if="{form && form.tabs}"> <div each="{tab in form.tabs}" show="{active === tab}"> <ui-form ref="form" blocks="{tab.blocks}" data="{tab.data}" onchange="{set}"></ui-form> </div> </div> </div> <div if="{type === \'form\'}" class="actions"> <button ref="loading" class="ui primary button" onclick="{submit}">Valider</button> <button ref="disabled" class="ui cancel button">Annuler</button> </div> <div if="{type === \'confirm\'}" class="content"> {args.text} </div> <div if="{type === \'confirm\'}" class="actions"> <button if="{opts.type === \'delete\'}" ref="loading" class="ui red button" onclick="{submit}">Supprimer</button> <button if="{opts.type === \'process\'}" ref="loading" class="ui primary button" onclick="{submit}">Procéder</button> <button ref="disabled" class="ui cancel button">Annuler</button> </div> <div if="{type === \'alert\'}" class="content"> <div class="ui {bulleted: args.messages.length > 1} list"> <div each="{message in args.messages}" class="item">{message}</div> </div> </div> <div if="{type === \'alert\'}" class="actions"> <button class="ui primary ok button">OK</button> </div> </div>',"","",function(opts){this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.show=function(args){if("add"===opts.type)this.type="form",this.icon=args.icon||"plus",this.method="POST";else if("edit"===opts.type)this.type="form",this.icon=args.icon||"write",this.method="PATCH";else if("delete"===opts.type)this.type="confirm",this.icon=args.icon||"remove",this.method="DELETE";else if("process"===opts.type)this.type="confirm",this.icon=args.icon||"setting",this.method="PATCH";else{if("alert"!==opts.type)return;this.type="alert",this.icon=args.icon||"warning sign",args.messages=Array.isArray(args.message)?args.message:[args.message]}$(this.refs.modal).modal({autofocus:!1,closable:"alert"===this.type}),this.args=args,this.size=args.size||("form"!==this.type?"tiny":""),this.name=args.name||args.title,this.load()}.bind(this),this.load=function(){if("form"!==this.type)return this.update(),void $(this.refs.modal).modal("show");this.request({method:this.method,url:this.args.url,data:{rows:this.args.rows&&this.args.rows.map(function(row){return{id:row.id,type:row.type}})},success:function(res){this.form=null,this.update(),this.form=res,this.form.data=this.form.data||{},this.active=res.tabs?res.tabs[0]:null,this.update(),this.refs.message&&this.refs.message.reset(),$(this.refs.modal).modal("show"),this.refs.modal.parentNode.scrollTop=0}})}.bind(this),this.showTab=function(e){this.active=e.item.tab,this.update()}.bind(this),this.set=function(data){this.data?$.extend(this.data,data):this.submit()}.bind(this),this.submit=function(e){var forms;"form"===this.type&&(forms=Array.isArray(this.refs.form)?this.refs.form:[this.refs.form],this.data={}
1,forms.forEach(function(form){form.dump()})),this.send(),delete this.data}.bind(this),this.send=function(){var args={data:this.data,soft:this.args.soft,rows:this.args.rows&&this.args.rows.map(function(row){return{id:row.id,type:row.type}})};this.request({method:this.method,url:this.args.url,data:args,success:function(res,xhr){202===xhr.status&&this.submitForm(args),$(this.refs.modal).modal("hide"),this.trigger("submit",res)},error:function(res){if(res&&res.error&&"confirm"===this.type)return opts.type="alert",void this.show(res.error);$(this.refs.modal).modal("show"),this.refs.message&&this.refs.message.set("error",res&&res.error)}})}.bind(this),this.submitForm=function(data){var form=document.createElement("form");form.setAttribute("method",this.method),form.setAttribute("action",this.args.url),form.setAttribute("style","display: none;");var input=document.createElement("input");input.setAttribute("type","hidden"),input.setAttribute("name","json"),input.setAttribute("value",JSON.stringify(data)),form.appendChild(input),document.body.appendChild(form),form.submit(),document.body.removeChild(form)}.bind(this)}),riot.tag2("ui-pagination",'<div if="{count}" class="ui icon buttons"> <button class="ui icon button" value="prev" onclick="{go}"> <i class="angle left icon"></i> </button> <button each="{n in pages}" class="ui {grey: n === page} button" onclick="{go}"> {n} </button> <button class="ui icon button" value="next" onclick="{go}"> <i class="angle right icon"></i> </button> </div>','ui-pagination .ui.button,[data-is="ui-pagination"] .ui.button{ min-width: 2.8em; } @media only screen and (max-width: 600px) { ui-pagination .ui.button:not(.icon):not(.grey),[data-is="ui-pagination"] .ui.button:not(.icon):not(.grey){ display: none; } }',"",function(opts){var more=opts.more||2;this.on("mount",function(){this.update()}),this.on("update",function(){this.load()}),this.load=function(){this.page=opts.data.page,this.count=Math.ceil(opts.count/opts.data.limit),this.pages=[];for(var min=Math.min(Math.max(1,this.count-2*more),Math.max(1,this.page-more)),max=Math.min(this.count,min+2*more),i=min;i<=max;i++)this.pages.push(i)}.bind(this),this.go=function(e){var page=e.currentTarget.value?"prev"===e.currentTarget.value?Math.max(1,this.page-1):Math.min(this.count,this.page+1):e.item.n;page!==this.page&&this.trigger("change",page)}.bind(this)}),riot.tag2("ui-search",'<div class="ui left icon input" onchange="{stop}"> <input type="text" placeholder="Recherche" riot-value="{text}" oninput="{set}"> <i class="{search: !text, \'remove link\': text} icon" onclick="{reset}"></i> </div>','ui-search .ui.input,[data-is="ui-search"] .ui.input{ max-width: 40vw; }',"",function(opts){this.on("mount",function(){this.update()}),this.on("update",function(){this.load()}),this.on("unmount",function(){clearTimeout(this.timeout)}),this.load=function(){!this.edit&&opts.data&&(this.text=opts.data.search)}.bind(this),this.set=function(e){this.edit=!0,this.text=e.target.value.trim()||null,clearTimeout(this.timeout),this.timeout=setTimeout(function(){this.edit=!1,this.trigger("change",this.text)}.bind(this),500)}.bind(this),this.reset=function(e){this.text=null,this.update(),this.trigger("change",null)}.bind(this)}),riot.tag2("ui-status","<div class=\"ui icon buttons\"> <button ref=\"button\" class=\"ui basic button\"> {(opts.count > 1000 && opts.count % 1000 === 0) ? '~' : ''} {opts.count ? opts.count.toLocaleString() : 'Aucun'} résultat{opts.count > 1 ? 's' : ''} </button> </div>","","",function(opts){this.toggle=function(){this.refs.button.classList.toggle("loading")}.bind(this)}),riot.tag2("ui-upload",'<div show="{!queue}" class="dropzone {active: droppable}"> <div class="ui icon medium header"> <i class="upload icon"></i> Cliquez ici ou glissez-déposez des fichiers </div> <label ref="target" class="target"> <input type="file" class="file" accept="{accept}" multiple onchange="{select}"> </label> </div> <div if="{queue && images}"> <ui-cropper file="{images[0]}" ratio="{ratio}" ondone="{crop}"></ui-cropper> </div> <div if="{queue && !images}" class="ui {blue: queue.length, success: !queue.length} progress"> <div ref="bar" class="bar"></div> <div if="{wait}" class="label"> <i class="wait icon"></i> Préparation en cours, veuillez patienter... </div> <div if="{!wait && queue.length}" class="label"> <i class="spinner loading icon"></i> {queue[0].name} ({UI.toFileSize(queue[0].size)}) </div> <div if="{!wait && !queue.length}" class="label"> <i class="green checkmark icon"></i> Téléchargement terminé </div> </div>','ui-upload .dropzone,[data-is="ui-upload"] .dropzone{ position: relative; background: #fff; border: 2px dashed #999; border-radius: 12px; padding: 3em; text-align: center; } ui-upload .dropzone .ui.header,[data-is="ui-upload"] .dropzone .ui.header{ color: #5a5a5a; } ui-upload .dropzone:hover,[data-is="ui-upload"] .dropzone:hover,ui-upload .dropzone.active,[data-is="ui-upload"] .dropzone.active{ background: #e0e0e0; } ui-upload .dropzone:hover .ui.header,[data-is="ui-upload"] .dropzone:hover .ui.header,ui-upload .dropzone.active .ui.header,[data-is="ui-upload"] .dropzone.active .ui.header{ color: #282929; } ui-upload .dropzone .target,[data-is="ui-upload"] .dropzone .target{ position: absolute; width: 100%; height: 100%; top: 0; left: 0; cursor: pointer; } ui-upload .dropzone .file,[data-is="ui-upload"] .dropzone .file{ width: 0.1px !important; height: 0.1px !important; opacity: 0; overflow: hidden; position: absolute; z-index: -1; }',"",function(opts){this.accept=Array.isArray(opts.accept)?opts.accept.map(function(ext){return"."+ext}).join(","):opts.accept,this.on("mount",function(){$(this.refs.target).on("dragenter dragover dragleave drop",this.drop),UI.require({url:UI.getResourceURL("compressorjs","1.0.7")+"/dist/compressor.min.js",sri:"sha256-rD/eYJFZOfVR/5awJdAAPEKdLZGeAZWrsdOc5RP/grc="})}),this.isImage=function(file){return-1!==UI.filetype.image.ext.indexOf(UI.getFileExt(file))}.bind(this),this.select=function(e){e.stopPropagation(),this.set(Array.prototype.slice.call(e.target.files))}.bind(this),this.drop=function(e){e.preventDefault(),"dragover"!==e.type&&(this.droppable="dragenter"===e.type,this.update()),"drop"===e.type&&0<e.originalEvent.dataTransfer.files.length&&this.set(Array.prototype.slice.call(e.originalEvent.dataTransfer.files))}.bind(this),this.set=function(files){var types,regex;if(this.accept&&(types=this.accept.replace(/,/g,"|"),regex=new RegExp("("+types+")$","i"),files=files.filter(function(file){return file.name.match(regex)})),opts.limit&&(files=files.slice(0,opts.limit)),0!==files.length){this.queue=files.map(function(file){return file});var images=this.queue.filter(this.isImage);if(images.length&&opts.images&&opts.images.width&&opts.images.height)return this.ratio=opts.images.width/opts.images.height,this.images=images,void this.update();this.process()}}.bind(this),this.crop=function(file,old){this.queue[this.queue.indexOf(old)]=file,this.images=1<this.images.length?this.images.slice(1):null,this.update(),this.images||this.process()}.bind(this),this.compress=function(files,cb){var processed;
1window.Compressor?(processed=0,files.forEach(function(file){new Compressor(file,{width:opts.images&&opts.images.width,height:opts.images&&opts.images.height,success:function(result){this.queue[this.queue.indexOf(file)]=result,++processed===files.length&&cb()}.bind(this),error:function(err){++processed===files.length&&cb()}})},this)):cb()}.bind(this),this.process=function(compressed){if(!compressed){var images=this.queue.filter(this.isImage);if(images.length)return this.wait=!0,this.update(),void this.compress(images,this.process.bind(this,!0))}this.total=this.queue.reduce(function(total,file){return total+file.size},0),this.loaded=0,this.wait=!1,this.update(),this.trigger("send",this.queue),this.send()}.bind(this),this.send=function(){var file=this.queue[0],loaded=0;file?this.request({method:"POST",url:opts.url,upload:!0,data:{file:file},progress:function(e){loaded=e.loaded;var percent=Math.floor((this.loaded+loaded)/this.total*100);this.refs.bar.style.width=percent+"%"},success:function(res){this.trigger("file",res,file)},error:function(res){this.errors=this.errors||[],this.errors.push([file.name,res&&res.error&&res.error.message].join(" : ")),this.trigger("error",res&&res.error,file)},complete:function(){this.loaded+=loaded,this.queue.shift(),this.update(),this.send()}}):this.trigger("done",this.errors)}.bind(this),this.reset=function(){this.queue=null,this.errors=null,this.update()}.bind(this),this.notify=function(e){this.trigger("done")}.bind(this)}),riot.tag2("user-info",'<div if="{user}" class="picture"> <i if="{!user.picture}" class="user circle icon"></i> <img if="{user.picture}" riot-src="{user.picture}?tn"> </div> <div if="{user}" class="name">{user.name}</div>','user-info .picture,[data-is="user-info"] .picture{ position: relative; overflow: hidden; width: 4em; height: 4em; margin: auto; } user-info .picture .icon,[data-is="user-info"] .picture .icon{ width: 1em; font-size: 4em; line-height: 1; } user-info .picture img,[data-is="user-info"] .picture img{ position: absolute; margin: auto; border-radius: 4em; max-width: 100%; max-height: 100%; top: 0; right: 0; bottom: 0; left: 0; } user-info .name,[data-is="user-info"] .name{ padding: 0.4em; text-align: center; }',"",function(opts){this.user=UI.getUser()}),riot.tag2("user-list",'<div if="{controls}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" selectable="{selectable}" link="{opts.link}" onsort="{sort}" onselect="{select}"></ui-list-table> <div if="{controls && count}" class="list footer"> <div> <ui-action list="{actions}" rows="{selection}" onaction="{execute}"></ui-action> <ui-modal ref="delete" type="delete" onsubmit="{load}"></ui-modal> </div> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>',"","",function(opts){this.controls=void 0!==opts.controls,this.selectable=this.controls||opts.selectable,this.args=UI.args.users||{},this.on("mount",function(){this.on("request",this.refs.status&&this.refs.status.toggle),this.load(!0)}),this.load=function(reset){this.request({method:"PUT",url:"/u/users",data:this.args,success:function(res){this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.actions=res.actions,this.config=res.config,UI.args.users=this.args,this.trigger("load",res.info,reset),this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.select=function(rows){this.selection=rows,this.update()}.bind(this),this.go=function(page){this.args.page=page,this.load(!0)}.bind(this),this.execute=function(action,rows){this[action.type](rows)}.bind(this),this.delete=function(rows){this.refs.delete.show({name:"Supprimer",url:"/u/users",rows:rows,text:"Êtes-vous sûr de vouloir supprimer "+rows.length+" élément"+(1<rows.length?"s":"")+" ?"})}.bind(this)}),riot.tag2("user-login",'<form ref="form" class="{\'ui mini modal\': modal}"> <div class="header"> <i class="lock icon"></i> Authentification </div> <div if="{form}" class="content"> <div class="ui form"> <div class="field"> <label>Identifiant</label> <input ref="username" type="text" name="username" placeholder="Identifiant"> </div> <div class="field"> <label>Mot de passe</label> <div class="ui icon input"> <input ref="password" type="{unhide ? \'text\' : \'password\'}" name="password" placeholder="Mot de passe" autocomplete="off"> <i class="{hide: unhide, unhide: !unhide} link icon" onclick="{toggle}"></i> </div> </div> </div> </div> <div if="{form}" class="actions"> <div class="ui left floated icon buttons"> <div class="ui basic button" onclick="{recover}"> Changer le mot de passe </div> </div> <button ref="loading" type="submit" class="ui primary button"> Connexion </button> </div> <div if="{!form}" class="content"> <p> Vous devez vous authentifier pour continuer. </p> <p> Si vous ne possédez pas de compte, cliquez sur "Créer un compte" pour pouvoir vous inscrire. </p> </div> <div if="{!form}" class="actions"> <div class="ui primary button" onclick="{login}"> Se connecter </div> <div class="ui button" onclick="{register}"> Créer un compte </div> </div> </form>
1 <user-recover ref="recover" onclose="{show}"></user-recover> <user-register ref="register" node="{opts.node}" onclose="{show}" modal></user-register>','user-login form:not(.modal) .header,[data-is="user-login"] form:not(.modal) .header{ margin-bottom: 1em; font-size: 1.7em; font-weight: bold; } user-login form:not(.modal) .actions,[data-is="user-login"] form:not(.modal) .actions{ margin-top: 1em; text-align: right; }',"",function(opts){this.modal=void 0!==opts.modal,this.form=!opts.node,this.on("mount",function(){$(this.refs.form).on("submit",this.submit),"login"===opts.autoshow&&this.show(),"recover"===opts.autoshow&&this.recover(),opts.username&&(this.refs.username.value=opts.username)}),this.on("before-unmount",function(){$(this.refs.form).remove()}),this.show=function(){this.modal&&($(this.refs.form).modal({autofocus:!0,closable:!1}),$(this.refs.form).modal("show"))}.bind(this),this.toggle=function(e){this.unhide=!this.unhide,this.update(),this.refs.password.focus()}.bind(this),this.submit=function(e){return this.request({method:"POST",url:"/u/login",data:{username:this.refs.username.value,password:this.refs.password.value},success:function(res){this.modal&&$(this.refs.form).modal("hide"),opts.onlogin?this.trigger("login"):res.redirect?window.location=res.redirect:window.location.reload()},error:function(){$(this.refs.form).transition({animation:"shake"})},complete:function(){this.refs.password.value="",this.refs.username.value?this.refs.password.focus():this.refs.username.focus()}}),!1}.bind(this),this.login=function(e){this.form=!0,this.update()}.bind(this),this.recover=function(e){this.refs.recover.show(this.refs.username.value)}.bind(this),this.register=function(e){this.refs.register.show()}.bind(this)}),riot.tag2("user-logout",'<button class="ui button" onclick="{logout}"> Déconnexion </button>',"","",function(opts){this.logout=function(e){this.request({method:"GET",url:"/u/logout",success:function(){window.location="/"}})}.bind(this)}),riot.tag2("user-permissions",'<div class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> <div ref="views" class="ui icon top left pointing dropdown button"> <i class="eye icon"></i> <div class="menu"> <div class="header">Niveau</div> <div each="{view in views}" class="item" onclick="{setView}"> <i class="{view.icon} icon"></i> {view.name} </div> </div> </div> <ui-status ref="status" count="{count}" class="keep" onclick="{load}"></ui-status> </div> <div> <button ref="button" class="ui primary button">{edit ? \'Modifier\' : \'Ajouter\'}</button> <div ref="popup" class="ui flowing popup hidden"> <ui-message ref="message"></ui-message> <div if="{blocks}" class="ui form" onkeydown="{submit}"> <div if="{!edit && blocks.object.config.url}" class="field"> <label>{blocks.object.name}</label> <data-option mode="edit" block="{blocks.object}" dataset="{data.object}" onchange="{setData}"></data-option> </div> <div if="{!edit && blocks.target}" class="field"> <label>{blocks.target.name}</label> <data-option mode="edit" block="{blocks.target}" dataset="{data.target}" onchange="{setData}"></data-option> </div> <div if="{types}" class="field"> <label>Permissions</label> <i each="{type in types}" title="{type.name}" onclick="{setState}" class="{type.icon} {state[type.id] ? \'inverted\' : \'grey\'} bordered link icon"></i> </div> <div class="actions"> <button ref="loading" class="ui primary button" onclick="{submit}">Enregistrer</button> <button ref="disabled" class="ui button" onclick="{cancel}">Annuler</button> </div> </div> </div> </div> </div> <ui-list-table cols="{cols}" rows="{rows}" data="{args}" selectable="true" link="{opts.link}" onsort="{sort}" onselect="{select}"></ui-list-table> <div if="{count}" class="list footer"> <ui-action list="{actions}" rows="{selection}" onaction="{execute}"></ui-action> <ui-pagination data="{args}" count="{count}" onchange="{go}"></ui-pagination> </div>','user-permissions .ui.popup,[data-is="user-permissions"] .ui.popup{ width: 40em; } user-permissions .ui.popup .actions,[data-is="user-permissions"] .ui.popup .actions{ text-align: right; padding-top: 1em; }',"",function(opts){this.args={},this.data={},this.state={},this.on("mount",function(){$(this.refs.button).popup({on:"click",popup:this.refs.popup,position:"bottom right"}),$(this.refs.views).dropdown({action:"hide"}),this.on("request",this.refs.status&&this.refs.status.toggle),this.reset(),this.load()}),this.load=function(){this.request({method:"PUT",url:"/u/role/"+opts.role+"/permissions",data:this.args,success:function(res){this.info=res.info,this.cols=res.cols,this.rows=res.rows,this.args=res.args,this.count=res.info.count,this.views=res.views,this.types=res.types,this.actions=res.actions,this.blocks={object:res.cols.filter(function(col){return"object"===col.id})[0],target:res.cols.filter(function(col){return"target"===col.id})[0]},this.update(),$(".icon[title]",this.root).popup()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.setView=function(e){this.args={view:e.item.view.id},this.reset(),this.load()}.bind(this),this.sort=function(column,dir){this.args.sort=column,this.args.dir=dir,this.args.page=1,this.load()}.bind(this),this.select=function(rows){this.selection=rows,this.edit=0<rows.length,this.update()}.bind(this),this.go=function(page){this.args.page=page,this.load()}.bind(this),this.setData=function(block,dataset){this.data[block.id]=dataset}.bind(this),this.setState=function(e){this.state[e.item.type.id]=!this.state[e.item.type.id]||void 0,this.update()}.bind(this),this.submit=function(e){1!==e.which&&13!==e.which||this.request({method:this.edit?"PATCH":"POST",url:"/u/permissions"+(this.edit?"":"?r="+opts.role+"&b="+this.args.view),data:{data:this.edit?void 0:this.data,state:this.state,rows:this.edit?this.selection.map(function(row){return{id:row.id}}):void 0},success:function(){$(this.refs.button).popup("hide"),this.reset(),this.load()},error:function(res){this.refs.message.set("error",res&&res.error)}})}.bind(this),this.cancel=function(e){$(this.refs.button).popup("hide"),this.reset(),this.update()}.bind(this),this.reset=function(){this.refs.message.reset(),this.data={},this.state={}}.bind(this),this.execute=function(action,rows){this[action.type](rows)}.bind(this),this.delete=function(rows){this.request({method:"DELETE",url:"/u/permissions",data:{rows:rows.map(function(row){return{id:row.id}})},success:function(){this.load()}})}.bind(this)}),riot.tag2("user-profile",'<h3>{name}</h3> <ui-message ref="message"></ui-message> <ui-form if="{form}" ref="form" live="{opts.live}" blocks="{form.blocks}" data="{form.data}" onchange="{send}"></ui-form> <div if="{form}" class="actions"> <button ref="loading" class="ui primary button" onclick="{submit}"> Enregistrer </button> <button ref="disabled" class="ui button" onclick="{reset}"> Réinitialiser </button> </div>','user-profile .ui.message,[data-is="user-profile"] .ui.message{ margin-bottom: 2em; } user-profile .actions,[data-is="user-profile"] .actions{ text-align: right; margin: 1em; }',"",function(opts){this.on("mount",function(){this.load()}),this.load=function(){this.request({method:"PATCH",url:"/u/user/profile",success:function(res){if(this.name=res.info.name,res.blocks)for(var i=0;i<res.blocks.length;i++){var b=res.blocks[i];"html"===b.type&&(b.config||(b.config={}),b.config.insert=["link","table"],b.config.url={file:"/n/block/"+b.id+"/file",pages:"/p/pages",fragments:"/p/fragments"})}this.form=res,this.update()},error:function(res){this.refs.message.set("error",res&&res.error)}})}.bind(this),this.submit=function(e){this.refs.form.dump()}.bind(this),this.send=function(data){this.request({method:"PATCH",url:"/u/user/profile",data:{data:data},success:function(res){this.load(),this.refs.message.set("success",res.success)},error:function(res){this.refs.message.set("error",res&&res.error)}})}.bind(this),this.reset=function(e){this.refs.form.reset()}.bind(this)}),riot.tag2("user-recover",'<div ref="modal" class="ui mini modal"> <div class="header"> <i class="lock icon"></i> Changer le mot de passe </div> <div if="{!sent}" class="content"> <p> Veuillez indiquer votre identifiant, un e-mail contenant un code d\'authentification vous sera envoyé. </p> <div class="ui form" onkeydown="{submit}"> <div class="field"> <label>Identifiant</label> <input ref="username" type="text"> </div> </div> </div> <div if="{sent}" class="content"> <p> Veuillez indiquer le code d\'authentification reçu par e-mail, ainsi que le nouveau mot de passe désiré. </p> <div class="ui form" onkeydown="{reset}"> <div class="field"> <label>Code d\'authentification</label> <input ref="authcode" type="text"> </div> <div class="field"> <label>Nouveau mot de passe</label> <div class="ui icon input"> <input ref="password" type="{unhide ? \'text\' : \'password\'}" autocomplete="off"> <i class="{hide: unhide, unhide: !unhide} link icon" onclick="{toggle}"></i> </div> </div> </div> </div> <div class="actions"> <button ref="loading" class="ui primary button" onclick="{sent ? reset : submit}"> Valider </button> <button ref="disabled" class="ui cancel button" onclick="{cancel}"> Annuler </button> </div> </div>',"","",function(opts){this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.show=function(username){$(this.refs.modal).modal({closable:!1}),this.sent=!1,this.update(),this.refs.username.value=username,$(this.refs.modal).modal("show")}.bind(this),this.toggle=function(e){this.unhide=!this.unhide,this.update()}.bind(this),this.submit=function(e){1!==e.which&&13!==e.which||this.request({method:"POST",url:"/u/recover",data:{username:this.refs.username.value},success:function(){this.sent=!0,this.update(),this.refs.authcode.focus()}})}.bind(this),this.reset=function(e){1!==e.which&&13!==e.which||this.request({method:"POST",url:"/u/reset",data:{authcode:this.refs.authcode.value,password:this.refs.password.value},success:function(){this.trigger("close"),$(this.refs.modal).modal("hide")},error:function(){$(this.refs.modal).transition({animation:"shake"})}})}.bind(this),this.cancel=function(e){this.trigger("close")}.bind(this)}),riot.tag2("user-register",'<div if="{!modal}"> <ui-message ref="message"></ui-message> <ui-form if="{form}" ref="form" blocks="{form.blocks}" data="{form.data}" onchange="{send}"></ui-form> <div if="{form}" class="buttons"> <button ref="loading" class="ui primary button" onclick="{submit}">Valider</button> </div> </div> <ui-modal if="{modal}" ref="register" type="add" onsubmit="{confirm}"></ui-modal> <div if="{success}" ref="modal" class="ui mini modal"> <div class="header"> <i class="{success.icon} icon"></i> {success.title} </div> <div class="content"> <p each="{message in success.message}">{message}</p> </div> <div class="actions"> <button ref="disabled" class="ui cancel button" onclick="{close}"> Fermer </button> </div> </div>','user-register .ui.message,[data-is="user-register"] .ui.message{ margin-bottom: 2em; } user-register .buttons,[data-is="user-register"] .buttons{ text-align: right; margin: 1em; }',"",function(opts){this.modal=void 0!==opts.modal,this.on("mount",function(){this.modal||this.load()}),this.on("before-unmount",function(){$(this.refs.modal).remove()}),this.show=function(){this.refs.register.show({name:"Créer un compte",url:"/u/register?n="+opts.node})}.bind(this),this.load=function(){opts.node&&this.request({method:"POST",url:"/u/register?n="+opts.node,success:function(res){this.form=res,this.form.data=this.form.data||{},this.update()},error:function(res){this.refs.message.set("error",res&&res.error)}})}.bind(this),this.submit=function(e){this.refs.form.dump()}.bind(this),this.send=function(data){this.request({method:"POST",url:"/u/register?n="+opts.node,data:{data:data},success:function(res,xhr){this.form=null,this.update(),res.redirect?window.location=res.redirect:this.refs.message.set("success",res.success)},error:function(res){this.refs.message.set("error",res&&res.error)}})}.bind(this),this.confirm=function(res){this.success=res.success,this.update(),$(this.refs.modal).modal({closable:!1}),$(this.refs.modal).modal("show")}.bind(this),this.close=function(){this.trigger("close")}.bind(this)});
2riot.tag2("analytics-google","","","",function(opts){this.on("mount",function(){this.init()}),this.init=function(){opts.identifier&&("gtm"===opts.loader?this.loadTagManager():"gtag"===opts.loader?this.loadGlobalSiteTag():this.loadAnalytics())}.bind(this),this.loadTagManager=function(){window.dataLayer=window.dataLayer||[],window.dataLayer.push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),UI.require("https://www.googletagmanager.com/gtm.js?id="+opts.identifier,null,{async:!0})}.bind(this),this.loadGlobalSiteTag=function(){UI.require("https://www.googletagmanager.com/gtag/js?i
2d="+opts.identifier,null,{async:!0}),window.dataLayer=window.dataLayer||[],window.gtag=function(){dataLayer.push(arguments)},gtag("js",new Date),gtag("config",opts.identifier)}.bind(this),this.loadAnalytics=function(){window.ga=window.ga||function(){window.ga.q=window.ga.q||[],window.ga.q.push(arguments)},window.ga.l=(new Date).getTime(),window.GoogleAnalyticsObject="ga",UI.require("https://www.google-analytics.com/analytics.js",null,{async:!0}),ga("create",opts.identifier,"auto"),ga("send","pageview")}.bind(this)}),riot.tag2("payment-axepta",'<p>Vous allez être redirigé sur une page de paiement sécurisée après validation.</p> <form if="{form}" ref="form" method="post" action="{form.url}"> <input each="{value, name in form.params}" type="hidden" name="{name}" riot-value="{value}"> </form>',"","",function(opts){this.authorize=function(){this.trigger("done",this.process)}.bind(this),this.process=function(args){this.request({method:"POST",url:"/c/payment/"+opts.payment+"/transaction",data:{id:args.id,amount:args.amount,return:UI.getHost()+"/i/transaction/"+args.id},success:function(res){this.form=res.transaction,this.update(),this.refs.form.submit()},error:function(res){this.trigger("error",res&&res.error&&res.error.message)}})}.bind(this)}),riot.tag2("payment-lyra",'<div if="{transaction}" class="ui form kr-embedded"> <div class="fields"> <div class="eight wide field"> <label>Numéro de carte</label> <div class="kr-pan"></div> </div> <div class="four wide field"> <label>Date d\'expiration</label> <div class="kr-expiry"></div> </div> <div class="four wide field"> <label>Cryptogramme</label> <div class="kr-security-code"></div> </div> </div> <button class="kr-payment-button"></button> </div>','payment-lyra .ui.form,[data-is="payment-lyra"] .ui.form{ max-width: 600px; margin: 2em auto; } payment-lyra .kr-field-wrapper,[data-is="payment-lyra"] .kr-field-wrapper{ padding: 0.5em 0; border: 1px solid #dedede; border-radius: 0.3rem; background: #fff; } payment-lyra .kr-payment-button,[data-is="payment-lyra"] .kr-payment-button{ display: none; }',"",function(opts){this.on("mount",function(){UI.require({url:"https://api.lyra.com/static/js/krypton-client/V4.0/stable/kr-payment-form.min.js",attributes:{"kr-public-key":opts.config.identifier}},this.init)}),this.init=function(){this.request({method:"POST",url:"/c/payment/"+opts.payment+"/transaction",data:{amount:opts.amount},success:function(res){this.transaction=res.transaction,this.update(),KR.setFormToken(res.transaction.formToken),KR.onError(this.notify),KR.onSubmit(this.notify)},error:function(res){this.trigger("error",res&&res.error&&res.error.message)}})}.bind(this),this.authorize=function(){$(".kr-payment-button",this.root).click()}.bind(this),this.notify=function(data){data.clientAnswer&&"RUNNING"===data.clientAnswer.orderStatus?this.trigger("done",{uuid:data.clientAnswer.transactions[0].uuid}):this.trigger("error",data.errorMessage)}.bind(this)}),riot.tag2("payment-monetico",'<p>Vous allez être redirigé sur une page de paiement sécurisée après validation.</p> <form if="{form}" ref="form" method="post" action="{form.url}"> <input each="{value, name in form.params}" type="hidden" name="{name}" riot-value="{value}"> </form>',"","",function(opts){this.authorize=function(){this.trigger("done",this.process)}.bind(this),this.process=function(args){this.request({method:"POST",url:"/c/payment/"+opts.payment+"/transaction",data:{id:args.id,amount:args.amount},success:function(res){this.form=res.transaction,this.update(),this.refs.form.submit()},error:function(res){this.trigger("error",res&&res.error&&res.error.message)}})}.bind(this)}),riot.tag2("payment-paybox",'<p>Vous allez être redirigé sur une page de paiement sécurisée après validation.</p> <p>Veuillez indiquer l\'adresse e-mail sur laquelle vous souhaitez recevoir le reçu de paiement :</p> <div class="ui input"> <input ref="email" type="text" placeholder="Adresse e-mail"> </div> <div id="multiPaymentContainer" if="{opts.config.multi}" class="ui checkbox"> <input ref="multi" type="checkbox"> <label ref="lblMulti" for="multi">{lblMultiText}<span style="font-weight:bold;">{lblMultiTextDetail}</span> </label> </div> <form if="{form}" ref="form" method="post" action="{form.url}"> <input each="{value, name in form.params}" type="hidden" name="{name}" riot-value="{value}"> </form>','payment-paybox #multiPaymentContainer,[data-is="payment-paybox"] #multiPaymentContainer{ display: none; margin-top : 10px; margin-bottom : 10px; }',"",function(opts){var date=new Date,date1=String(date.getDate()).padStart(2,"0")+"/"+String(date.getMonth()+1).padStart(2,"0")+"/"+date.getFullYear();date.setDate(date.getDate()+opts.config.gap);var date2=String(date.getDate()).padStart(2,"0")+"/"+String(date.getMonth()+1).padStart(2,"0")+"/"+date.getFullYear();date.setDate(date.getDate()+opts.config.gap);var date3=String(date.getDate()).padStart(2,"0")+"/"+String(date.getMonth()+1).padStart(2,"0")+"/"+date.getFullYear(),totalCents=Math.round(100*opts.amount),base=Math.floor(totalCents/3),reste=totalCents%3,amount1=base,amount2=base,amount3=base;0<reste&&(amount1+=1),1<reste&&(amount2+=1),amount1/=100,amount2/=100,amount3/=100,this.lblMultiText="Activer le paiement en 3 fois : ",this.lblMultiTextDetail=amount1+"€ ("+date1+") - "+amount2+"€ ("+date2+") - "+amount3+"€ ("+date3+")",this.authorize=function(){/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this.refs.email.value)?this.trigger("done",this.process):this.trigger("error","Veuillez indiquer une adresse e-mail valide")}.bind(this),this.process=function(args){this.request({method:"POST",url:"/c/payment/"+opts.payment+"/transaction",data:{id:args.id,amount:args.amount,email:this.refs.email.value,return:UI.getHost()+"/i/transaction/"+args.id,multi:opts.config.multi&&this.refs.multi.checked,date1:opts.config.multi&&date1,amount1:opts.config.multi&&amount1,date2:opts.config.multi&&date2,amount2:opts.config.multi&&amount2,date3:opts.config.multi&&date3,amount3:opts.config.multi&&amount3},success:function(res){this.form=res.transaction,this.update(),this.refs.form.submit()},error:function(res){this.trigger("error",res&&res.error&&res.error.message)}})}.bind(this)}),riot.tag2("payment-paypal",'<div ref="button" class="button"></div>','payment-paypal .button,[data-is="payment-paypal"] .button{ margin: 2em auto; width: 30em; }',"",function(opts){this.on("mount",function(){UI.require("https://www.paypal.com/sdk/js?intent=authorize&currency=EUR&client-id="+opts.config.identifier,this.init)}),this.init=function(){paypal.Buttons({style:{layout:"horizontal",label:"pay",tagline:!1},createOrder:function(data,actions){return actions.order.create({intent:"AUTHORIZE",purchase_units:[{amount:{currency_code:"EUR",value:opts.amount}}]})},onError:function(err){this.trigger("error","Error")},onApprove:function(data,actions){this.transaction={id:data.orderID},this.update(),this.trigger("done",this.transaction)}.bind(this)}).render(this.refs.button)}.bind(this),this.authorize=function(){this.transaction?this.trigger("done",this.transaction):this.trigger("error","Veuillez cliquer sur le bouton Paypal afin d'autoriser le paiement")}.bind(this)}),riot.tag2("payment-sips",'<p>Vous allez être redirigé sur une page de paiement sécurisée après validation.</p> <form if="{form}" ref="form" method="post" action="{form.url}"> <input type="hidden" name="redirectionData" riot-value="{form.data}"> <input type="hidden" name="redirectionVersion" riot-value="{form.ver
2sion}"> </form>',"","",function(opts){this.authorize=function(){this.trigger("done",this.process)}.bind(this),this.process=function(args){this.request({method:"POST",url:"/c/payment/"+opts.payment+"/transaction",data:{amount:args.amount,return:UI.getHost()+"/i/transaction/"+args.id},success:function(res){this.form=res.transaction,this.update(),this.refs.form.submit()},error:function(res){this.trigger("error",res&&res.error&&res.error.message)}})}.bind(this)}),riot.tag2("payment-stripe-debit",'<div class="ui form"> <div class="fields"> <div class="eight wide field"> <label>Nom</label> <input ref="name" type="text" placeholder="Tel qu\'il apparaît sur le compte bancaire" required> </div> <div class="eight wide field"> <label>Adresse e-mail</label> <input ref="email" type="text"> </div> </div> <div class="fields"> <div class="sixteen wide field"> <label>IBAN</label> <div ref="iban"></div> </div> </div> <div class="fields"> <div class="sixteen wide field"> <div id="mandate-acceptance"> En fournissant vos informations de paiement et en confirmant ce paiement, vous autorisez (A) {site.name} et Stripe, notre prestataire de services de paiement et/ou PPRO, son prestataire de services local, à envoyer des instructions à votre banque pour débiter votre compte et (B) votre banque à débiter votre compte conformément à ces instructions. Vous avez, entre autres, le droit de vous faire rembourser par votre banque selon les modalités et conditions du contrat conclu avec votre banque. La demande de remboursement doit être soumise dans un délai de 8 semaines à compter de la date à laquelle votre compte a été débité. Vos droits sont expliqués dans une déclaration disponible auprès de votre banque. Vous acceptez de recevoir des notifications des débits à venir dans les 2 jours précédant leur réalisation. </div> </div> </div> </div>','payment-stripe-debit .ui.form,[data-is="payment-stripe-debit"] .ui.form{ max-width: 600px; margin: 2em auto; } payment-stripe-debit .ui.form .field input::placeholder,[data-is="payment-stripe-debit"] .ui.form .field input::placeholder{ color: #333; } payment-stripe-debit .StripeElement,[data-is="payment-stripe-debit"] .StripeElement{ padding: 0.7em 1em; border: 1px solid #dedede; border-radius: 0.3rem; background: #fff; } payment-stripe-debit .StripeElement--focus,[data-is="payment-stripe-debit"] .StripeElement--focus{ border: 1px solid #85b7d9; } payment-stripe-debit .StripeElement--invalid,[data-is="payment-stripe-debit"] .StripeElement--invalid{ background-color: #fff6f6; border-color: #e0b4b4; }',"",function(opts){this.on("mount",function(){UI.require("https://js.stripe.com/v3/",this.init)}),this.init=function(){this.stripe=Stripe(opts.config.identifier);var elements=this.stripe.elements();this.card={iban:elements.create("iban",{supportedCountries:["SEPA"],placeholderCountry:"FR"})},this.card.iban.mount(this.refs.iban),["iban"].forEach(function(type){this.card[type].addEventListener("change",function(e){this.trigger("error",e.error?e.error.message:null)}.bind(this))},this),this.request({method:"GET",url:"/s/site/",success:function(res){this.site=res.site,this.update()}})}.bind(this),this.authorize=function(){this.transaction?this.process():/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this.refs.email.value)?0!==this.refs.name.value.trim().length?(UI.getUser(),this.request({method:"POST",url:"/c/payment/"+opts.payment+"/transaction",data:{amount:opts.amount,customer:this.refs.name.value},success:function(res){this.transaction=res.transaction,this.process()},error:function(res){this.trigger("error",res&&res.error&&res.error.message)}})):this.trigger("error","Veuillez renseigner un nom"):this.trigger("error","Veuillez indiquer une adresse e-mail valide")}.bind(this),this.process=function(){UI.getUser();this.stripe.confirmSepaDebitPayment(this.transaction.secret,{payment_method:{sepa_debit:this.card.iban,billing_details:{name:this.refs.name.value,email:this.refs.email.value}},setup_future_usage:"off_session"}).then(function(data){data.paymentIntent&&"processing"===data.paymentIntent.status?this.trigger("done",this.transaction):this.trigger("error",data.error?data.error.message:data.paymentIntent.status)}.bind(this))}.bind(this)}),riot.tag2("payment-stripe",'<div class="ui form"> <div class="fields"> <div class="eight wide field"> <label>Numéro de carte</label> <div ref="number"></div> </div> <div class="four wide field"> <label>Date d\'expiration</label> <div ref="expiry"></div> </div> <div class="four wide field"> <label>Cryptogramme</label> <div ref="cvc"></div> </div> </div> </div>','payment-stripe .ui.form,[data-is="payment-stripe"] .ui.form{ max-width: 600px; margin: 2em auto; } payment-stripe .ui.form .field input::placeholder,[data-is="payment-stripe"] .ui.form .field input::placeholder{ color: #333; } payment-stripe .StripeElement,[data-is="payment-stripe"] .StripeElement{ padding: 0.7em 1em; border: 1px solid #dedede; border-radius: 0.3rem; background: #fff; } payment-stripe .StripeElement--focus,[data-is="payment-stripe"] .StripeElement--focus{ border: 1px solid #85b7d9; } payment-stripe .StripeElement--invalid,[data-is="payment-stripe"] .StripeElement--invalid{ background-color: #fff6f6;
2 border-color: #e0b4b4; }',"",function(opts){this.on("mount",function(){UI.require("https://js.stripe.com/v3/",this.init)}),this.init=function(){this.stripe=Stripe(opts.config.identifier);var elements=this.stripe.elements();this.card={number:elements.create("cardNumber"),expiry:elements.create("cardExpiry"),cvc:elements.create("cardCvc")},this.card.number.mount(this.refs.number),this.card.expiry.mount(this.refs.expiry),this.card.cvc.mount(this.refs.cvc),["number","expiry","cvc"].forEach(function(type){this.card[type].addEventListener("change",function(e){this.trigger("error",e.error?e.error.message:null)}.bind(this))},this)}.bind(this),this.authorize=function(){var user;this.transaction?this.process():(user=UI.getUser(),this.request({method:"POST",url:"/c/payment/"+opts.payment+"/transaction",data:{amount:opts.amount,customer:user?user.name:opts.customer||null},success:function(res){this.transaction=res.transaction,this.process()},error:function(res){this.trigger("error",res&&res.error&&res.error.message)}}))}.bind(this),this.process=function(){var user=UI.getUser();this.stripe.confirmCardPayment(this.transaction.secret,{payment_method:{card:this.card.number,billing_details:{name:user?user.name:opts.customer||null}}}).then(function(data){data.paymentIntent&&"requires_capture"===data.paymentIntent.status?this.trigger("done",this.transaction):this.trigger("error",data.error?data.error.message:data.paymentIntent.status)}.bind(this))}.bind(this)}),riot.tag2("social-twitter",'<blockquote if="{opts.widget === \'tweet\'}" ref="widget" class="twitter-tweet"> <a href="{opts.url}">{opts.url}</a> </blockquote> <a if="{opts.widget !== \'tweet\'}" ref="widget" class="twitter-{opts.widget}" href="{opts.url}"> {opts.url} </a>','social-twitter .twitter-tweet,[data-is="social-twitter"] .twitter-tweet{ margin: 0; }',"",function(opts){this.on("mount",function(){this.init()}),this.init=function(){for(var key in opts)0===key.indexOf("data")&&this.refs.widget.setAttribute(key.replace(/[A-Z]/g,"-$&").toLowerCase(),opts[key]);UI.require({url:"https://platform.twitter.com/widgets.js",attributes:{async:!0,charset:"utf-8"}},this.load)}.bind(this),this.load=function(){twttr.widgets.load(this.root)}.bind(this)});
3riot.tag2("x-134","","","",function(opts){}),riot.tag2("x-119",'<a class="twitter-timeline" data-lang="fr" data-width="500" data-height="400" href="https://twitter.com/AssoELLyE?ref_src=twsrc%5Etfw">Tweets by AssoELLyE</a>',"","",function(opts){this.on("mount",function(){UI.require("https://platform.twitter.com/widgets.js")})}),riot.tag2("x-135","","","",function(opts){this.on("mount",function(){this.init()}),this.init=function(){$(".logoactushare img").each(function(){var linkImage=$(this).prop("src");$("head").append('<meta property="og:image" content="'+linkImage+'"/> ')})}.bind(this)}),riot.tag2("x-120",'<iframe src="https://www.facebook.com/plugins/page.php?href=http%3A%2F%2Fwww.facebook.com%2FLeucemieLymphomesespoir&tabs=timeline&width=500&height=400&small_header=true&adapt_container_width=false&hide_cover=false&show_facepile=false&appId" width="500" height="400" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share"></iframe>',"","",function(opts){}),riot.tag2("x-287",'<iframe src="https://shaketonpolitique.org/interpellations/interpellation-omnibus-ue/widget/ellye/" width="100%" height="1000"></iframe>',"","",function(opts){this.on("mount",function(){"undefined"!=typeof window&&(UI.require("https://shaketonpolitique.org/wp-content/themes/shaketonpolitique/js/vendor/iframeResizer.min.js"),UI.require("https://shaketonpolitique.org/wp-content/themes/shaketonpolitique/js/vendor/iframeResizer.contentWindow.min.js"))})}),riot.tag2("x-66",'<ul id="zoom_triggers"> <li><a id="zoom_in">A+</a></li> <li><a id="zoom_out">A-</a></li> <li><a id="zoom_reset">A</a></li> </ul>',"","",function(opts){jQuery(document).ready(function($){var zoom_level=100;function zoom_page(step,trigger){120<=zoom_level&&0<step||zoom_level<=80&&step<0||(0==step?zoom_level=100:zoom_level+=step,$("div.container").css({transform:"scale("+zoom_level/100+")",transformOrigin:"50% 0"}),100<zoom_level?$("div.container").css({width:1.2*zoom_level+"%"}):$("div.container").css({width:"100%"}),120<=zoom_level||zoom_level<=80?trigger.addClass("disabled"):trigger.parents("ul").find(".disabled").removeClass("disabled"),100!=zoom_level?$("#zoom_reset").removeClass("disabled"):$("#zoom_reset").addClass("disabled"))}$("#zoom_in").click(function(){zoom_page(10,$(this))}),$("#zoom_out").click(function(){zoom_page(-10,$(this))}),$("#zoom_reset").click(function(){zoom_page(0,$(this))})})}),riot.tag2("x-74",'<div id="fb-root"></div> <div class="fb-page" data-href="https://www.facebook.com/LeucemieLymphomesespoir" data-tabs="timeline" data-width="555" data-height="400px" data-small-header="true" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="true"> <blockquote cite="https://www.facebook.com/LeucemieLymphomesespoir" class="fb-xfbml-parse-ignore"> <a href="https://www.facebook.com/LeucemieLymphomesespoir">ELLyE - Ensemble Leucemie Lymphomes Espoir</a> </blockquote> </div>',"","",function(opts){this.on("mount",function(){UI.require("https://connect.facebook.net/fr_FR/sdk.js#xfbml=1&version=v13.0")})}),riot.tag2("x-81",'<div class="popup" id="OpenmyPopup"> <h3 class="text-center"> Permanence téléphonique </h3> <img alt="ecoute-COUL.png" src="/f/6f459ebdfb5ad991b8864c3542c4f085daff097f/ecoute-COUL.png" width="130" height="138"> <span class="popuptext" id="myPopup">01 42 38 54 66 <br> Mardi - Jeudi (10h-17h)</span> </div>','x-81 .popup,[data-is="x-81"] .popup{ position: relative; display: inline-block; cursor: pointer; } x-81 #OpenmyPopup,[data-is="x-81"] #OpenmyPopup{ text-align: center; width: 100%; } x-81 .popup .popuptext,[data-is="x-81"] .popup .popuptext{ visibility: hidden; width: 160px; background-color: #214289; color: #fff; text-align: center; border-radius: 6px; padding: 2%; position: absolute; z-index: 1; bottom: 125%; left: 50%; margin-left: -80px; } x-81 .popup .popuptext::after,[data-is="x-81"] .popup .popuptext::after{ content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: #214289 transparent transparent transparent; } x-81 .popup .show,[data-is="x-81"] .popup .show{ visibility: visible; -webkit-animation: fadeIn 1s; animation: fadeIn 1s } @-webkit-keyframes fadeIn { from {opacity: 0;} to {opacity: 1;} } @keyframes fadeIn { from {opacity: 0;} to {opacity:1 ;} }',"",function(opts){jQuery(document).ready(function($){$("#OpenmyPopup").click(function(){document.getElementById("myPopup").classList.toggle("show")})})}),riot.tag2("x-93",'<div class="wpb_wrapper"> <div class="wpb_text_column wpb_content_element "> <div class="wpb_wrapper"> <span id="frjstip"></span> <div id="mapwrapper"> <div id="mapbase"> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 600 670" xml:space="preserve"> <g> <path id="frjs1" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M578.268,138.658c-4.523-2.16-5.729-2.692-8.846-0.94c-1.22,0.705-4.539,0.235-5.603,0.063c-0.221-0.031-0.346-0.063-0.346-0.063c-10.364-0.531-2.755-6.183-10.021-7.373c-2.974-0.47-0.938,5.464-11.646,4.134c-10.567-1.3-0.642-3.931-9.44-5.15c-3.412-0.486-5.166-0.894-7.075,1.909c-1.91,2.803-6.48-6.48-9.285-8.703c-2.801-2.208,2.349-6.874-8.563-8.69c-6.685-1.127-5.196-4.336-14.293,0.878c-8.078,4.634-5.104-10.021-25.206-2.803c-3.709,1.33-1.235-6.435-9.141-7.218c1.565-1.425,1.471-3.836-2.067-3.537c-3.539,0.298-10.692-6.481-14.591-8.407c-6.591-3.241-0.046-6.388-4.868-9.143c-5.418-3.101,2.896-4.368-0.596-7.655c-1.675-1.582,4.57-4.775,1.331-6.497c-3.898-2.067-3.68,3.977-6.342,5.761c-2.645,1.753-1.174,6.482-4.712,7.358c-5.212,0.298-3.929,3.74-8.54
36,1.926c-3.883-1.879-5.574-0.595-7.61-1.003c-0.844,5.966,2.834,5.574,1.504,8.956c-1.316,3.397,2.113,5.009-0.782,7.075c-2.896,2.067-4.479,4.947-8.345,6.779c-1.974,0.938,3.93,4.478,2.943,6.638c-1.159,2.552,0.876,14.449-1.927,12.54c-2.787-1.927-6.621-6.199-8.984-1.927c-2.365,4.274-7.906,0.988-7.077,4.134c0.83,3.146-2.206,3.679,0,5.605c2.207,1.909,6.043,2.504,4.134,4.571c-1.927,2.065-6.044-1.927-6.34,0c-0.298,1.909,2.69,2.504,0,4.413c-2.709,1.927,4.069,4.822,0.595,7.672c-2.114,1.722-5.168,5.01-7.093,8.548c0.938,5.855-1.222,3.131-1.174,7.218c0.156,11.114,5.369,4.821,5.604,8.108c0.297,4.07-7.594-2.348-5.667,16.767c13.353,3.681,5.729,11.757,7.389,12.822c1.676,1.08,3.444-0.782,4.618,0.392c1.175,1.175-1.565,2.16,0,2.66c1.566,0.486,3.445-1.674,6.295,3.931c2.174,4.289-1.771,2.943,0.577,4.915c2.365,1.957,3.148-0.296,3.741,0.878c0.595,1.174-3.741,2.849-0.688,3.834c3.053,0.986,8.641,0.894,10.316-0.391c1.676-1.283,3.352-1.175,5.996-0.595c2.662,0.595,11.303,0.298,12.289-1.675c0.985-1.957,5.902-4.807,8.752-3.241c2.85,1.581,4.915-2.207,5.104,3.054c0.203,5.259,7.123,8.249,5.604,10.911c-0.877,1.533,1.079,5.793,3.146,5.494c2.067-0.281,1.174,3.773,4.915,2.851c6.576-1.613,1.864,10.771,13.073,2.458c-2.271-2.944-1.081-3.82,2.05-3.633c3.962,0.861,3.603-4.071,5.512-2.16c1.909,1.909,3.35,1.769,3.836-1.377c0.484-3.148-1.801-6.654,4.414-8.455c3.961-1.144,2.958-6.011,1.284-7.672c11.146-0.046,6.308-5.196,10.222-5.307c7.891-0.188,3.429,2.396,7.172,4.228c3.756,1.847,6.057-3.898,11.303,1.079c5.243,4.995,5.369-3.239,9.143,1.583c1.785,2.269,5.15,0.845,8.061,5.103c0.737,1.597,10.507,5.276,9.145,10.724c-1.362,5.386,6.293,4.947,5.715,10.928c4.602,2.161-0.392,3.773,6.026,4.306c8.469,0.705,6.12-4.368,8.25-4.822c3.241-0.689,2.02-3.726,4.227-4.807c4.022-1.972-5.448-4.477-1.769-12.195c2.865-5.996-1.613-10.911,2.849-15.718c3.147-3.382-5.746-6.34-0.688-13.275c3.397-4.65,1.222-7.922,2.662-9.236c2.896-2.662-2.162-5.307,2.348-10.912c4.539-5.604-2.004-7.421,5.025-16.313c1.207-1.55,3.036-6.653,5.104-6.686c3.977-0.046,4.228-8.046,6.091-10.801C589.164,140.724,582.776,140.818,578.268,138.658z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs2" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M335.44,380.61c3.896,5.323-1.896,3.412-0.298,8.03c1.596,4.619-5.246-3.193-5.246,1.613c0,4.822-0.688,5.683-3.302,7.67c-6.325,4.822-0.815,7.374-2.521,8.705c-1.69,1.315-6.45,7.218-4.634,10.161c1.816,2.958,0.392,3.882-2.065,3.318c-5.386-1.236-4.274,3.522-6.937,1.032c-2.645-2.474-3.914,3.43-6.402,0.267c-8.094-10.27-14.715-7.076-16.517-5.495c-5.824,5.104,1.002,11.741-3.1,13.417c-4.101,1.676-3.382,6.639-5.966,7.437c-2.582,0.813-12.601,11.804-12.163,14.966c0.438,3.179,2.287,7.077-0.438,7.232c-2.725,0.141-7.155-0.454-5.825,2.286c1.33,2.725,4.228,6.904,1.395,8.03c-2.819,1.129,0.171,5.903-3.32,5.605c-3.474-0.297-8.782,8.048-10.975,5.01c-2.19-3.053-3.756-0.392-7.67-0.517c-3.898-0.126-6.404,6.482-10.395,3.836c-3.978-2.662-8.908,1.096-8.549,2.942c0.376,1.847-1.175,3.977-3.24,1.252c-2.066-2.723-2.725-0.876-5.088-0.296c-2.365,0.595-6.701,0.891-4.132,5.01c2.582,4.133-2.506,12.241-2.805,14.668c-0.281,2.442,0.205,3.727,2.443,3.539c4.477-0.361,7.265,3.756,5.604,8.484c-1.675,4.712,6.731,2.896,3.318,8.767c-1.832,3.131,0.391,3.319-1.549,4.869c-13.965,11.084-5.025,11.272-8.628,13.119c-7.121,3.633-3.021,5.433-5.603,7.515c-2.584,2.098-2.114,3.772-1.801,5.823l-0.032,0.032c-0.062-0.095-0.141-0.204-0.202-0.313c-3.444,5.589-5.308-0.986-8.063,1.472c-2.755,2.457-4.18,4.414-4.916-0.298c-0.438-2.803-7.217-1.972-6.479-8.359c0.468-4.133-2.834,2.958-8.361-1.378c-5.01-3.929-7.419,0.846-10.816-4.023c-1.989-2.881-7.265-1.973-7.077-5.604
3c0.203-3.633-2.536,7.451-7.953,2.363c-4.227-3.992,3.445-3.741,2.552-8.751c-0.406-2.349,2.96-5.604-1.079-6.982c-9.583-3.239-7.077,4.431-9.833,0.893c-2.74-3.537-11.584-4.431-5.495-9.143c6.091-4.713,12.181-4.618,14.45-14.247c2.254-9.644,12.384-61.821,14.842-64.279c2.457-2.459,3.24-3.006,7.076-3.054c5.448-0.047-0.016-4.102-1.676-6.089c-3.006-3.585-4.541,7.107-6.685,6.199c-1.284-0.549,0.297-3.601,0.595-10.817c0.204-5.151,4.931-28.18,4.806-31.451c-0.438-11.554,4.039-19.945,6.106-19.256c2.052,0.673-0.939,2.988,1.472,4.805c2.723,2.067,11.397,11.397,11.397,16.031c0,4.619,3.49,5.011,2.254,11.397c-0.627,3.272,3.742,8.25,7.765,8.845c4.039,0.579,4.619-1.878,2.271-4.133c-2.349-2.238-5.323,0.141-7.045-19.052c-0.016-0.095-0.016-0.204-0.03-0.313c-0.848-9.424-6.89-13.762-10.334-16.22c-3.429-2.441-1.69-4.509-9.533-7.748c-8.047-3.352-4.619-8.956,0-8.658c-2.442-3.146,5.245-3.71,2.456-9.142c-2.112-4.117,4.385-3.068,0.11-5.996c-6.042-4.135-0.203-5.417-4.226-8.548c-5.418-4.197,6.84-5.371,1.925-10.161c1.157-2.661,3.788-2.129,6.137-2.707c2.349-0.597,2.803,4.055,6.779,1.909c3.977-2.13,4.196-2.13,4.117,0.517c-0.063,2.662,9.814-1.69,10.331-3.46c0.518-1.769-6.794-0.674-2.504-9.519c2.303-4.759-2.911-9.205-1.706-13.261c1.205-4.055-3.804-0.515-2.725-5.166c1.079-4.634-6.042-3.412-4.351-8.407c1.706-4.978-1.771-5.447-1.691-6.559c0.076-1.096,8.029,0.297,11.351,1.189c3.317,0.878-1.691-6.559,4.272-4.431c5.964,2.146,0.892-1.831,11.351-1.831c2.145,0,7.153-1.111,6.043,1.393c-1.096,2.506,1.847,2.506,3.317,0.893c1.473-1.628-0.358-6.45,5.746-5.683c7.844,7.843,11.289,4.353,10.771,9.958c-0.517,5.588,6.122,7.592,9.504,5.588c3.396-1.988,2.065-6.137,7.67-2.129s0.454,6.215,3.163,8.548c10.552,9.11,4.133,13.636,6.935,15.844c2.803,2.223,11.616,5.901,12.821,14.23c2.396,3.068,4.054-1.849,8.188,1.33c4.134,3.163,5.886-5.62,9.503-2.286c3.615,3.335,6.418-5.808,10.911-2.426c4.493,3.366,18.724,1.393,20.57,1.987c2.694,9.973,9.832,8.048,12.384,12.744s-3.021,6.262,1.252,11.21c7.155,8.281-11.006,13.869-5.745,19.459C343.659,376.493,331.526,375.271,335.44,380.61z M161.76,356.861c0.813,2.88,2.286,0.75,2.74-0.58c0.438-1.33,0.219-7.827-6.794-11.804c-0.612-0.344-1.551-2.833-2.13,0.595C154.168,353.354,160.962,353.996,161.76,356.861z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs3" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M547.896,372.266c0.438-2.803-0.783-4.807-4.038-5.698c-3.241-0.877-7.077-1.472-6.184-7.953c0.547-4.039,8.452-3.053,10.612-9.237c1.521-4.353-8.062-5.65-6.98-11.006c0.783-3.851-7.813-0.891-3.241-10.033c2.035-4.071-2.709-3.821-2.255-8.736c0.203-2.285-10.081-1.457-11.693-1.582c-2.615-0.187-5.949,7.232-8.752,4.134c-1.221-1.347-3.742,1.174-3.539,3.146c0.188,1.957-4.132,3.334-4.039,4.807c0.11,1.487-1.408,1.596-2.254,0.986c-3.1-2.255-0.845-4.854-2.207-6.388c-2.05-2.285,0.86-4.446,0.188-6.106c-6.575-1.126-5.245,6.091-8.344,9.223c-6.263,6.34-12.354-7.515-15.484,0c-3.131,7.529-7.105,2.331-6.71
35-0.878c0.407-3.209-3.163-0.548-2.724-3.397c0.359-2.223-2.178-3.991-3.272-4.648c-0.017,0-0.017-0.016-0.017-0.016c-0.171-0.048-0.327-0.141-0.484-0.267c-9.566-8.11-9.488,0.234-12.587-2.661c-3.099-2.897-6.982,1.769-5.698,4.133c1.268,2.363-3.444,8.657-3.053,10.817s-1.222,8.939-4.915,5.495c-3.681-3.444,0.688-5.996-1.473-6.779c-2.16-0.782-2.817,2.85-8.846,1.081c-6.01-1.769-2.801,9.627-11.303,7.278c-3.412-0.953-7.655-1.267-10.224,0.096c-2.552,1.377-8.735-4.04-5.996-6.779c2.757-2.755,4.729-1.722,3.054-5.417c-1.676-3.678,2.255-6.967-3.741-8.938c-5.996-1.973-8.392-2.16-9.534-8.846c-2.396-14.198-8.938,2.756-11.304-3.24c-2.349-5.996-1.91,1.815-6.276-1.174c-4.385-3.006-3.931,4.509-7.375,0.484c-3.444-4.023-8.267-3.334-7.373-7.075c-2.459-1.174-7.671,5.996-11.491,5.213c-3.836-0.799-0.986,3.037-4.634,2.457c-3.633-0.595-5.308,4.415-3.82,7.17c1.472,2.74,0.486,3.633-5.807,3.335c-6.294-0.297-8.299,7.186-8.299,7.186c2.694,9.973,9.832,8.048,12.384,12.744s-3.021,6.262,1.252,11.21c7.155,8.281-11.006,13.869-5.745,19.459c9.989,10.63-2.144,9.408,1.771,14.747c3.896,5.323-1.896,3.412-0.298,8.03c1.596,4.619-5.246-3.193-5.246,1.613c0,4.822-0.688,5.683-3.302,7.67c-6.325,4.822-0.815,7.374-2.521,8.705c-1.69,1.315-6.45,7.218-4.634,10.161c1.816,2.958,0.392,3.882-2.065,3.318c-0.549,6.669,4.76,10.739,3.679,13.119c-1.081,2.395-0.58,12.07,3.695,8.563c4.272-3.522,6.042,1.174,8.327-0.376c2.285-1.551,8.627-1.175,9.879-12.681c0.518-4.791,2.379-2.599,3.976-5.604c1.269-2.363,3.461,0,3.022,1.628c-0.438,1.629,1.769,1.987,2.584,2.208c0.813,0.219,5.181,2.707,3.896,6.935c-1.268,4.228,2.833,4.368,3.397,6.34c2.802-2.112,3.836-4.18,3.444-7.029c-0.392-2.849,3.632-10.864,6.575-8.156c2.958,2.693,1.676-4.915,4.915-4.226c3.241,0.688,3.931-2.192,5.417-0.721c3.131,3.132-2.02,8.72,6.184,9.8c4.072,0.532,0.158-6.527,5.903-4.947c2.63,0.721-0.205,3.476,3.631,3.633c3.836,0.141,5.793,4.915,8.751,5.15c-2.614,16.125,7.906,18.426,7.437,23.514c-0.454,5.088,1.63,4.79,3.695,5.025c2.065,0.219,6.043,4.039,8.688,1.393c2.661-2.645,4.556,2.255,6.794-1.174c2.225-3.443,8.376,4.071,9.425,2.099c5.525-10.317,6.325,5.666,11.288,2.098c1.956-1.409,5.307-3.022,1.831-4.274c-3.46-1.252-0.298-8.5,3.319-7.732c0.61,0.125,3.49-0.299,1.471,4.493c-2.005,4.79,7.641,1.596,7.077,4.79c-1.471,8.344,8.751,0.876,10.552,5.01c5.134,12.038,5.917-1.973,11.411,1.471c5.512,3.444,4.212-1.611,3.477-3.977c-0.737-2.363-6.121-8.767-10.833-9.439c-4.728-0.657,1.957-3.726,0.735-6.638c-1.237-2.896,6.684,1.487,4.931-4.274c-1.11-3.694,3.413-2.505,2.583-6.7c-0.83-4.196,8.063-0.423,6.857-5.088c-1.205-4.666,5.135-0.893,6.34-5.824c1.206-4.931,5.574-0.126,7.954-4.649c1.456-2.739,9.564,1.425,10.771-2.943c1.205-4.367-0.594-6.778-3.398-8.03c-2.801-1.253-3.099-8.109,0.517-7.969c3.618,0.156,5.465,3.099,7.515,1.784c1.989-1.284,5.715-2.645,7.875-1.252c-0.016-0.048,0-0.095,0-0.157c0.095-1.581,2.24-4.085,3.539-3.162c2.85,2.082,2.395-2.536,5.401-0.673c1.471,0.924,3.928,0.892,3.413-1.377c-0.532-2.255,7.295-4.322,10.05-5.604c2.755-1.27-1.128-3.931,1.676-9.927C558.48,381.455,546.519,381.017,547.896,372.266z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs4" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M541.463,233.012c1.362-5.447-8.407-9.127-9.145-10.724c-2.91-4.258-6.275-2.834-8.061-5.103c-3.773-4.822-3.899,3.412-9.143-1.583c-5.246-4.978-7.547,0.768-11.303-1.079c-3.743-1.831,0.719-4.415-7.172-4.228c-3.914,0.11,0.925,5.261-10.222,5.307c1.674,1.661,2.677,6.528-1.284,7.672c-6.215,1.801-3.93,5.307-4.414,8.455c-0.486,3.146-1.927,3.286-3.836,1.377c-1.909-1.911-1.55,3.021-5.512,2.16c-3.131-0.188-4.32,0.688-2.05,3.633c-11.209,8.313-6.497-4.071-13.073-2.458c-3.741,0.923-2.848-3.132-4.915-2.851c-2.067,0.299-4.023-3.961-3.146-5.494c1.519-2.662-5.401-5.652-5.604-10.911c-0.188-5.261-2.254-1.473-5.104-3.054c-2.85-1.565-7.767,1.284-8.752,3.241c-0.986,1.973-9.627,2.27-12.289,1.675c-2.645-0.58-4.32-0.688-5.996,0.595c-1.676,1.284-7.264,1.377-10.316,0.391c-3.054-0.985,1.282-2.66,0.688-3.834c-0.593-1.174-1.376,1.079-3.741-0.878c-2.348-1.972,1.597-0.626-0.577-4.915c-2.85-5.604-4.729-3.444-6.295-3.931c-1.565-0.5,1.175-1.485,0-2.66c-1.174-1.
3174-2.942,0.688-4.618-0.392c-1.66-1.065,5.964-9.142-7.389-12.822c-0.188-0.063-0.392-0.109-0.58-0.155c-7.263-2.067-12.087,1.189-15.123,2.661c-3.053,1.471-4.729,9.831-6.104,11.396c6.888,3.396,1.722,9.44,6.59,11.397c4.869,1.972-5.651,5.072-3.24,11.601c1.44,3.929-10.692,2.441-2.271,13.369c3.146,4.07-9.581,4.477-2.348,12.086c2.488,2.63-4.979,6.34,1.565,11.209c4.618,3.444,0.203,4.416,2.457,6.388c2.255,1.973-2.019,5.901,1.863,8.548c3.883,2.662-0.484,3.146,1.769,5.104c2.271,1.972-1.909,5.072,0.502,7.28c2.411,2.207-2.552,1.862-3.444,5.604c-0.894,3.741,3.929,3.052,7.373,7.075c3.444,4.024,2.99-3.49,7.375-0.484c4.366,2.989,3.928-4.822,6.276,1.174c2.365,5.996,8.908-10.958,11.304,3.24c1.143,6.686,3.538,6.873,9.534,8.846c5.996,1.972,2.065,5.261,3.741,8.938c1.676,3.695-0.297,2.662-3.054,5.417c-2.739,2.739,3.444,8.156,5.996,6.779c2.568-1.362,6.812-1.049,10.224-0.096c8.502,2.349,5.293-9.047,11.303-7.278c6.028,1.769,6.686-1.863,8.846-1.081c2.16,0.783-2.208,3.335,1.473,6.779c3.693,3.444,5.307-3.335,4.915-5.495s4.32-8.454,3.053-10.817c-1.284-2.364,2.6-7.03,5.698-4.133c3.099,2.896,3.021-5.449,12.587,2.661c0,0,0.188,0.094,0.484,0.267c0,0,0,0.016,0.017,0.016c1.095,0.657,3.632,2.426,3.272,4.648c-0.439,2.85,3.131,0.188,2.724,3.397c-0.391,3.209,3.584,8.407,6.715,0.878c3.131-7.515,9.222,6.34,15.484,0c3.099-3.132,1.769-10.349,8.344-9.223c-0.031-0.093-0.077-0.188-0.141-0.281c-2.364-3.444,2.254-3.788,1.378-9.44c-0.72-4.571,15.969-11.882,13.761-16.609c-1.393-2.942,1.91-3.382-0.296-6.091c-1.975-2.411,1.674-6.151,3.631-6.183c5.464-0.109,8.234-9.393,10.817-9.644c5.104-0.486,3.679-6.217,5.495-6.874c4.618-1.674,2.16-5.65,5.699-7.968c2.332-1.519-1.565-2.74-6.184-2.254c-4.619,0.484,5.994-9.738,9.235-9.44c0.093,0.048,0.188,0.078,0.268,0.125C547.756,237.959,540.101,238.397,541.463,233.012z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs5" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M112.603,247.556c-1.862-2.254,10.912-3.741,0.391-5.307c-10.52-1.565-16.859,3.538-18.175-0.595c-1.706-5.309,13.463-1.957,8.047-6.575c-5.401-4.634-8.094,1.957-11.192-0.986c-3.101-2.96-0.205,6.277-3.838,2.85c-3.631-3.444-0.938,11.318-5.604,5.791c-1.973-2.331,0.689-8.641-2.363-11.303c-3.037-2.646-5.104-0.735-5.307-4.618c-0.188-3.882-2.74,1.189-4.022,0c-1.284-1.174-5.403-4.32-9.927-5.104c-4.524-0.782-1.581-3.444-3.24-4.039c-1.675-0.579-4.229,3.444-7.28,1.487c-3.036-1.972,0.392-5.604-1.771-6.497c-2.158-0.876-4.115,3.444-5.791,2.458s-1.926-5.15-5.01-2.255c-3.099,2.897,2.396,6.528-4.729,5.888c-4.039-0.361-4.32-0.579-3.239-4.228c1.08-3.633-3.632-9.925-5.903-11.194c-2.254-1.282-3.131,3.038-5.791,0.299c-2.646-2.755-5.309-4.228,0.093-3.946c5.417,0.298,8.563-3.239,12.775-2.254c4.228,0.986-0.484-11.006-4.228-8.454c-3.726,2.552-5.448,5.855-4.712,0.203c0.392-3.036-2.458-5.01,0.502-5.604c2.941-0.595,1.957,3.053,6.965,2.757c5.01-0.299,8.892,1.268,6.106-3.444c-1.754-2.943-5.118,0.296-6.199-1.081c-1.081-1.378,5.15-4.133,3.444-4.915c-5.464-2.506-10.865,7.467-14.544,3.632c-2.035-2.099-6.545,4.133-4.729-1.472c1.144-3.522,3.053-6.731,0.392-8.063c-2.364-1.174,2.96-6.574,8.266-5.399c5.307,1.174,0.392-4.917,5.605-3.054c5.196,1.879,6.686-4.493,8.046-1.362c2.317,5.244,6.106-4.618,9.44-1.58c3.335,3.051,6.263-3.695,6.48,0.093c0.346,5.903,4.729,3.257,5.715,0.595c0.971-2.661,10.708,6.044,12.273-0.392c0.956-3.913-0.577-8.641,2.568-7.765c3.132,0.878,0.97,5.058,9.926,0c3.287-1.862,0.969,2.897,6.388-1.377c3.35-2.646,2.599,1.236,1.565,2.551c-3.681,4.729,5.197-0.376,3.834,3.352c-1.627,4.414,2.897,0.532,3.728,4.617c0.532,2.552,8.344,17.19,11.209,14.06c8.36-9.143,12.194-7.186,13.573-8.455c1.36-1.282,0.783,4.525,4.022,2.646c3.241-1.863,1.096,5.542,4.807,1.769c3.646-3.678,8.016,6.09,7.092-0.093c-0.549-3.602,0.985-4.807,3.93-5.214c7.953-1.08-5.95,6.388,7.562,4.822c6.98-0.814,4.821,0.297,7.858,0c0.079,0,0.155-0.017,0.235-0.017l0.015,0.313c-2.896,2.301-0.595,10.662,3.241,9.157c3.835-1.503,4.273,2.882,6.263,0.659c1.987-2.208,6.465-5.542,11.068-0.143c0,0-1.316,1.786,0.517,6.671c1.815,4.885-6.153,5.276-3.039,9.987c3.131,4.728-0.844,7.171,2.663,10.177c3.507,2.99,1.002,6.042-1.314,6.699c-2.303,0.674-5.105,2.225-6.577,5.526c-1.471,3.319-1.908,9.456-6.121,7.311c-4.211-2.145-6.56-5.181-8.547-1.487c-1.989,3.711-7.295-0.141-6.778,2.74c0.517,2.864-1.034,2.864-3.617,2.944c-2.567,0.078-12.227,1.252-13.119,3.46c-0.876,2.223-4.228,12.21-8.251,9.581c-4.022-2.632-1.815,5.775-11.396,3.475l-0.015,0.016C112.774,247.775,112.697,247.666,112.603,247.556z M79.867,255.069c1.706-0.515,3.537,2.286,4.212,0.377c0.657-1.925-4.995-6.747-6.561-5.901C74.342,251.235,78.176,255.587,79.867,255.069z" cursor="pointer"></path> <path id="frjs6" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M277.279,163.973c1.316,1.471,7.952,2.254,8.173,0.359c0.517-4.477,4.742-2.833,3.977-6.48c-0.47-2.316,1.314-4.728,3.271-4.649c0.643,4.523,5.072,3.193,3.647,11.005c-0.549,3.085,3.335,2.661,1.754,6.497c-0.813,2.004,0.203,2.443,1.973,4.619c1.77,2.16,4.478,10.098,7.467,10.801c7.327,1.723,3.445,9.973,8.454,10.318c3.146,0.219,5.512,0.108,6.388-1.473c0.893-1.565,0.782,0,3.539-0.188c2.755-0.204,4.727-0.939,8.939,2.551c4.226,3.492,2.66,6.686,0.796,7.562c-1.877,0.894-1.079,3.492,3.148,2.459c4.21-1.033,8.251,5.056,9.628,1.377c1.002-2.661,2.505,0.986,3.726-1.675c1.235-2.646,2.851-0.972,4.228-2.552c6.888,3.396,1.722,9.44,6.59,11.397c4.869,1.972-5.651,5.072-3.24,11.601c1.44,3.929-10.692,2.441-2.271,13.369c3.146,4.07-9.581,4.477-2.348,12.086c2.488,2.63-4.979,6.34,1.565,11.209c4.618,3.444,0.203,4.416,2.457,6.388c2.255,1.973-2.019,5.901,1.863,8.548c3.883,2.662-0.484,3.146,1.769,5.104c2.271,1.972-1.909,5.072,0.502,7.28c2.411,2.207-2.552,1.862-3.444,5.604c-2.459-1.174-7.671,5.996-11.491,5.213c-3.836-0.799-0.986,3.037-4.634,2.457c-3.633-0.595-5.308,4.415-3.82,7.17c1.472,2.74,0.486,3.633-5.807,3.335c-6.294-0.297-8.299,7.186-8.299,7.186c-1.847-0.595-16.077,1.379-20.57-1.987c-4.493-3.382-7.296,5.761-10.911,2.426c-3.617-3.334-5.369,5.449-9.503,2.286c-4.135-3.179-5.793,1.738-8.188-1.33c-1.205-8.329-10.019-12.008-12.821-14.23c-2.802-2.208,3.617-6.733-6.935-15.844c-2.709-2.333,2.441-4.54-3.163-8.548s-4.273,0.141-7.67,2.129c-3.382,2.004-10.021,0-9.504-5.588c0.518-5.605-2.928-2.115-10.771-9.958c2.929-4.54-0.859-8.876,3.256-10.316c4.104-1.455,1.144-8.141,4.055-9.879c2.897-1.752-0.593-8.031,1.535-9.283c2.145-1.252,4.947,3.256,7.232,1.909c2.286-1.346-1.031-4.195,0.219-5.009c1.254-0.814,3.587,2.332,7.813,0.359c4.228-1.972-0.735-4.571,2.944-5.307c3.694-0.736,4.68-9.879,7.67-12.007c3.006-2.146-0.438-11.727,1.849-12.979c2.284-1.254,1.251-3.898-0.893-5.526c0-0.595,1.189-2.067-0.878-5.011c-2.066-2.942,0-7.232,1.832-5.604c1.847,1.629,7.624-3.287,5.026-7.295c-2.615-4.008,4.226-3.225,1.095-4.728c-3.115-1.487-6.121-7.515-6.919-9.205c0,0,12.9-4.134,12.446-6.779C273.585,
3162.485,275.949,162.485,277.279,163.973z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs7" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M589.658,600.588c2.969,4.91-5.328,14.988-4.735,17.621c0.594,2.631,2.968,11.427-1.863,14.99c-4.828,3.561,2.714,3.049-0.511,4.991c-3.212,1.956-1.687,5.855-3.131,6.449c-1.443,0.595,1.523,3.805,0,4.736c-1.524,0.931-1.781-0.419-4.574-0.337c-2.792,0.08-2.456-1.525-2.63-3.307c-0.162-1.781-10.242-0.755-11.092-3.644c-0.849-2.872-6.099-3.386-3.306-5.246c2.794-1.864,5.587-4.063,3.387-4.157c-2.198-0.081-0.85-2.497-3.723-1.349c-2.89,1.146-6.437-2.077-3.981-2.969c2.456-0.89,0.042-4.276,2.281-5.073c2.254-0.81,1.024-4.829-1.606-3.399c-2.632,1.443-4.344,3.534-4.911-0.162c-0.243-1.619-1.7-2.335-0.852-3.225c1.621-1.687,2.038-4.317,3.981-4.223c1.957,0.079,1.403-4.115-1.862-4.076c-3.264,0.042-6.018-5.922-3.806-6.691c2.202-0.755,4.576-1.052,3.725-3.548c-0.849-2.51-2.968,0.377-3.306-2.295c-0.336-2.671-4.574-2.037-1.065-4.654c3.522-2.631,4.29,0.121,3.185-4.155c-1.106-4.277,1.687-1.943,2.456-5.088c0.755-3.13,2.158,1.403,3.724-1.43c1.565-2.847,8.729-1.957,9.74-4.236c1.012-2.293,7.286-6.099,9.15-3.818c1.858,2.293,2.534,1.956,3.048,0.257c0.513-1.687,2.4-2.618,1.013-3.563c-5.411-3.684-0.757-9.229-1.77-11.01c-1.023-1.78,2.876-6.179,5.073-2.536c1.525,2.509-1.349,5.842,1.362,8.216c2.714,2.375-2.185,11.387,0.596,13.291c4.654,3.226,0.93,6.691,3.979,8.136c3.049,1.443-2.118,4.493,1.268,7.287C592.29,595.163,586.704,595.676,589.658,600.588z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs8" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M378.257,165.727c0.156,11.114,5.369,4.821,5.604,8.108c0.297,4.07-7.594-2.348-5.667,16.767c-0.188-0.063-0.392-0.109-0.58-0.155c-7.263-2.067-12.087,1.189-15.123,2.661c-3.053,1.471-4.729,9.831-6.104,11.396c-1.377,1.58-2.992-0.094-4.228,2.552c-1.221,2.661-2.724-0.986-3.726,1.675c-1.377,3.679-5.418-2.41-9.628-1.377c-4.228,1.033-5.025-1.565-3.148-2.459c1.864-0.876,3.43-4.069-0.796-7.562c-4.213-3.49-6.185-2.755-8.939-2.551c-2.757,0.188-2.646-1.378-3.539,0.188c-0.876,1.581-3.241,1.691-6.388,1.473c-5.009-0.346-1.127-8.596-8.454-10.318c-2.989-0.703-5.697-8.641-7.467-10.801c-1.77-2.176-2.786-2.615-1.973-4.619c1.581-3.836-2.303-3.412-1.754-6.497c1.425-7.812-3.005-6.481-3.647-11.005c-0.329-2.349-2.677-1.033-3.538-5.104c-0.86-4.086,9.627-3.007,9.534-8.063c-0.093-5.058,2.599-2.678,3.239-6.982c7.845,9.315,17.066-1.503,20.603,4.195c3.54,5.715,4.651-3.444,8.988,1.66c6.418,7.514,8.624,0.141,12.681,3.977c2.88,2.723,9.722-2.286,12.82,1.174c3.101,3.476,7.326-3.883,8.705,0c3.601,10.254,7.953,6.496,9.143,9.878c1.174,3.397,2.646,4.117,4.556,4.571C380.369,164.364,378.209,161.64,378.257,165.727z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs9" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M443.021,474.197c-1.722-1.236-2.332-9.597-2.332-9.597c-1.049,1.973-7.2-5.542-9.425-2.099c-2.238,3.429-4.133-1.471-6.794,1.174c-2.646,2.646-6.623-1.174-8.688-1.393c-2.065-0.235-4.149,0.063-3.695-5.025c0.47-5.088-10.051-7.389-7.437-23.514c-2.958-0.235-4.915-5.01-8.751-5.15c-3.836-0.157-1.001-2.912-3.631-3.633c-5.745-1.58-1.831,5.479-5.903,4.947c-8.203-1.08-3.053-6.668-6.184-9.8c-1.486-1.472-2.176,1.408-5.417,0.721c-3.239-0.689-1.957,6.919-4.915,4.226c-2.943-2.708-6.967,5.308-6.575,8.156c0.392,2.85-0.643,4.917-3.444,7.029c-0.564-1.972-4.665-2.112-3.397-6.34c1.284-4.228-3.084-6.716-3.896-6.935c-0.815-0.221-3.022-0.579-2.584-2.208c0.438-1.628-1.754-3.991-3.022-1.628c-1.597,3.006-3.458,0.813-3.976,5.604c-1.252,11.506-7.594,11.13-9.879,12.681c-2.285,1.55-4.055-3.146-8.327,0.376c-4.275,3.507-4.776-6.169-3.695-8.563c1.081-2.38-4.228-6.45-3.679-13.119c-5.386-1.236-4.274,3.522-6.937,1.032c-2.645-2.474-3.914,3.43-6.402,0.267c-8.094-10.27-14.715-7.076-16.517-5.495c-5.824,5.104,1.002,11.741-3.1,13.417c-4.101,1.676-3.382,6.639-5.966,7.437c-2.582,0.813-12.601,11.804-12.163,14.966c0.438,3.179,2.287,7.077-0.438,7.232c-2.725,0.141-7.155-0.454-5.825,2.286c1.33,2.725,4.228,6.904,1.395,8.03c-2.819,1.129,0.171,5.903-3.32,5.605c-3.474-0.297-8.782,8.048-10.975,5.01c-2.19-3.053-3.756-0.392-7.67-0.517c-3.898-0.126-6.404,6.482-10.395,3.836c-3.978-2.662-8.908,1.096-8.549,2.942c0.376,1.847-1.175,3.977-3.24,1.252c-2.066-2.723-2.725-0.876-5.088-0.296c-2.3
365,0.595-6.701,0.891-4.132,5.01c2.582,4.133-2.506,12.241-2.805,14.668c-0.281,2.442,0.205,3.727,2.443,3.539c4.477-0.361,7.265,3.756,5.604,8.484c-1.675,4.712,6.731,2.896,3.318,8.767c-1.832,3.131,0.391,3.319-1.549,4.869c-13.965,11.084-5.025,11.272-8.628,13.119c-7.121,3.633-3.021,5.433-5.603,7.515c-2.584,2.098-2.114,3.772-1.801,5.823l-0.032,0.032c2.225,2.974,6.311-0.58,11.68,8.124c3.257,5.276,9.394-3.428,17.001,2.365c5.589,4.258,5.213-3.289,12.588,0.093c2.786,1.284,6.936,1.425,4.414-0.688c-2.943-2.49,4.431-4.322,2.567-6.874c-1.878-2.552,8.83-3.538,10.614,0c2.943,5.855,10.113-0.688,12.384,5.01c1.393,3.522,12.29-2.599,14.84,8.25c2.349-3.631,10.115-3.036,14.248,2.177c-0.018,0.063-0.048,0.141-0.048,0.203c-2.208,8.031,9.611,6.92,12.822,11.883c3.241,5.01,9.58-6.293,21.432-0.11c10.441,5.464,16.939-2.113,18.959-3.726c4.18-3.35,3.256,0.94,7.075-1.674c4.604-3.116,5.948,7.467,10.129,2.848c1.801-1.972-1.378-4.022-3.632-6.967c-2.27-2.958-1.723-20.242-1.189-22.512c0.939-3.93-5.057-3.992-0.971-6.199c3.852-2.083-2.912-4.07,1.362-5.887c3.021-1.284,2.364-2.16,5.604-5.808c3.256-3.633,10.772-9.19,14.059-7.858c5.605,2.254,10.021-6.796,13.762-9.237c6.184-4.039,0.579-6.231,4.134-8.548c7.358-4.821,3.209,1.205,7.264-0.109c9.346-2.991,3.304,6.497,12.68,5.024c0.063,0,0.126,0,0.203,0.018c-0.344-3.163,8.314-11.602,8.894-14.075c0.578-2.551,10.803-8.751,10.411-11.695c-0.391-2.958,7.467-7.467,8.266-9.627C451.335,481.18,444.744,475.417,443.021,474.197z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs10" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M412.307,92.46c1.33-3.382-2.348-2.99-1.504-8.956c-0.203-0.03-0.405-0.093-0.625-0.171c-0.735-0.329-1.91-1.191-2.364-1.895c-0.078-0.125-0.142-0.235-0.173-0.328c-0.219-0.737-0.923-2.115,1.33-4.275c5.261-3.396-4.821-1.721-0.437-9.581c2.41-2.942,2.942-5.307-1.471-5.01c-4.479,1.332-4.228-6.824-9.3-4.431c-5.058,2.411-3.977-1.658-6.922,0.893c-4.867,4.181-5.305-3.099-5.166-5.76c0.158-2.646-3.631-6.232-10.612-5.309c-6.982,0.94-7.374-9.862-6.482-10.316c0.877-0.438,2.944-2.6,0-3.271c-2.959-0.673,0-4.54-2.208-5.119c-2.223-0.595-8.421,1.722-11.208,4.414c-4.478,4.322-2.207-1.909-10.911-5.604c-1.676-0.721-3.241-1.973-2.804-6.481c0.595-5.949-2.113-2.364-3.239-11.209c-5.401,4.869-13.716,1.425-16.955,4.18c-3.241,2.757-7.969,2.067-11.897,2.365c-7.077,0.141-7.405,4.993-10.896,6.982c-5.996,3.38,2.441,5.243-0.597,8.438c-3.741,4.18,2.599,3.304-1.581,8.5c-3.036,2.755,2.459,9.488,0.392,12.055c-2.052,2.552,0.595,4.509-0.188,5.887c-0.063,0.095-0.123,0.203-0.188,0.298c-0.908,1.268-2.676,2.566,0.877,6.48c3.835,4.228,1.471,5.417-0.782,3.836c-2.271-1.565-6.607,3.663-8.658,8.063c-0.015,0.046-0.047,0.093-0.063,0.141l0.313,0.155c3.804,5.088,4.228,1.27,9.44,5.793c5.198,4.524,2.771,0.564,6.09,9.737c3.318,9.159-3.585,7.813-1.283,10.803c2.316,3.006-1.941,3.741,0.297,6.089c2.238,2.364-0.156,4.103,1.676,6.403c3.146,3.931-3.241,7.985-0.783,10.709c2.441,2.724-0.847,1.8-1.489,6.09c7.845,9.315,17.066-1.503,20.603,4.195c3.54,5.715,4.651-3.444,8.988,1.66c6.418,7.514,8.624,0.141,12.681,3.977c2.88,2.723,9.722-2.286,12.82,1.174c3.101,3.476,7.326-3.883,8.705,0c3.601,10.254,7.953,6.496,9.143,9.878c1.174,3.397,2.646,4.117,4.556,4.571c1.925-3.538,4.979-6.826,7.093-8.548c3.475-2.85-3.304-5.745-0.595-7.672c2.69-1.909-0.298-2.504,0-4.413c0.296-1.927,4.413,2.065,6.34,0c1.909-2.067-1.927-2.662-4.134-4.571c-2.206-1.927,0.83-2.459,0-5.605c-0.829-3.146,4.712,0.141,7.077-4.134c2.363-4.272,6.197,0,8.984,1.927c2.803,1.909,0.768-9.988,1.927-12.54c0.986-2.16-4.917-5.699-2.943-6.638c3.866-1.832,5.449-4.712,8.345-6.779C414.42,97.469,410.99,95.857,412.307,92.46z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs11" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M304.208,116.255c-1.832-2.301,0.563-4.039-1.676-6.403c-2.238-2.348,2.02-3.083-0.297-6.089c-2.302-2.99,4.602-1.644,1.283-10.803c-3.319-9.173-0.892-5.213-6.09-9.737c-5.213-4.523-5.637-0.705-9.44-5.793l-0.313-0.155c-3.226,6.81-6.965,5.166-10.567,8.876c-3.647,3.726-4.696,0.078-13.353,3.553c-6.718,2.725-15.971,2.913-25.253,11.021c-2.505,2.178-1.394-3.553-5.307,6.279c-5.793,14.559,3.631,10.332,7.765,11.02c4.023,0.675,2.269,2.255-0.454,2.333c-0.078,0.016-0.157,0.016-0.234,0.016c-2.85,0-12.087,4.525-13.667,5.996c-1.565,1.472-7.467,3.351-11.992,0.205c-4.509-3.148-14.842,2.002-28.305-5.7c-2.896-1.831-7.953,6.528-9.629,2.052c-1.659-4.462-4.165-8.454-6.09-11.492c-3.193-5.008,8.297-1.079-0.203-11.303c-2.725-3.271-9.629,8.204-14.544,1.081c-2.456-3.555-2.02,2.504-8.344-3.444c-4.273-4.009-4.039,0.986,0.093,4.822c4.134,3.836-2.974,6.716-0.782,8.844c5.057,4.917-1.361,3.68,2.161,7.672c7.764,8.783,2.349,9.237,6.872,10.316c4.524,1.081,1.378,3.241,1.583,7.171c0.187,3.929-1.565,8.532,0.782,10.52c3.146,2.646-1.425,2.834,0.594,5.401c3.537,4.525-3.944,2.802-0.768,6.716c3.022,3.46-1.691,4.493,4.196,8.329c5.763,3.741-1.206,2.99-4.383,3.225l0.015,0.313c-2.896,2.301-0.595,10.662,3.241,9.157c3.835-1.503,4.273,2.882,6.263,0.659c1.987-2.208,6.465-5.542,11.068-0.143c11.818-3.396,10.284,6.247,14.292,2.725c4.008-3.507,3.226,1.252,8.11-0.735c4.885-1.989,5.62,1.002,9.44-0.814c3.804-1.814,4.712-6.763,7.075-4.492c2.349,2.286,0.221,6.042,3.162,6.371c2.944,0.344,0.987,5.339,4.134,6.011c7.60
37,1.646,11.928-6.041,14.371-4.413c6.607,4.398,0.893,6.637,2.645,8.39c4.165,4.165,3.32,0.173,5.544,1.629c2.207,1.457-0.235,2.285,1.909,3.318c2.13,1.034,3.977-1.033,6.044,0c2.066,1.034,1.815,5.058,6.262,5.011c0-0.595,1.189-2.067-0.878-5.011c-2.066-2.942,0-7.232,1.832-5.604c1.847,1.629,7.624-3.287,5.026-7.295c-2.615-4.008,4.226-3.225,1.095-4.728c-3.115-1.487-6.121-7.515-6.919-9.205c0,0,12.9-4.134,12.446-6.779c-0.439-2.661,1.925-2.661,3.255-1.174c1.316,1.471,7.952,2.254,8.173,0.359c0.517-4.477,4.742-2.833,3.977-6.48c-0.47-2.316,1.314-4.728,3.271-4.649c-0.329-2.349-2.677-1.033-3.538-5.104c-0.86-4.086,9.627-3.007,9.534-8.063c-0.093-5.058,2.599-2.678,3.239-6.982c0.643-4.29,3.931-3.366,1.489-6.09C300.967,124.24,307.354,120.186,304.208,116.255z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs12" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M157.706,332.688c1.658-0.297,6.104,2.428,5.54,3.617c-1.125,2.333-5.385,2.286-6.715-0.674c-1.331-2.943-3.993-2.254-4.712-1.832c-1.723,0.971-2.804-1.408-2.066-3.317c0.735-1.926,2.942-1.771,3.396,0C153.587,332.251,155.717,333.064,157.706,332.688z M112.838,247.869c2.88,4.023-8.109,1.706-2.396,5.87c3.616,2.662-1.361,2.646-0.689,5.12c1.081,4.022,5.795-1.425,6.874,0.986c3.052,6.731,2.223-6.591,20.946-2.756c3.35,0.689,4.806,8.798,1.473,4.415c-1.314-1.722-8.283-2.271-11.305-1.957c-1.393,0.141-4.148,2.112-2.551,3.538c4.071,3.632-8.752,3.772,2.646,9.127c13.729,6.465-10.865,12.634,2.254,23.106c4.415,3.522,5.996,10.71,9.253,16.909c3.241,6.183,15.624,8.641,18.083,11.693c2.456,3.038,2.55,3.445,4.805,2.256c2.271-1.175,2.803,5.166,6.779,0.5c0.093,0.077,0.188,0.172,0.266,0.25c1.157-2.661,3.788-2.129,6.137-2.707c2.349-0.597,2.803,4.055,6.779,1.909c3.977-2.13,4.196-2.13,4.117,0.517c-0.063,2.662,9.814-1.69,10.331-3.46c0.518-1.769-6.794-0.674-2.504-9.519c2.303-4.759-2.911-9.205-1.706-13.261c1.205-4.055-3.804-0.515-2.725-5.166c1.079-4.634-6.042-3.412-4.351-8.407c1.706-4.978-1.771-5.447-1.691-6.559c0.076-1.096,8.029,0.297,11.351,1.189c3.317,0.878-1.691-6.559,4.272-4.431c5.964,2.146,0.892-1.831,11.351-1.831c2.145,0,7.153-1.111,6.043,1.393c-1.096,2.506,1.847,2.506,3.317,0.893c1.473-1.628-0.358-6.45,5.746-5.683c2.929-4.54-0.859-8.876,3.256-10.316c4.104-1.455,1.144-8.141,4.055-9.879c2.897-1.752-0.593-8.031,1.535-9.283c2.145-1.252,4.947,3.256,7.232,1.909c2.286-1.346-1.031-4.195,0.219-5.009c1.254-0.814,3.587,2.332,7.813,0.359c4.228-1.972-0.735-4.571,2.944-5.307c3.694-0.736,4.68-9.879,7.67-12.007c3.006-2.146-0.438-11.727,1.849-12.979c2.284-1.254,1.251-3.898-0.893-5.526c-4.446,0.047-4.195-3.977-6.262-5.011c-2.067-1.033-3.914,1.034-6.044,0c-2.145-1.033,0.298-1.861-1.909-3.318c-2.224-1.456-1.379,2.536-5.544-1.629c-1.752-1.753,3.963-3.991-2.645-8.39c-2.443-1.628-6.764,6.059-14.371,4.413c-3.146-0.672-1.189-5.667-4.134-6.011c-2.941-0.329-0.813-4.085-3.162-6.371c-2.363-2.271-3.271,2.678-7.075,4.492c-3.82,1.816-4.556-1.175-9.44,0.814c-4.885,1.987-4.103-2.771-8.11,0.735c-4.008,3.522-2.474-6.121-14.292-2.725c0,0-1.316,1.786,0.517,6.671c1.815,4.885-6.153,5.276-3.039,9.987c3.131,4.728-0.844,7.171,2.663,10.177c3.507,2.99,1.002,6.042-1.314,6.699c-2.303,0.674-5.105,2.225-6.577,5.526c-1.471,3.319-1.908,9.456-6.121,7.311c-4.211-2.145-6.56-5.181-8.547-1.487c-1.989,3.711-7.295-0.141-6.778,2.74c0.517,2.864-1.034,2.864-3.617,2.944c-2.567,0.078-12.227,1.252-13.119,3.46c-0.876,2.223-4.228,12.21-8.251,9.581c-4.022-2.632-1.815,5.775-11.396,3.475L112.838,247.869z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs13" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M458.599,459.185c-2.005,4.79,7.641,1.596,7.077,4.79c-1.471,8.344,8.751,0.876,10.552,5.01c5.134,12.038,5.917-1.973,11.411,1.471c5.512,3.444,4.212-1.611,3.477-3.977c-0.737-2.363-6.121-8.767-10.833-9.439c-4.728-0.657,1.957-3.726,0.735-6.638c-1.237-2.896,6.684,1.487,4.931-4.274c-1.11-3.694,3.413-2.505,2.583-6.7c-0.83-4.196,8.063-0.423,6.857-5.088c-1.205-4.666,5.135-0.893,6.34-5.824c1.206-4.931,5.574-0.126,7.954-4.649c1.456-2.739,9.564,1.425,10.771-2.943c1.205-4.367-0.594-6.778-3.398-8.03c-2.801-1.253-3.099-8.109,0.517-7.969c3.618,0.156,5.465,3.099,7.515,1.784c1.989-1.284,5.71
35-2.645,7.875-1.252c-0.219,5.558,5.934,4.023,5.793,9.08c-0.094,3.083,3.883,2.709,4.227,5.792c0.58,5.214,6.937-2.474,7.467,1.581c1.035,7.765,6.201,10.302,4.431,10.316c-6.637,0.048-4.069,3.617-7.576,6.295c-3.93,2.99,3.929,7.403,0.203,10.817c-3.929,3.585,7.734,15.749,12.963,13.854c3.397-1.237,3.944,5.354,8.563,4.023c2.568-0.736,8.392,3.882,12.383-0.595c1.724-1.941,4.165-4.759,4.024-0.782c-0.141,4.226,7.075,7.186,3.239,7.075c-3.834-0.093-3.646,0.188-3.631,1.284c0.047,3.428-3.257,1.722-3.35,5.793c-0.095,4.963-5.59,1.862-3.728,6.496c0.94,2.317,4.714,4.618,1.081,5.589c-1.925,0.532-4.32,5.996-7.969,5.119c-0.955-0.234-8.281,4.337-7.952,7.859c0.485,5.354-4.993-0.642-5.512,2.065c-0.688,3.68-3.335-0.046-3.835,3.836c-1.314,10.316-7.357,4.228-8.846,5.401c-1.471,1.174,0.892,4.963-3.334,7.077c-2.208,1.095,3.788,9.376-3.444,9.737c-3.241,0.141-5.542,5.542-10.224,3.726c-2.145-0.83-11.286,2.035-10.41,5.401c1.566,5.996-2.755-1.269-4.821-1.66c-2.052-0.407-1.473,2.066-4.117-1.189c-2.662-3.241,0.406,10.176-8.454,1.972c-4.617-4.272-5.511-0.985-6.388-5.118c-0.454-2.098-3.852,2.599-5.417-1.769c-1.019-2.897-8.735,5.416-11.1-6.091c-1.439-7.045-2.253-4.227-5.697-3.335c-3.444,0.878-10.615,4.024-13.276-1.879c-2.208-4.915-7.076-2.411-6.779,0.298c0.548,4.775-13.307,3.491-9.925,0.392c2.942-2.677-12.868-4.869-18.568-5.181c-0.344-3.163,8.314-11.602,8.894-14.075c0.578-2.551,10.803-8.751,10.411-11.695c-0.391-2.958,7.467-7.467,8.266-9.627c0.782-2.16-5.809-7.923-7.531-9.143c-1.722-1.236-2.332-9.597-2.332-9.597c5.525-10.317,6.325,5.666,11.288,2.098c1.956-1.409,5.307-3.022,1.831-4.274c-3.46-1.252-0.298-8.5,3.319-7.732C457.738,454.816,460.618,454.393,458.599,459.185z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs14" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M40.952,575.887c4.345-0.666,0-6.327,4.451-8.134c4.454-1.808,5.565-0.54,9.462,2.531c3.897,3.072,14.101,1.446,15.958,5.603c1.854,4.156,14.841,11.387,15.954,14.638c1.112,3.254,4.082-1.442,5.194,1.809c1.115,3.252,3.341,9.58,1.3,12.651c-2.041,3.07-7.794,7.769-8.907,11.744c-1.111,3.979-4.823,2.896-4.637,6.33c0.185,3.434-4.453,4.337-3.71,8.494c0.742,4.156-7.608,11.382-10.574,10.662c-2.969-0.722-5.197,0.722-5.567-1.806c-0.373-2.533-1.113-1.99-3.525-0.365c-2.413,1.626-5.749-1.808-7.606,0c-1.854,1.807-7.608,4.801-10.019,2.222c-2.412-2.583-7.979-0.232-5.381-4.749c2.597-4.521,7.393-6.193,6.678-11.567c-1.297-9.76,7.407-13.352,3.896-15.185c-7.978-4.153-5.751-11.563-8.162-14.456c-2.412-2.892,2.596-6.323-0.741-9.578C31.675,583.48,37.427,576.431,40.952,575.887z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs15" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M173.838,597.293c2.06-1.312,3.819-4.284,6.825,0c3.009,4.282-0.927,5.521,3.009,9.465c3.932,3.944,8.606,1.049,9.139,3.381c0.925,4.057,6.017,3.832,5.898,4.959c-0.114,1.125-2.198-0.451-5.783,0c-3.585,0.449-14.922,5.409-16.773,3.943c-1.852-1.465-5.323-4.396-6.942-1.803c-1.622,2.591-1.968,3.495,0,5.973c1.967,2.479,2.163,8.79-1.347,10.93c-3.514,2.143-6.751,4.733-7.791,3.271c-1.041-1.468-6.479-8.791-6.018-11.722c0.464-2.931-1.852-3.718-0.811-5.972c1.043-2.255-2.775-5.071-1.041-8.113c1.737-3.044,3.243-8.451,6.594-4.96c3.357,3.494,6.25,1.918,7.636,4.058c1.39,2.142,5.439,2.479,5.439-0.225c0-2.706,4.394-3.044,2.312-4.959C172.102,603.603,170.129,599.653,173.838,597.293z M189.457,642.705c3.932,3.833,5.783-0.676,7.519-2.253c1.733-1.578,1.504-3.043-1.156-4.169c-2.661-1.127-1.834-3.349-4.396-3.156C186.909,633.465,185.521,638.874,189.457,642.705z" cursor="pointer"></path> <path id="frjs16" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M244.042,596.728c5.972-1.514,10.702-1.054,12.041,1.052c1.336,2.104,7.58,2.733,8.026,5.256c0.446,2.525,6.464,5.68,8.025,3.787c1.563-1.893,3.568-2.944,4.905-1.262c1.34,1.682,0.225,1.364-1.112,1.84c-1.34,0.474-1.34,2.998-3.568,2.157c-2.232-0.843-1.786,2.102,0.446,2.523c2.229,0.419,1.782,3.364,0.446,2.941c-1.338-0.417-2.454,2.105,0.224,1.684c2.674-0.419,2.675-0.211,1.782,2.735c-0.892,2.946,4.46,2.314,4.234,4.628c-0.222,2.313,2.456,2.313,2.678,6.521c0.222,4.207,1.561,5.467,0,7.57c-1.562,2.104-4.684,5.68-5.796,3.787c-1.116-1.893,2.229-3.576,1.112-5.05c-1.112-1.471-0.893,2.316-4.458,0.422c-3.566-1.893-5.573,0.421-6.913-1.893c-1.338-2.313-8.026,5.469-9.141,1.261c-1.114-4.205-3.344-11.777,2.23-9.255c5.572,2.523,5.874,0.633,4.274-1.892c-1.601-2.522-3.385-1.895-5.837-1.
3682c-2.451,0.21-5.399-2.531-8.25-4.92c-8.431-7.067-2.452-10.436-5.351-12.96C241.144,603.456,238.878,598.033,244.042,596.728z" cursor="pointer"></path> <path id="frjs17" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M52.494,471.947c3.352,2.302,14.093,1.761,17.509,5.938c3.418,4.18,1.83,4.014,4.485,10.118c5.553,12.755,6.834,4.178,9.181,10.336c2.35,6.158-3.628,7.039-2.134,12.537c1.495,5.499-3.417,10.336-6.833,9.237c-3.417-1.098-7.475,6.6-11.744,2.201c-4.271-4.398-23.063-5.061-26.266-12.758c-3.203-7.698-3.629-13.195-5.767-13.195c-2.135,0-4.909-8.579-1.279-10.557c3.628-1.98,4.056-2.639,3.417-5.5c-0.643-2.858,1.706-4.398,4.056-3.519S47.368,468.429,52.494,471.947z" cursor="pointer" style="fill: rgb(33, 66, 137);"></path> <path id="frjs18" fill="#214289" stroke="#fff" vector-effect="non-scaling-stroke" d="M44.563,369.174c7.038,7.993,0.615,7.79,2.734,9.84c7.659,7.412,5.448-1.522,10.063,0c4.614,1.52,12.408,0.618,12.62,5.739c0.411,9.905-4.099,5.328-4.646,9.564c-0.548,4.236-6.012-1.367-4.101,6.832c1.914,8.199,6.082,5.057,5.467,8.747c-0.614,3.688-5.969,6.219-8.238,10.385c-5.769,10.589,6.324,7.379,4.413,10.112c-4.642,6.63-8.473-2.178-8.2,0.547c0.409,4.098-2.529,4.235-7.926,1.365c-5.396-2.869,1.436-7.242-4.464-5.01c-4.125,1.563-1.389-2.436,0-3.461c1.39-1.026,2.141-2.551-2.027-4.738c-4.168-2.187-0.523-7.104,2.211-4.92c2.733,2.188-0.911,4.738,2.55,4.373c3.461-0.364,5.283,6.925,7.106,2.734c1.822-4.191-3.917-12.163-8.199-15.123c-4.282-2.961,0.729-2.006,0.363-5.467c-0.363-3.462-4.025-8.486-2.004-10.567c3.166-3.257-1.27-3.644-3.368-2.916c-2.098,0.729-10.502-2.982-6.288-5.829c4.214-2.848-3.645-8.017,2.55-8.199C41.374,373.001,37.525,361.18,44.563,369.174z M77.451,392.86c8.207,10.488,5.92-11.284,0-5.649C74.271,390.238,74.659,389.297,77.451,392.86z" cursor="pointer"></path> </g> <g id="frjspins"></g> </svg> </div> </div> </div> </div> </div>','x-93 #mapwrapper,[data-is="x-93"] #mapwrapper{ font-family: Arial, Helvetica, sans-serif; max-width: 1920px; margin: 0 auto; padding: 0 0; background-color: transparent; min-width: 220px; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } x-93 #mapbase svg,[data-is="x-93"] #mapbase svg{ max-height: 100%; width: 100%; margin: 0; } x-93 #frjstip,[data-is="x-93"] #frjstip{ font: 14px/16px Trebuchet MS, Helvetica, Arial, sans-serif; display: none; max-width: 40%; padding: 5px; border: 1px solid #404040; color: #404040; z-index: 1000; float: left; position: absolute; background: rgba(265, 265, 265, 0.9); word-break: keep-all; box-shadow:1px 2px 4px rgba(0, 0, 0, 0.5); -moz-box-shadow:1px 2px 4px rgba(0, 0, 0, 0.5); -webkit-box-shadow:1px 2px 4px rgba(0, 0, 0, 0.5); } x-93 #frjstip p,[data-is="x-93"] #frjstip p{ margin: 0!important; color: #404040!important; } x-93 #frjstip img,[data-is="x-93"] #frjstip img{ float: left; padding: 3px; max-width: 100%; } @media screen and (max-width: 320px){ x-93 #mapbase svg,[data-is="x-93"] #mapbase svg{ height:300px; } } @media screen and (max-width: 400px) and (min-width: 321px) { x-93 #mapbase svg,[data-is="x-93"] #mapbase svg{ height:340px; } } @media screen and (max-width: 480px) and (min-width: 401px) { x-93 #mapbase svg,[data-is="x-93"] #mapbase svg{ height:410px; } } @media screen and (max-width: 568px) and (min-width: 481px) { x-93 #mapbase svg,[data-is="x-93"] #mapbase svg{ height:420px; } } @media screen and (max-width: 685px) and (min-width: 569px) { x-93 #mapbase svg,[data-is="x-93"] #mapbase svg{ height:430px; } } @media screen and (max-width: 767px) and (min-width: 686px) { x-93 #mapbase svg,[data-is="x-93"] #mapbase svg{ height:450px; } } @media screen and (min-width: 768px) { x-93 #mapbase svg,[data-is="x-93"] #mapbase svg{ height:530px; } }',"",function(opts){var frjsconfig={general:{borderColor:"#fff",visibleNames:"transparent"},frjs1:{hover:"Grand-Est",url:"https://intranet.francelymphomeespoir.fr/grand-est",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs2:{hover:"Nouvelle-Aquitaine",url:"https://intranet.francelymphomeespoir.fr/nouvelle-aquitaine",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs3:{hover:"Auvergne Rhône-Alpes",url:"https://intranet.francelymphomeespoir.fr/auvergne-rhone-alpes",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs4:{hover:"Bourgogne-Franche-Comté",url:"https://intranet.francelymphomeespoir.fr/bourgogne-franche-comte",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs5:{hover:"Bretagne",url:"https://intranet.francelymphomeespoir.fr/bretagne",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs6:{hover:"Centre-Val de Loire",url:"https://intranet.francelymphomeespoir.fr/centre-val-de-loire",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs7:{hover:"Corse",url:"https://intranet.francelymphomeespoir.fr/corse",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs8:{hover:"Ile-de-France",url:"https://intranet.francelymphomeespoir.fr/ile-de-france",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs9:{hover:"Occitanie",url:"https://intranet.francelymphomeespoir.fr/occitanie",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs10:{hover:"Hauts-de-France",url:"https://intranet.francelymphomeespoir.fr/hauts-de-france",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs11:{hover:"Normandie",url:"https://intranet.francelymphomeespoir.fr/normandie",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs12:{hover:"Pays de la Loire",url:"https://intranet.francelymphomeespoir.fr/pays-de-loire",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs13:{hover:"Provence-Alpes-Côte d&#039;Azur",url:"https://intranet.francelymphomeespoir.fr/provence-alpes-cote-dazur",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs14:{hover:"Guyane",url:"https://intranet.francelymphomeespoir.fr/guyane",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs15:{hover:"Guadeloupe",url:"https://intranet.francelymphomeespoir.fr/guadeloupe",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs16:{hover:"Martinique",url:"https://intranet.francelymphomeespoir.fr/martinique",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs17:{hover:"La Réunion",url:"https://intranet.francelymphomeespoir.fr/la-reunion",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0},frjs18:{hover:"Mayotte",url:"https://intranet.francelymphomeespoir.fr/mayotte",upColor:"#214289",overColor:"#2eaae2",downColor:"#2eaae2",target:"same_window",active:!0}};jQuery(function(){jQuery("path[id^=frjs]").each(function(i,e){var id,_obj,arr,_Textobj;id=jQuery(e).attr("id"),_obj=jQuery("#"+id),arr=id.split(""),_Textobj=jQuery("#"+id+",#frjsvn"+arr.slice(4).join("")),jQuery("#"+["visnames"]).attr({fill:frjsconfig.general.visibleNames}),_obj.attr({fill:frjsconfig[id].upColor,stroke:frjsconfig.general.borderColor}),_Textobj.attr({cursor:"default"}),!0===frjsconfig[id].active&&(_Textobj.attr({cursor:"pointer"}),_Textobj.hover(function(){jQuery("#frjstip").show().html(frjsconfig[id].hover),_obj.css({fill:frjsconfig[id].overColor})},function(){jQuery("#frjstip").hide(),jQuery("#"+id).css({fill:frjsconfig[id].upColor})}),frjsconfig[id].url==window.location.href&&(console.log("test"),jQuery("#"+id).css({fill:"#F65B7F"}),frjsconfig[id].upColor="#F65B7F"),"none"!==frjsconfig[id].target&&_Textobj.mousedown(function(){jQuery("#"+id).css({fill:frjsconfig[id].downColor})}),_Textobj.mouseup(function(){jQuery("#"+id).css({fill:frjsconfig[id].overColor}),"new_window"===frjsconfig[id].target?window.open(frjsconfig[id].url):"same_window"===frjsconfig[id].target?window.parent.location.href=frjsconfig[id].url:"modal"===frjsconfig[id].target&&jQuery(frjsconfig[id].url).modal("show")}),_Textobj.mousemove(function(e){var x=e.pageX+10,y=e.pageY+15,tipw=jQuery("#frjstip").outerWidth(),tiph=jQuery("#frjstip").outerHeight(),x=x+tipw>jQuery(document).scrollLeft()+jQuery(window).width()?x-tipw-40:x,y=y+tiph>jQuery(document).scrollTop()+jQuery(window).height()?jQuery(document).scrollTop()+jQuery(window).height()-tiph-10:y;jQuery("#frjstip").css({left:x,top:y})}),("ontouchstart"in window||0<navigator.MaxTouchPoints||0<navigator.msMaxTouchPoints)&&(_Textobj.on("touchstart",function(e){var touch=e.originalEvent.touches[0],x=touch.pageX+10,y=touch.pageY+15,tipw=jQuery("#frjstip").outerWidth(),tiph=jQuery("#frjstip").outerHeight(),x=x+tipw>jQuery(document).scrollLeft()+jQuery(window).width()?x-tipw-40:x,y=y+tiph>jQuery(document).scrollTop()+jQuery(window).height()?jQuery(document).scrollTop()+jQuery(window).height()-tiph-10:y;jQuery("#"+id).css({fill:frjsconfig[id].downColor}),jQuery("#frjstip").show().html(frjsconfig[id].hover),jQuery("#frjstip").css({left:x,top:y})}),_Textobj.on("touchend",function(){jQuery("#"+id).css({fill:frjsconfig[id].upColor}),"new_window"===frjsconfig[id].target?window.open(frjsconfig[id].url):"same_window"===frjsconfig[id].target?window.parent.location.href=frjsconfig[id].url:"modal"===frjsconfig[id].target&&jQuery(frjsconfig[id].url).modal("show")})))})})}),riot.tag2("x-118",'<div id="myDiv"></div>',"","",function(opts){this.on("mount",function(){UI.require("https://cdn.plot.ly/plotly-2.20.0.min.js"),this.init()}),this.init=function(){Plotly.newPlot("myDiv",[{customdata:[["Lymphome de Hodgkin"],["LLC"],["Lymphome folliculaire"],["Diffus à grande cellules B"],["Lymphome du manteau"],["Lymphome de Burkitt"],["Maladie de Waldenström"],["Lymphomes de la zone marginale"],["Lymphome T/NK matures non cutanés"],["Lymphome T/NK matures Cutanés"],["autres"]],domain:{x:[0,1],y:[0,1]},hovertemplate:"Hemopathie=%{customdata[0]}<br>pourcentage=%{value}<extra></extra>",labels:["Lymphome de Hodgkin","LLC","Lymphome folliculaire","Diffus à grande cellules B","Lymphome du manteau","Lymphome de Burkitt","Maladie de Waldenström","Lymphomes de la zone marginale","Lymphome T/NK matures non cutanés","Lymphome T/NK matures Cutanés","autres"],legendgroup:"",marker:{colors:["darkcyan","turquoise","skyblue","powderblue","dodgerblue","lightslategrey","navy","blue","mediumslateblue","darkslategray","lavender"]},name:"",showlegend:!0,values:[8.8625,19.475,12.775,21.12916667,3.695833333,.916666667,5.4875,11.625,4.733333333,3.370833333,7.929166667],type:"pie"}],{responsive:!0})}.bind(this)}),riot.tag2("x-96",'<div if="{tools}" class="list header"> <div> <ui-search data="{args}" class="keep" onchange="{search}"></ui-search> </div> </div> <div class="{list: list, \'three-columns grid\': !list}"> <div each="{row in rows}" class="item"> <div if="{blocks.image && list}" class="image"> <a if="{row.data[blocks.image.id]}" href="{getLink(row)}" onclick="{show}"> <img riot-src="{UI.getFileURL(row.data[blocks.image.id][0])}"> </a> </div> <div class="content"> <div if="{blocks.image && !list}" class="image" riot-style="{getOrder(1)}"> <a if="{row.data[blocks.image.id]}" href="{getLink(row)}" onclick="{show}"> <img riot-src="{UI.getFileURL(row.data[blocks.image.id][0])}"> </a> </div> <div if="{blocks.title && row.data[blocks.title.id]}" class="title" riot-style="{getOrder(2)}"> <h3><a href="{getLink(row)}" onclick="{show}">{format(blocks.title, row)}</a></h3> </div> <div if="{blocks.label && row.data[blocks.label.id]}" class="label" riot-style="{getOrder(3)}"> <data-label mode="view" block="{blocks.label}" dataset="{row.data[blocks.label.id]}"></data-label> </div> <div if="{blocks.date && row.data[blocks.date.id]}" class="date" riot-style="{getOrder(4)}"> <data-date mode="view" block="{blocks.date}" dataset="{row.data[blocks.date.id]}"></data-date> </div> </div> </div> </div>','x-96 .list .item,[data-is="x-96"] .list .item{ border-bottom: 1px solid #ccc; display: flex; padding: 0.5em 0; } x-96 .grid .image,[data-is="x-96"] .grid .image{ position: relative; overflow: hidden; height: 11em; } x-96 .list .image,[data-is="x-96"] .list .image{ position: relative; flex-shrink: 0; width: 8em; height: 8em; } x-96 .image img,[data-is="x-96"] .image img{ position: absolute; max-width: 100%; top: 0; right: 0; bottom: 0; left: 0; } x-96 .list .image img,[data-is="x-96"] .list .image img{ max-height: 100%; } x-96 .content,[data-is="x-96"] .content{ display: flex; flex-direction: column; } x-96 .grid .content,[data-is="x-96"] .grid .content{ text-align: left; } x-96 .list .content,[data-is="x-96"] .list .content{ overflow: hidden; flex-grow: 1; } x-96 .content > .title,[data-is="x-96"] .content > .title,x-96 .content > .label,[data-is="x-96"] .content > .label,x-96 .content > .text,[data-is="x-96"] .content > .text,x-96 .content > .date,[data-is="x-96"] .content > .date{ margin: 0.3em 1em; } x-96 .content > .label .data,[data-is="x-96"] .content > .label .data{ padding: 0; } x-96 .more,[data-is="x-96"] .more{ order: 9; } x-96 .list .more,[data-is="x-96"] .list .more{ text-align: right; font-weight: bold; } x-96 .grid .more a,[data-is="x-96"] .grid .more a{ background: #eee; display: block; line-height: 2em; }',"",function(opts){opts.node="1215",opts.view="2667",opts.limit="4",this.args={},this.tools=void 0!==opts.tools,this.list="list"===opts.layout,this.order=opts.order||"12345",this.limit=Number(opts.limit)||3,this.on("mount",function(){this.init()}),this.on("updated",function(){this.init()}),this.init=function(){var item;this.node===opts.node&&this.view===opts.view||(this.node=opts.node,this.view=opts.view,this.args=this.view?{view:Number(this.view)}:{sort:0,dir:-1,limit:this.limit},item=UI.getItem(),opts.filter&&item&&(this.args.filters=[{id:Number(opts.filter),data:[item]}]),this.args.slug=!0,this.load())}.bind(this),this.load=function(){this.request({method:"PUT",url:"/n/node/"+this.node+"/items",data:this.args,success:function(res){this.blocks=this.getBlocks(res.cols),this.rows=function(sourceArray){for(var i=0;i<sourceArray.length-1;i++){var j=i+Math.floor(Math.random()*(sourceArray.length-i)),temp=sourceArray[j];sourceArray[j]=sourceArray[i],sourceArray[i]=temp}return sourceArray}(res.rows).slice(0,this.limit),this.args=res.args,this.update()}})}.bind(this),this.search=function(text){this.args.search=text,this.args.page=1,this.load()}.bind(this),this.getBlocks=function(cols){return{image:cols.filter(function(col){return"file"===col.type})[0],title:cols.filter(function(col){return!0===col.config.title})[0],label:cols.filter(function(col){return"label"===col.type})[0],date:cols.filter(function(col){return"date"===col.type})[0],text:cols.filter(function(col){return("text"===col.type||"html"===col.type)&&!col.config.title})[0]}}.bind(this),this.getOrder=function(block){return{order:this.order.indexOf(block)+1}}.bind(this),this.getLink=function(row){var path=window.location.pathname.replace(/\/$/,"");return row.slug?path+"/"+row.slug:"#"}.bind(this),this.format=function(block,row){var data=row.data[block.id]&&row.data[block.id][0],text=UI.format[block.type].call(block.config,data),length=opts.length||(this.list?200:100);return text.length>length?text.slice(0,length)+"...":text}.bind(this),this.show=function(e){opts.theme&&(document.cookie="ftheme="+opts.theme)}.bind(this)}),riot.tag2("x-174",'<ui-search onchange="{send}"></ui-search> <div if="{loader}" class="ui active centered inline loader"></div> <div if="{results && !results.length}" class="ui info message"> <div class="header">Aucun résultat</div> <p>Veuillez modifier les critères de recherche</p> </div> <div class="wrapper_result"> <div each="{result in results}" class="result hidden"> <a href="/{result.slug}">{result.name}</a> <ui-html content="{result.text}"></ui-html> </div> </div>','x-174 ui-search,[data-is="x-174"] ui-search{ display: block; text-align: center; } x-174 ui-search .ui.input,[data-is="x-174"] ui-search .ui.input{ max-width: 100%; width: 30em; } x-174 .ui.inline.loader,[data-is="x-174"] .ui.inline.loader{ margin-to
3p: 1em; } x-174 .result,[data-is="x-174"] .result{ margin: 2em 0; transition: opacity 0.3s; } x-174 .result.hidden,[data-is="x-174"] .result.hidden{ opacity: 0; } x-174 .result a,[data-is="x-174"] .result a{ display: block; font-size: 1.5em; line-height: 1.3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } x-174 .result em,[data-is="x-174"] .result em{ font-style: normal; font-weight: bold; }',"",function(opts){this.on("mount",function(){$("input",this.root).focus()}),this.on("unmount",function(){clearTimeout(this.timeout),clearInterval(this.interval)}),this.send=function(text){if(!text)return this.results=null,void this.update();clearInterval(this.interval),this.timeout=setTimeout(this.showLoader,1e3),this.request({method:"GET",url:"/p/pages?s",data:{q:text},success:function(res){clearTimeout(this.timeout),this.loader=!1,this.results=res.results,this.update(),this.interval=setInterval(this.showResult,50)}})}.bind(this),this.showLoader=function(){this.loader=!0,this.update()}.bind(this),this.showResult=function(){$(".result.hidden",this.root).first().removeClass("hidden")}.bind(this)}),riot.tag2("x-71",'<div id="timeline"></div>','x-71 #twitter-widget-0,[data-is="x-71"] #twitter-widget-0{ width: 100% !important; margin: 0 !important; padding: 0 !important; } x-71 .timeline-Widget,[data-is="x-71"] .timeline-Widget{ max-width: 1200px; background-color: #3273c5 !important; border-radius: 5px; }',"",function(opts){var d,s,id,js,fjs,t;window.twttr=(d=document,s="script",id="twitter-wjs",fjs=d.getElementsByTagName(s)[0],t=window.twttr||{},d.getElementById(id)||((js=d.createElement(s)).id=id,js.src="https://platform.twitter.com/widgets.js",fjs.parentNode.insertBefore(js,fjs),t._e=[],t.ready=function(f){t._e.push(f)}),t),twttr.ready(function(twttr){twttr.widgets.createTimeline({sourceType:"profile",screenName:"AssoELLyE"},document.getElementById("timeline"),{width:"100%",height:"400",theme:"light",related:"twitterdev,twitterapi"}).then(function(el){console.log("Embedded a timeline.")})})}),riot.tag2("x-115",'<div each="{rowpage in datapage}" class="wrapper"> <p if="{rowpage.crea && rowpage.maj == null}" class="classdatepage"> Date de création : {rowpage.crea} </p> <p if="{rowpage.maj}" class="classdatepage"> Date de mise à jour : {rowpage.maj} </p> </div>','x-115 .classdatepage,[data-is="x-115"] .classdatepage{ font-size: 12px; font-style: italic; }',"",function(opts){this.on("mount",function(){this.init()}),this.init=function(){this.request({method:"GET",url:"/x/datepage?id_page="+UI.getItem().id,success:function(res){this.datapage=res.datapage,this.update()}})}.bind(this)}),riot.tag2("x-94",'<div if="{files}" ref="carousel" class="carousel"> <div each="{file in files}"> <img if="{!file.link}" riot-src="{UI.getFileURL(file)}" alt="{file.title || file.name}"> <a if="{file.link}" href="{file.link}"> <img riot-src="{UI.getFileURL(file)}" alt="{file.title || file.name}"> </a> <div if="{file.title || file.description || file.link}" class="content"> <div if="{file.title}" class="title"> {file.title} </div> <div if="{file.description}" class="description"> {file.description} </div> <div if="{file.link}" class="link"> <a href="{file.link}">{file.label}</a> </div> </div> </div> </div>','x-94 .gallery,[data-is="x-94"] .gallery{ display: none; margin: 0 auto; }',"",function(opts){opts.box="4401";var config=opts.config||{};config.dots=void 0!==opts.dots,config.infinite=void 0!==opts.loop,config.autoplay=void 0!==opts.autoplay,config.autoplaySpeed=Number(opts.speed)||3e3,config.slidesToShow=Number(opts.max)||4,config.slidesToScroll=Number(opts.offset)||4;var url=UI.getResourceURL("slick-carousel","1.8.1");this.on("mount",function(){UI.require([{url:url+"/slick/slick.css",sri:"sha256-3h45mwconzsKjTUULjY+EoEkoRhXcOIU4l5YAw2tSOU="},{url:url+"/slick/slick-theme.css",sri:"sha256-etrwgFLGpqD4oNAFW08ZH9Bzif5ByXK2lXNHKy7LQGo="},{url:url+"/slick/slick.min.js",sri:"sha256-DHF4zGyjT7GOMPBwpeehwoey18z8uiz98G4PRu2lV0A="}],this.init)}),this.init=function(){opts.box&&this.request({method:"GET",url:"/f/files?b="+opts.box,success:function(res){this.files=function(sourceArray){for(var i=0;i<sourceArray.length-1;i++){var j=i+Math.floor(Math.random()*(sourceArray.length-i)),temp=sourceArray[j];sourceArray[j]=sourceArray[i],sourceArray[i]=temp}return sourceArray}(res.options).filter(function(row){return row.icon.match(/image/)}),this.update(),$(this.refs.carousel).slick(config)}})}.bind(this)}),riot.tag2("x-219",'<div class="content-wrapper"> <div class="filtres-wrapper"> <div id="date-filtre"> <label for="check-date-filtre">Date de filtre pour l\'export</label><br><br> <div id="val-date-filtre"> <label>Du : </label> <input id="date-filtre-deb" name="date-filtre-deb" required="true" type="date"> <label>Au : </label> <input id="date-filtre-fin" name="date-filtre-fin" required="true" type="date"> </div> </div> </div> <div id="action-wrapper"> <button ref="loading" class="ui basic button" onclick="{refreshTreso}"> <i class="refresh icon"></i> Afficher les résultats </button> </div> <div id="result-wrapper" style="display:none;"> <table> <thead> <tr> <th>Ligne de facture</th> <th>Nombre de lignes ayant <br>cette ligne de facture</th> <th>Montant total</th> </tr> </thead> <tbody> <tr each="{rowtreso in datatreso}"> <td>{rowtreso.type_versement}</td> <td>{rowtreso.quantite_totale}</td> <td>{rowtreso.montant_total}</td> </tr> </tbody> </table> </div> </div>','x-219 .content-wrapper,[data-is="x-219"] .content-wrapper{ display : flex; flex-direction: column; } x-219 .filtres-wrapper,[data-is="x-219"] .filtres-wrapper{ display : flex; margin : 10px auto 10px auto; } x-219 #action-wrapper,[data-is="x-219"] #action-wrapper{ margin : 10px auto 10px auto; } x-219 #result-wrapper,[data-is="x-219"] #result-wrapper{ display : flex; } x-219 #result-wrapper p,[data-is="x-219"] #result-wrapper p{ margin : 20px auto 0 auto !important; } x-219 #result-wrapper table,[data-is="x-219"] #result-wrapper table{ margin : 20px auto 0 auto; } x-219 #result-wrapper table td,[data-is="x-219"] #result-wrapper table td{ padding : 0 4px 0 4px; } x-219 #result-wrapper .result,[data-is="x-219"] #result-wrapper .result{ text-align : center; } x-219 #type-filtre,[data-is="x-219"] #type-filtre{ margin : auto 30px auto 0; display: flex; flex-direction: column; } x-219 #date-filtre,[data-is="x-219"] #date-filtre{ margin : auto; } @keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes fadeOut { 0% { opacity: 1; } 100% { opacity: 0; } } x-219 table,[data-is="x-219"] table{ width: 800px; } x-219 thead,[data-is="x-219"] thead{ background-color: #722666; color: #fff; } x-219 th,[data-is="x-219"] th,x-219 td,[data-is="x-219"] td{ width: 33.33%; text-align: center; }',"",function(opts){this.on("mount",function(){console.log("IN")}),this.refreshTreso=function(){urlStats="/x/read-stats-treso",$("#date-filtre-deb").val()&&(dateDeb=new Date($("#date-filtre-deb").val()),urlStats+="?dateDeb="+dateDeb.toISOString()),$("#date-filtre-fin").val()&&(dateFin=new Date($("#date-filtre-fin").val()),urlStats+="&dateFin="+dateFin.toISOString()),this.request({method:"GET",url:urlStats,success:function(res){this.datatreso=res.datatreso,console.log(res),this.update(),$("#result-wrapper").css("display","block")}})}.bind(this)});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.