j-Editable
Este componente puede editar todos los elementos con la clase editable. Funciona con data-bind o valores dinámicos. Obtenga más información con el ejemplo.
Configuración:
autofocus{Booleano} enfoca el primer elemento (predeterminado:false)validate{Booleano} puede deshabilitar la validación (predeterminado:true)disabled{Booleano} puede deshabilitar la edición (agrega las clasesui-editable-disabledyui-editable-enabled), predeterminado:falsechanged{String} opcional, un enlace a un método o ruta --> contendrá el objeto solo con valores modificadosenter{String} opcional, un enlace a un métodomethod(path, value, el), el método se ejecuta si el usuario presionaENTERescape{String} opcional, un enlace a un métodomethod(path, value, el), el método se ejecuta si el usuario presionaESCcan{String} opcional, un enlace al métodomethod(opt, el)debe devolverboolean, significacan edit?error{String} opcional, se evalúa un enlace al métodomethod(el, isInvalid, meta)cuando el elemento no es válido y viceversa- NEW
class {String}opcional, agrega un nombre de clase con el formatoui-editable-CLASS(predeterminado:default)
El atributo data-editable describe el comportamiento:
path{String} una ruta relativa a la propiedad (se puede heredar dedata-bindautomáticamente)required{Booleano} opcional, habilita "obligatorio" (predeterminado:false)type{Cadena} opcional, puede serstring(predeterminado),date,number,boolean,emailohtmlNEWtagscan{String} opcional, una ruta afunction(opt, el)debe devolverboolean, significacan edit?save{String} opcional, se debe evaluar una ruta a la funciónfunction(opt, accepted(boolean)),acceptedformat{String} opcional, un formato paradate, predeterminado:yyyy-MM-dddirsource{String} opcional, ruta a una fuente de datosdircustom{Cadena/Booleano} opcional, puede contener una ruta afunction(val, next(new_val))o puede serBoolean. Esta opción puede permitir agregar un valor personalizado (valor no definido en la fuente de datos)dirrender{String} opcional, una ruta afunction(item, text)(debe devolver HTML paraj-Directory), esta función puede afectar la lista de elementos enj-Directorydirminwidth{Número} opcional, un ancho mínimo paraj-Directory, predeterminado:200dirmaxwidth{Número} opcional, un ancho máximo paraj-Directorydirplaceholder{String} opcional, un marcador de posición paraj-Directorydirempty{String} opcional, agrega un campo vacío paraj-Directorydirkey{String} opcional, un nombre clave para leertextendirsource(predeterminado:name)dirvalue{String} opcional, un nombre clave para leervalueendirsource(predeterminado:id)dirsearch{Booleano} opcional, puede desactivar la búsqueda dej-Directoryautosource{String} una ruta a la funciónsearchenautocomplete,function(search, render(arr))autovalue{String} una ruta de propiedad para el valor enautosourcemaxlength{Número} una longitud máximaminvalue{Número} por min. valor para el tipo de número (predeterminado:undefined)maxvalue{Número} un máx. valor para el tipo de número (predeterminado:undefined)rebind{Booleano} sitruevuelve a vinculardata-bindsolo en este elemento (predeterminado:0)validate{String} opcional, una condición para validar el valor, puede contener un enlace afunction(value)o!!value.match(/[a-z]+/)multiline{Booleano} opcional, habilita multilínea + agrega la claseeditable-multiline(inline-block+width:100%) cuando se está editando (predeterminado:false)raw{Booleano} opcional, cuandotrueentonces el contenido HTML actual será un marcador de posición si el valor esnullable(predeterminado:true)accept{String} opcional, una condición para aceptar un valor, puede contener un enlace afunction(value)o!!value.match(/[a-z]+/)es similar avalidateempty{String} opcional, habilita un valor vacío y puede contener una etiqueta vacía o1otruepararebindautomático de la carpetainvalid{String} opcional, se evalúa un enlace al métodomethod(el, isInvalid, meta)cuando el elemento no es válido y viceversa
Métodos:
- NUEVO:
component.changed()devuelve un objeto con datos modificados
Es bueno saberlo:
- si el usuario presiona algo de
keyentonces el elemento editable contendrá la clasekeypressedsiempre y cuando no haya abandonado el control - cada elemento modificado contendrá la clase
changed - si el componente cambia algunos valores, el elemento principal contendrá la clase
ui-editable-changed - si el elemento tiene
data-bindconempty, se borrará después del enfoque - NEW ahora admite el tipo
tags. Por ahora solo es compatible conrebindydata-bind. (el enlace de datostemplatecon{jQuery selector}funciona desde+v18) - NEW si el elemento (o padre, o padre de padre) contiene el atributo
data-disabled="1", el control estará deshabilitado - NEW elementos ocultos y deshabilitados no serán validados
Úselo con <ui-component name="editable">. Cuando el componente aún no está cargado, jComponent lo descarga en el primer uso desde la dirección en DEF.fallback (la CDN Componentator de forma predeterminada). Autor: Peter Širka. Fuente: repositorio de componentes Componentator, licencia MIT.
<style>
.changed {}
.changed::after { float: right; content: '+'; margin-left: 5px; font-weight: normal; color: orange; }
</style>
<ui-component name="LAZY datepicker"></ui-component>
<ui-component name="LAZY directory"></ui-component>
<ui-component name="editable" path="form">
<div style="width:500px;padding:10px;border:1px solid #E0E0E0">
<div class="row">
<div class="col-xs-3">
Name:
</div>
<div class="col-xs-9">
<ui-bind path="form.name" config="html" class="editable block" data-editable="required:true"></ui-bind>
</div>
</div>
<div class="row">
<div class="col-xs-3">
Email:
</div>
<div class="col-xs-9">
<ui-bind path="form.email" config="html" class="editable block" data-editable="required:1;type:email"></ui-bind>
</div>
</div>
<div class="row">
<div class="col-xs-3">
Nickname:
</div>
<div class="col-xs-9">
<ui-bind path="form.nickname" config="empty:Nickname;html" class="editable block" data-editable="required:true"></ui-bind>
</div>
</div>
<div class="row">
<div class="col-xs-3">
Framework:
</div>
<div class="col-xs-9">
<ui-bind class="editable block" config="html;empty:Choose a framework;change:renderframework" path="form.frameworkid" data-editable="dirsource:frameworks;"></ui-bind>
</div>
</div>
<div class="row">
<div class="col-xs-3">
Country:
</div>
<div class="col-xs-9">
<ui-bind path="form.countries" config="template:{#countrytags}" class="editable block" data-editable="rebind:1;dirsource:countries;type:tags"></ui-bind>
</div>
</div>
<div class="row">
<div class="col-xs-3">
Date:
</div>
<div class="col-xs-9">
<ui-bind path="form.date" config="html:(new Date() || value).format('yyyy-MM-dd')" class="editable block" data-editable="type:date"></ui-bind>
</div>
</div>
</div>
<pre><ui-bind path="form" config="html:JSON.stringify(value, null, ' ')"></ui-bind></pre>
</ui-component>
<script type="text/html" id="countrytags">
{{ foreach m in value }}<span class="editable-tag"><i class="ti ti-times"></i>{{ m }}</span>{{ end }}
</script>
<script>
// Alternative to tags (ui-bind path="path" config="change:myfunc")
function myfunc(data, path, el) {
if (!data)
return el.html('');
var template = '<span class="tag"><i class="ti ti-times"></i>{0}</span>';
var html = '';
for (var i = 0; i < data.length; i++)
html += template.format(data[i]);
el.html(html);
}
var frameworks = [{ id: 0, name: 'Nothing', template: '<b>{{ name }}</b>' }, { id: 1, name: 'jComponent' }, { id: 2, name: 'Angular.js' }, { id: 3, name: 'React' }];
var countries = ['Slovakia', 'Poland', 'Hungary', 'Germany', 'USA', 'Austria', 'Poland', 'Czechia'];
var form = {};
form.date = new Date();
form.name = 'Peter Širka';
form.countries = ['Slovakia', 'Hungary'];
form.frameworkid = 0;
function renderframework(value, path, el) {
return value ? frameworks.findValue('id', value, 'name', DEF.empty) : DEF.empty;
}
</script>