The Framework Code

twigs/framework/admin/beans.twig

File List

{% set ajax = TRUE %}
{% set fwutils = TRUE %}
{% set validate = TRUE %}
{% set usebootbox = FALSE %}
{% set breadcrumbs = [{link: base, text: 'Home'}, {link: base ~ '/admin/', text: 'Admin'}, {text: 'Beans'}] %}

{% extends '@content/page.twig' %}

{% import '@content/iconmacro.twig' as i %}
{% import '@util/formmacro.twig' as f %}
{% import '@util/modalmacro.twig' as m %}

{% block setup %}
    function deltable(e)
    {
        fwdom.stop(e);
        let tr = this.closest('[data-bean]');
        let table = tr.getAttribute('data-bean');
        framework.confirm('Are you sure you you want to delete the '+table+' bean type?', function(r){
            if (r)
            { // user picked OK
                framework.ajax(base+'/ajax/table/'+table, {
                    method: 'DELETE',
                }).done(function(){
                    framework.fadetodel(tr);
                }).fail(function(jx){
                    framework.alert('<h3>Delete failed</h3>'+jx.responseText);
                });
            }
        });
    }
{% endblock setup %}

{% block onload %}
    fwdom.on('#nbform', 'submit', fwdom.nosubmit);
    fwdom.mkjQ('#nbform').parsley();
    fwdom.on('#addb', 'click', function(e){
        fwdom.stop(e);
        const btn = e.target;
        const form = document.getElementById('nbform');
        btn.disabled = true;
        let name = document.getElementById('xbn').value;
        let sp = null;
        let error = false;
        for (let x of document.querySelectorAll('[data-bean]'))
        {
            const t = x.getAttribute('data-bean');
            if (t === name)
            {
                error = true;
                break;
            }
            if (t > name)
            {
                sp = x;
                break;
            }
        }
        if (error)
        {
            framework.alert('That bean already exists');
            this.disabled = false;
            return;
        }
        let dt = {method: 'post'};
        let data = {};
        for (let v of ['field', 'sample'])
        {
            form.querySelectorAll('input[name="'+v+'[]"]').forEach(function(item, index){

                data[v+'[' + index + ']'] = item.value;
            });
        }
        dt['data'] = data;
        const fn = function(data){
            let newd = document.createElement('tr');
            newd.setAttribute('data-id', data);
            newd.innerHTML = '<td class="bname">'+name+'</td>'+
                '<td><a href="'+base+'/admin/view/table/'+name+'/">{{i.view()}}</a></td>'+
                '<td><a href="'+base+'/admin/edit/table/'+name+'/">{{i.edit()}}</a></td>'+
                '<td>{{i.delete('delb')}}</td>';
            fwdom.on('.delb', 'click', deltable, newd);
            if (sp === null)
            {
                document.getElementById('btab').appendChild(newd);
            }
            else
            {
                document.getElementById('btab').insertBefore(newd, sp);
            }
            bootstrap.Modal.getOrCreateInstance(document.getElementById('nbean')).hide();
        };
        framework.ajax('{{base}}/ajax/table/' + name, dt).done(fn).fail(function(jx){
            framework.alert('<h3>Failed to create new bean<h3>'+jx.responseText);
        }).always(function() { btn.disabled = false; });
    });
    fwdom.on('#nbean', 'show.bs.modal', function(e){
        document.getElementById('nbform').reset();
    });
    fwdom.on('.delb', 'click', deltable);
    fwdom.on('#addm', 'click', function(e) { framework.addMore(e); });
{% endblock onload %}

{% if not page is defined %}
    {% set page = 1 %}
    {% set pagesize = 10 %}
{% endif %}

{% set extra = '' %}

{% if all is defined %}
    {% if all %}
        {% set extra = 'all=1' %}
    {% endif %}
{% else %}
    {% set all = FALSE %}
{% endif %}

{% set beans = siteinfo.tables(all, page,  pagesize) %}

{% set pages = ((siteinfo.tablecount(all) + pagesize) / pagesize)|round(0, 'floor') %}

{% block headerbody %}
    <h1>Beans</h1>
{% endblock headerbody %}

{% block main %}
    <section class="row">
        <article class="offset-md-1 col-md-9">
            {% include '@util/message.twig' %}
            {% include '@util/paginate.twig' with { page : page, pagesize: pagesize, pages: pages, extra: extra } %}
            <table class="table table-responsive table-striped table-hover">
                <thead class="thead-inverse">
                    <tr>
                        <th>Name</th>
                        <th colspan="3">&nbsp;</th>
                    </tr>
                </thead>
                <tbody id="btab">
                    {% for nb in beans %}
                        <tr data-bean="{{nb.name}}">
                            <td class="bname">{{nb.name}}</td>
                            <td><a href="{{base}}/admin/view/table/{{nb.name}}">{{i.view('editb')}}</a></td>
                            <td><a href="{{base}}/admin/edit/table/{{nb.name}}">{{i.edit('editb')}}</a></td>
                            <td>{{i.delete('delb')}}</td>
                        </td>
                    {% else %}
                        <tr><td colspan="4">No beans defined</td></tr>
                    {% endfor %}
                </tbody>
            </table>
            {% include '@util/paginate.twig' with { page : page, pagesize: pagesize, pages: pages, extra: extra } %}
	    <p>{{m.invoke('#nbean', 'Add Bean')}}</p>
        </article>
    </section>
    {{m.open({id: 'nbean', title: 'New Bean'})}}
    <div class="modal-body">
        <form action="#" method="POST" id="nbform">
            {{f.text({label: 'Bean Name', id: 'xbn', name: 'name', ph: 'Bean name - alphanumeric characters only', required: TRUE,
                valid: { trigger: 'blur', pattern: '[A-Za-z][a-zA-Z0-9]*', 'remote-reverse': 'false', remote: base ~ '/ajax/tablecheck/{value}',
                'remote-message': 'That bean already exists'} })}}
            <fieldset id="example">
                {{f.text({label: 'Field Name', name: 'field[]', ph: 'Field name - alphanumeric characters only', valid: { trigger: 'blur', pattern: '[A-Za-z][a-zA-Z0-9]*'} })}}
                {{f.text({label: 'Sample Value', name: 'sample[]', ph: 'Field Sample Value'})}}
            </fieldset>
            <p id="mrow">
                <button class="btn btn-sm btn-info" id="addm" type="button">More</button>
            </p>
        </form>
    </div>
    {{m.close({action: 'Add', id: 'addb'})}}
{% endblock main %}

{% block pagefooter %}
{# I don't want a footer #}
{% endblock pagefooter %}