diff --git a/src/webui/extjs_dvb.c b/src/webui/extjs_dvb.c index 845630a5..952a1bc2 100644 --- a/src/webui/extjs_dvb.c +++ b/src/webui/extjs_dvb.c @@ -269,6 +269,26 @@ extjs_mpegts_network } else if (!strcmp(op, "class")) { htsmsg_t *c = idclass_serialize(&mpegts_network_class); htsmsg_add_msg(out, "entries", c); + } else if (!strcmp(op, "class_list")) { + mpegts_network_builder_t *mnb; + htsmsg_t *e, *c = htsmsg_create_list(); + LIST_FOREACH(mnb, &mpegts_network_builders, link) + if ((e = idclass_serialize(mnb->idc))) + htsmsg_add_msg(c, NULL, e); + htsmsg_add_msg(out, "entries", c); + } else if (!strcmp(op, "create")) { + htsmsg_t *conf = NULL; + const char *s, *c; + if (!(s = http_arg_get(&hc->hc_req_args, "conf"))) + return HTTP_STATUS_BAD_REQUEST; + if (!(c = http_arg_get(&hc->hc_req_args, "class"))) + return HTTP_STATUS_BAD_REQUEST; + if (!(conf = htsmsg_json_deserialize(s))) + return HTTP_STATUS_BAD_REQUEST; + pthread_mutex_lock(&global_lock); + mn = mpegts_network_build(c, conf); + if (mn) mn->mn_config_save(mn); + pthread_mutex_unlock(&global_lock); } else if (!strcmp(op, "mux_class")) { const idclass_t *idc; const char *uuid = http_arg_get(&hc->hc_req_args, "uuid"); @@ -322,7 +342,7 @@ extjs_mpegts_input (http_connection_t *hc, const char *remain, void *opaque) { mpegts_input_t *mi; - mpegts_network_t *mn; + //mpegts_network_t *mn; htsbuf_queue_t *hq = &hc->hc_reply; const char *op = http_arg_get(&hc->hc_req_args, "op"); htsmsg_t *out = htsmsg_create_map(); @@ -340,6 +360,7 @@ extjs_mpegts_input } else if (!strcmp(op, "class")) { htsmsg_t *list= idclass_serialize(&mpegts_input_class); htsmsg_add_msg(out, "entries", list); +#if 0 } else if (!strcmp(op, "network_class")) { const char *uuid = http_arg_get(&hc->hc_req_args, "uuid"); if (!uuid) return 404; @@ -359,6 +380,7 @@ extjs_mpegts_input else { // TODO: Check for error } +#endif } htsmsg_json_serialize(out, hq, 0); diff --git a/src/webui/static/app/idnode.js b/src/webui/static/app/idnode.js index a5747194..ff5082a9 100644 --- a/src/webui/static/app/idnode.js +++ b/src/webui/static/app/idnode.js @@ -193,8 +193,9 @@ tvheadend.idnode_editor = function(item, conf) */ tvheadend.idnode_create = function(conf) { - var puuid = null; - var panel = null; + var puuid = null; + var panel = null; + var pclass = null; /* Buttons */ var saveBtn = new Ext.Button({ @@ -203,7 +204,10 @@ tvheadend.idnode_create = function(conf) hidden : true, handler : function(){ params = conf.create.params || {} - params['uuid'] = puuid; + if (puuid) + params['uuid'] = puuid; + if (pclass) + params['class'] = pclass params['conf'] = Ext.util.JSON.encode(panel.getForm().getFieldValues()); Ext.Ajax.request({ url : conf.create.url || conf.url, @@ -265,6 +269,44 @@ tvheadend.idnode_create = function(conf) /* Do we need to first select a class? */ if (conf.select) { + var store = conf.select.store; + if (!store) { + store = new Ext.data.JsonStore({ + root : 'entries', + url : conf.select.url || conf.url, + baseParams : conf.select.params, + fields : [ conf.select.valueField, conf.select.displayField ] + }); + } + var select = null; + if (conf.select.propField) { + select = function (s, n, o) { + var r = store.getAt(s.selectedIndex); + if (r) { + var d = r.get(conf.select.propField); + if (d) { + pclass = r.get(conf.select.valueField); + win.setTitle('Add ' + s.lastSelectionText); + panel.remove(s); + build_form(d); + } + } + } + } else { + select = function (s, n, o) { + params = conf.select.clazz.params || {}; + params['uuid'] = puuid = n.data.uuid; + Ext.Ajax.request({ + url : conf.select.clazz.url || conf.select.url || conf.url, + success : function(d) { + panel.remove(s); + d = json_decode(d); + build_form(d.props); + }, + params : params + }); + }; + } /* Parent selector */ var combo = new Ext.form.ComboBox({ @@ -276,25 +318,9 @@ tvheadend.idnode_create = function(conf) valueField : conf.select.valueField, mode : 'remote', triggerAction : 'all', - store : new Ext.data.JsonStore({ - root : 'entries', - url : conf.select.url || conf.url, - baseParams : conf.select.params, - fields : [ conf.select.valueField, conf.select.displayField ] - }), + store : store, listeners : { - select: function (s, n, o) { - params = conf.select.clazz.params || {}; - params['uuid'] = puuid = n.data.uuid; - Ext.Ajax.request({ - url : conf.select.clazz.url || conf.select.url || conf.url, - success : function(d) { - panel.remove(s); - build_form(json_decode(d)); - }, - params : params - }); - } + select : select } }); @@ -305,7 +331,8 @@ tvheadend.idnode_create = function(conf) url : conf.url, params : conf.params, success : function(d) { - build_form(json_decode(d)); + d = json_decode(d); + build_form(d.props); win.show(); } }); @@ -577,7 +604,7 @@ tvheadend.idnode_grid = function(panel, conf) }, success : function(d) { - build(json_decode(d)); + build(json_decode(d).props); } }); } else { diff --git a/src/webui/static/app/mpegts.js b/src/webui/static/app/mpegts.js index 282380f4..ce39561d 100644 --- a/src/webui/static/app/mpegts.js +++ b/src/webui/static/app/mpegts.js @@ -1,33 +1,40 @@ -/* - * IDnode stuff - */ - /* * DVB network */ +tvheadend.network_classes = new Ext.data.JsonStore({ + autoLoad : true, + root : 'entries', + fields : [ 'class', 'caption', 'props' ], + id : 'class', + url : 'api/mpegts/network', + baseParams : { + op: 'class_list' + } +}); +tvheadend.comet.on('mpegts_network', function() { + tvheadend.network_classes.reload(); +}); + tvheadend.networks = function(panel) { tvheadend.idnode_grid(panel, { - titleS : 'Network', - titleP : 'Networks', + titleS : 'Network', + titleP : 'Networks', url : 'api/mpegts/network', comet : 'mpegts_network', add : { - url : 'api/mpegts/input', + url : 'api/mpegts/network', title : 'Network', select : { - caption : 'Input', - params : { op: 'list', limit: -1 }, - displayField : 'displayname', - valueField : 'uuid', - url : 'api/mpegts/input', - clazz : { - params : { op: 'network_class' } - } + caption : 'Type', + store : tvheadend.network_classes, + displayField : 'caption', + valueField : 'class', + propField : 'props', }, create : { - params : { op: 'network_create' } + params : { op: 'create' } } }, del : true @@ -40,6 +47,7 @@ tvheadend.muxes = function(panel) titleS : 'Mux', titleP : 'Muxes', url : 'api/mpegts/mux', + comet : 'mpegts_mux', add : { title : 'Mux', url : 'api/mpegts/network', @@ -66,6 +74,7 @@ tvheadend.services = function(panel) url : 'api/mpegts/service', titleS : 'Service', titleP : 'Services', + comet : 'service', add : false, del : false }); @@ -77,7 +86,8 @@ tvheadend.satconfs = function(panel) titleS : 'Satconf', titleP : 'Satconfs', url : 'api/linuxdvb/satconf', - add : { + comet : 'linuxdvb_satconf', + add : { title : 'Satconf', url : 'api/linuxdvb/satconf', create : {