jcms
Version:
un cms utilisant node.js et mongoDB
2 lines (1 loc) • 7.71 kB
JavaScript
define(["jquery","underscore","backbone","backbone-forms"],function(e,t,n){(function(r){r.editors.List=r.editors.Base.extend({events={'click [data-action="add"]'=function(e){e.preventDefault(),this.addItem(null,!0)}},initialize=function(e){e=e||{};var t=r.editors;t.Base.prototype.initialize.call(this,e);var n=this.schema;if(!n)throw new Error("Missing required option 'schema'");this.template=e.template||this.constructor.template,this.Editor=function(){var e=n.itemType;return e?t.List[e]?t.List[e]=t[e]=t.Text}(),this.items=[]},render=function(){var e=this,r=this.value||[],i=n.$,s=i(i.trim(this.template()));return this.$list=s.is("[data-items]")?s=s.find("[data-items]"),r.length?t.each(r,function(t){e.addItem(t)})=this.Editor.isAsync||this.addItem(),this.setElement(s),this.$el.attr("id",this.id),this.$el.attr("name",this.key),this.hasFocus&&this.trigger("blur",this),this},addItem=function(e,n){var i=this,s=r.editors,o=(new s.List.Item({list=this,form=this.form,schema=this.schema,value=e,Editor=this.Editor,key=this.key})).render(),u=function(){i.items.push(o),i.$list.append(o.el),o.editor.on("all",function(e){if(e==="change")return;var n=t.toArray(arguments);n[0]="item="+e,n.splice(1,0,i),s.List.prototype.trigger.apply(this,n)},i),o.editor.on("change",function(){o.addEventTriggered||(o.addEventTriggered=!0,this.trigger("add",this,o.editor)),this.trigger("item=change",this,o.editor),this.trigger("change",this)},i),o.editor.on("focus",function(){if(this.hasFocus)return;this.trigger("focus",this)},i),o.editor.on("blur",function(){if(!this.hasFocus)return;var e=this;setTimeout(function(){if(t.find(e.items,function(e){return e.editor.hasFocus}))return;e.trigger("blur",e)},0)},i);if(n||e)o.addEventTriggered=!0;n&&(i.trigger("add",i,o.editor),i.trigger("change",i))};return this.Editor.isAsync?o.editor.on("readyToAdd",u,this)=(u(),o.editor.focus()),o},removeItem=function(e){var n=this.schema.confirmDelete;if(n&&!confirm(n))return;var r=t.indexOf(this.items,e);this.items[r].remove(),this.items.splice(r,1),e.addEventTriggered&&(this.trigger("remove",this,e.editor),this.trigger("change",this)),!this.items.length&&!this.Editor.isAsync&&this.addItem()},getValue=function(){var e=t.map(this.items,function(e){return e.getValue()});return t.without(e,undefined,"")},setValue=function(e){this.value=e,this.render()},focus=function(){if(this.hasFocus)return;this.items[0]&&this.items[0].editor.focus()},blur=function(){if(!this.hasFocus)return;var e=t.find(this.items,function(e){return e.editor.hasFocus});e&&e.editor.blur()},remove=function(){t.invoke(this.items,"remove"),r.editors.Base.prototype.remove.call(this)},validate=function(){if(!this.validators)return null;var e=t.map(this.items,function(e){return e.validate()}),n=t.compact(e).length?!0=!1;if(!n)return null;var r={type="list",message="Some of the items in the list failed validation",errors=e};return r}},{template=t.template(' <div> <div data-items></div> <button type="button" data-action="add">Add</button> </div> ',null,r.templateSettings)}),r.editors.List.Item=r.editors.Base.extend({events={'click [data-action="remove"]'=function(e){e.preventDefault(),this.list.removeItem(this)},"keydown input[type=text]"=function(e){if(e.keyCode!==13)return;e.preventDefault(),this.list.addItem(),this.list.$list.find("> li=last input").focus()}},initialize=function(e){this.list=e.list,this.schema=e.schema||this.list.schema,this.value=e.value,this.Editor=e.Editor||r.editors.Text,this.key=e.key,this.template=e.template||this.schema.itemTemplate||this.constructor.template,this.errorClassName=e.errorClassName||this.constructor.errorClassName,this.form=e.form},render=function(){var e=n.$;this.editor=(new this.Editor({key=this.key,schema=this.schema,value=this.value,list=this.list,item=this,form=this.form})).render();var t=e(e.trim(this.template()));return t.find("[data-editor]").append(this.editor.el),this.setElement(t),this},getValue=function(){return this.editor.getValue()},setValue=function(e){this.editor.setValue(e)},focus=function(){this.editor.focus()},blur=function(){this.editor.blur()},remove=function(){this.editor.remove(),n.View.prototype.remove.call(this)},validate=function(){var e=this.getValue(),n=this.list.form?this.list.form.getValue()={},r=this.schema.validators,i=this.getValidator;if(!r)return null;var s=null;return t.every(r,function(t){return s=i(t)(e,n),s?!1=!0}),s?this.setError(s)=this.clearError(),s?s=null},setError=function(e){this.$el.addClass(this.errorClassName),this.$el.attr("title",e.message)},clearError=function(){this.$el.removeClass(this.errorClassName),this.$el.attr("title",null)}},{template=t.template(' <div> <span data-editor></span> <button type="button" data-action="remove">×</button> </div> ',null,r.templateSettings),errorClassName="error"}),r.editors.List.Modal=r.editors.Base.extend({events={click="openEditor"},initialize=function(e){e=e||{},r.editors.Base.prototype.initialize.call(this,e);if(!r.editors.List.Modal.ModalAdapter)throw new Error("A ModalAdapter is required");this.form=e.form;if(!e.form)throw new Error('Missing required option= "form"');this.template=e.template||this.constructor.template},render=function(){var e=this;return t.isEmpty(this.value)?this.openEditor()=(this.renderSummary(),setTimeout(function(){e.trigger("readyToAdd")},0)),this.hasFocus&&this.trigger("blur",this),this},renderSummary=function(){this.$el.html(e.trim(this.template({summary=this.getStringValue()})))},itemToString=function(e){var n=function(e){var t={key=e};return r.Field.prototype.createTitle.call(t)};e=e||{};var i=[];return t.each(this.nestedSchema,function(r,s){var o=r.title?r.title=n(s),u=e[s];if(t.isUndefined(u)||t.isNull(u))u="";i.push(o+"= "+u)}),i.join("<br />")},getStringValue=function(){var e=this.schema,n=this.getValue();return t.isEmpty(n)?"[Empty]"=e.itemToString?e.itemToString(n)=this.itemToString(n)},openEditor=function(){var e=this,n=this.form.constructor,i=this.modalForm=new n({schema=this.nestedSchema,data=this.value}),s=this.modal=new r.editors.List.Modal.ModalAdapter({content=i,animate=!0});s.open(),this.trigger("open",this),this.trigger("focus",this),s.on("cancel",this.onModalClosed,this),s.on("ok",t.bind(this.onModalSubmitted,this))},onModalSubmitted=function(){var e=this.modal,t=this.modalForm,n=!this.value,r=t.validate();if(r)return e.preventClose();this.value=t.getValue(),this.renderSummary(),n&&this.trigger("readyToAdd"),this.trigger("change",this),this.onModalClosed()},onModalClosed=function(){this.modal=null,this.modalForm=null,this.trigger("close",this),this.trigger("blur",this)},getValue=function(){return this.value},setValue=function(e){this.value=e},focus=function(){if(this.hasFocus)return;this.openEditor()},blur=function(){if(!this.hasFocus)return;this.modal&&this.modal.trigger("cancel")}},{template=t.template(" <div><%= summary %></div> ",null,r.templateSettings),ModalAdapter=n.BootstrapModal,isAsync=!0}),r.editors.List.Object=r.editors.List.Modal.extend({initialize=function(){r.editors.List.Modal.prototype.initialize.apply(this,arguments);var e=this.schema;if(!e.subSchema)throw new Error('Missing required option "schema.subSchema"');this.nestedSchema=e.subSchema}}),r.editors.List.NestedModel=r.editors.List.Modal.extend({initialize=function(){r.editors.List.Modal.prototype.initialize.apply(this,arguments);var e=this.schema;if(!e.model)throw new Error('Missing required option "schema.model"');var n=e.model.prototype.schema;this.nestedSchema=t.isFunction(n)?n()=n},getStringValue=function(){var e=this.schema,n=this.getValue();return t.isEmpty(n)?null=e.itemToString?e.itemToString(n)=(new e.model(n)).toString()}})})(n.Form)})