Mercurial > libervia-templates
diff sat_templates/templates/default/input/xmlui.html @ 164:e9f0a4215e46
multi-sites handling (moved templates to "templates" sub-directory) + noscript styles handling.
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 10 Sep 2018 08:53:33 +0200 |
parents | sat_templates/default/input/xmlui.html@33c7ce833d3f |
children | 4b5ad18f6ece |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sat_templates/templates/default/input/xmlui.html Mon Sep 10 08:53:33 2018 +0200 @@ -0,0 +1,237 @@ +{% import 'input/field.html' as field %} + +{# generate methods #} + +{% macro generate_container(cont, config) %} + {% if cont.type == 'vertical' %} + {{ vertical_container(cont, config) }} + {% elif cont.type == 'pairs' %} + {{ pairs_container(cont, config) }} + {% elif cont.type == 'label' %} + {{ label_container(cont, config) }} + {% endif %} +{% endmacro %} + +{% macro generate_widget(wid, config, id=none) %} + {% if wid.type == 'text' %} + {{ text_widget(wid, config, id=id) }} + {% elif wid.type == 'label' %} + {{ label_widget(wid, config) }} + {% elif wid.type == 'string' %} + {{ string_widget(wid, config, id=id) }} + {% elif wid.type == 'jid' %} + {# TODO: proper JID widget #} + {{ string_widget(wid, config, id=id) }} + {% elif wid.type == 'textbox' %} + {{ textbox_widget(wid, config, id=id) }} + {% elif wid.type == 'list' %} + {{ list_widget(wid, config, id=id) }} + {% endif %} +{% endmacro %} + +{% macro generate_children(cont, config) %} + {% for child in cont.children %} + {% if child.category == 'container' %} + {{ generate_container(child, config) }} + {% else %} + {{ generate_widget(child, config) }} + {% endif %} + {% endfor %} + +{% endmacro %} + +{% macro generate(xmlui, form=true, filters=none, attributes=none) %} +{# generate HTML from XMLUI + @param xmlui(template_xmlui.XMLUIPanel): xmlui to use + @param form(bool): if true will generate form elements + @param filters(dict,none): filters as expected by item_filter + @param attributes(dict,none): extra attributes to put on named widgets +#} + {% set config = {'form':form, 'filters':filters or {}, 'attrs': attributes or {}} %} + {{ generate_container(xmlui.main_cont, config) }} +{% endmacro %} + +{% macro generate_table(xmlui_items, fields, formatters, tr_class_fields, on_click) %} +{# generate a HTML table from requested widgets names + @param xmlui_items(iterable[unicode]): list of xmlui to show (one per row) + @param fields(tuple[unicode,unicode]): fields to show (name, label) + @param formatters(dict): dictionary of templates to format values: + field_name => template + if no formatter is set (or None is used) for a field, it will be used unmodified. + current xmlui items will be set as "item" key + @param tr_class_fields(iterable[unicode]): name of fields to use as class + class will be "{name}_{value}" where name is field name, and value field value + all lowercase/stripped + @param on_click(data_objects.OnClick): thing to do when clicking on a row +#} + {% if formatters is undefined %} + {% set formatters = {} %} + {% endif %} + {% if on_click is undefined %} + {% set on_click = {} %} + {% endif %} + <table> + <thead> + <tr> + {% for name,label in fields %} + <th>{{ label }}</th> + {% endfor %} + </tr> + </thead> + <tbody> + {% for xmlui in xmlui_items %} + {% set link=on_click.formatUrl(item=xmlui.widget_value) if on_click.url else none %} + <tr {{ {'class': xmlui|xmlui_class(tr_class_fields)}|xmlattr }}> + + {% for name,label in fields %} + <td {{ {'class': 'td_'+name}|xmlattr }}> + {% for value in xmlui.widgets[name].values %} + <a {{ {'href':link}|xmlattr }}>{{ value|adv_format(formatters.get(name),item=xmlui.widget_value) }}</a> + {% endfor %} + </td> + {% endfor %} + </tr> + {% endfor %} + </tbody> + </table> +{% endmacro %} + + + + +{% macro generate_list(xmlui_items, fields, formatters, item_class_fields, on_click) %} +{# generate a list of rendered XMLUI from requested widgets names + very similar to generate_table but generate a list instead of a tabme + @param xmlui_items(iterable[unicode]): list of xmlui to show + @param fields(tuple[unicode,unicode]): fields to show (name, label) + @param formatters(dict): dictionary of templates to format values: + field_name => template + if no formatter is set (or None is used) for a field, it will be used unmodified. + current xmlui items will be set as "item" key for the template + @param item_class_fields(iterable[unicode]): name of fields to use as class + class will be "{name}_{value}" where name is field name, and value field value + all lowercase/stripped + @param on_click(data_objects.OnClick): thing to do when clicking on a row +#} + {% if formatters is undefined %} + {% set formatters = {} %} + {% endif %} + {% if on_click is undefined %} + {% set on_click = {} %} + {% endif %} + <ul class="xmlui_list"> + {% for xmlui in xmlui_items %} + <li> + {% set link=on_click.formatUrl(item=xmlui.widget_value) if on_click.url else none %} + <a {{ {'class': xmlui|xmlui_class(item_class_fields), + 'href':link}|xmlattr }}> + {% for name,label in fields %} + <span {{ {'class': 'xmlui_field__'+name}|xmlattr }}> + {% for label in xmlui.widgets.get(name, {}).labels %} + <span>{{ label|adv_format(formatters.get(name),item=xmlui.widget_value) }}</span> + {% endfor %} + </span> + {% endfor %} + </a> + </li> + {% endfor %} + </ul> +{% endmacro %} + + + + + +{# containers #} + +{% macro vertical_container(cont, config) %} + <div class="xmlui_cont xmlui_cont_vertical"> + {{ generate_children(cont, config) }} + </div> +{% endmacro %} + +{% macro pairs_container(cont, config) %} + {# TODO: proper impelmentation (do the same as vertical container for now #} + <div class="xmlui_cont xmlui_cont_vertical"> + {{ generate_children(cont, config) }} + </div> +{% endmacro %} + +{% macro label_container(cont, config) %} + <div class="xmlui_cont xmlui_cont_vertical"> + {% for child in cont.children %} + {% if loop.index is odd %} + {# label #} + {% if child.type == 'label' %} + {% set for_ = ('wid_' + (child.for_name or child.name or '_noname'))|next_gidx %} + {{ label_widget(child, config, for=for_) }} + {% endif %} + {% else %} + {# widget #} + {% set id = ('wid_' + (child.name or '_noname'))|cur_gidx %} + {{ generate_widget(child, config, id=id) }} + {% endif %} + {% endfor %} + </div> +{% endmacro %} + + +{# widgets #} + +{% macro text_widget(wid, config, id=none) %} + <p class="xmlui_widget xmlui_text" {{ {'id':id}|xmlattr }}> + {{- wid|item_filter(config.filters)|default('\u00A0',true) -}} + </p> +{% endmacro%} + +{% macro label_widget(wid, config, for=none) %} + {% if config.form %} + <label class="xmlui_widget xmlui_label" {{ {'for':for}|xmlattr }}> + {{wid|item_filter(config.filters)}} + </label> + {% else %} + <span class="xmlui_widget xmlui_label" {{ {'id':none if not for else 'label_%s'|format(for)}|xmlattr }}>{{wid|item_filter(config.filters)}}</span> + {% endif %} +{% endmacro%} + +{% macro string_widget(wid, config, id=none) %} + {% if config.form %} + <input class="xmlui_widget xmlui_string" type="text" {{ {'name':wid.name, 'id':id, 'value':wid|item_filter(config.filters)}|dict_ext(config.attrs, wid.name)|xmlattr }}> + {% else %} + <div class="xmlui_widget xmlui_string" {{ {'id':id}|xmlattr }}> + {{- wid|item_filter(config.filters)|default('\u00A0',true) -}} + </div> + {% endif %} +{% endmacro%} + +{% macro textbox_widget(wid, config, id=none) %} + {% if config.form %} + <textarea class="xmlui_widget xmlui_textbox" rows="10" cols="50" {{ {'name':wid.name, 'id':id}|dict_ext(config.attrs, wid.name)|xmlattr }}> + {{- wid|item_filter(config.filters) -}} + </textarea> + {% else %} + <p class="xmlui_widget xmlui_textbox" {{ {'id':id}|xmlattr }}> + {{- wid|item_filter(config.filters) -}} + </p> + {% endif %} +{% endmacro%} + +{% macro list_widget(wid, config, id=none) %} + {% if config.form %} + <select class="xmlui_widget xmlui_list" {{ {'name':wid.name, 'id':id}|dict_ext(config.attrs, wid.name)|xmlattr }}> + {% for value,label in wid.options %} + <option {{ {'value':value}|xmlattr }} {{ 'selected' if value in wid.selected }}> + {{- label -}} + </option> + {% endfor %} + </select> + {% else %} + <div class="xmlui_widget xmlui_list" {{ {'id':id}|xmlattr }}> + {% for value,label in wid.items %} + <span class="xmlui_list_item value_{{value|attr_escape}}"> + {{- label -}} + </span> + {% endfor %} + </div> + {% endif %} +{% endmacro%}