From adde4a3847c8298152b007e742dabd87cf4e7197 Mon Sep 17 00:00:00 2001 From: Nikolai R Kristiansen Date: Mon, 24 Nov 2014 20:50:59 +0100 Subject: [PATCH] Search field and cleanups --- mailadmin/static/app/scripts/main.js | 153 +++++++++------ mailadmin/static/app/styles/main.scss | 3 + mailadmin/static/app/templates/list.html | 6 +- mailadmin/static/app/templates/orgunits.html | 1 + mailadmin/static/dist/scripts/main.js | 181 ++++++++++-------- mailadmin/static/dist/scripts/templates.js | 13 +- mailadmin/static/dist/styles/main.css | 4 + mailadmin/templates/base.html | 1 + mailadmin/templates/{home.html => lists.html} | 3 +- mailadmin/templates/nav.html | 5 +- mailadmin/views.py | 8 +- mailadminsite/urls.py | 2 +- 12 files changed, 226 insertions(+), 154 deletions(-) rename mailadmin/templates/{home.html => lists.html} (84%) diff --git a/mailadmin/static/app/scripts/main.js b/mailadmin/static/app/scripts/main.js index 338c07c..8563e6d 100644 --- a/mailadmin/static/app/scripts/main.js +++ b/mailadmin/static/app/scripts/main.js @@ -14,15 +14,13 @@ } /* Get each word from the text, split by spaces, end line, semicolon, quotes, commas, colons, parens and brackets. */ - var words = text.split(/[\s\n;"',;:()<>[\]\\]+/), - emails = [], - distinct_emails; + var words = text.split(/[\s\n;"',;:()<>[\]\\]+/); // Regex for identifying an email address. var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; // For each of the words, add to the array of emails if the word matches the email regex. - emails = _.filter(words, function(word) { + var emails = _.filter(words, function(word) { return word.match(re); }); emails = _.map(emails, function(el) { @@ -34,7 +32,46 @@ function renderAlert(msg, alertClass, iconClass) { return nunjucks.render('alert.html', {'msg': msg, 'alertClass': alertClass, 'iconClass': iconClass}); } + function filter_lists_with_members(term, pushState) { + console.log(pushState); + if(pushState) { + /* Update query string */ + window.history.pushState(null, null, '/lists/?q=' + term); + } + /* Filter lists */ + var re_term = new RegExp(term); + $(".fwdlist").each(function() { + var cur_name = $(this).attr('data-list-name'); + var members = $(this).find('.member'); + var hits = _.filter(members, function(el) { + return re_term.test($(el).text()); + }); + if(re_term.test(cur_name) || hits.length !== 0) { + $(this).removeClass('hidden'); + } else { + $(this).addClass('hidden'); + } + }); + + } + // TODO combine with above + function filter_lists(prefix, pushState) { + if(pushState) { + /* Update query string */ + window.history.pushState(null, null, '/lists/?q=^' + prefix); + } + /* Filter lists */ + var re_prefix = new RegExp('^'+prefix); + $(".fwdlist").each(function() { + var cur_name = $(this).attr('data-list-name'); + if(re_prefix.test(cur_name)) { + $(this).removeClass('hidden'); + } else { + $(this).addClass('hidden'); + } + }); + } $(document).ready(function() { var csrf_token = $('meta[name=x-csrf-token]').attr('content'); @@ -43,14 +80,15 @@ fwd_delete: '/api/forward/', fwd_create: '/api/forward/', // + forwarder ou_list: '/api/orgunits/', - me: '/api/me/', + me: '/api/me/' }; + var forwards_container = $(".forwards-container"); nunjucks.configure({ autoescape: true }); - /* Home view (lists) */ + /* Lists view (home) */ if( $('body.home').length ) { $.getJSON(api_urls.ou_list, function(data) { - /* orgunit list */ + /* Load orgunit list */ var ou_html = nunjucks.render('orgunits.html', { orgunits: data }); $(".orgunit-list").append(ou_html); var ous_html = nunjucks.render('orgunits_select.html', { orgunits: data }); @@ -63,7 +101,7 @@ }); $('.new-list').html(new_list_html); - $('.new-list .js-new-list-name').on('keyup', function(e) { + $('.new-list .js-new-list-name').on('keyup', function() { var new_list_name = $('.new-list .js-new-list-name').val(); if(new_list_name === '') { new_list_name = 'Ny liste'; @@ -80,7 +118,8 @@ var prefix = $(this).parent().attr('data-value'); $('.new-list .prefix-btn').html(prefix+' '); }); - $('.new-list textarea').on('keyup', function(e) { + // TODO put this in a function with selector as argument + $('.new-list textarea').on('keyup', function() { var text = $(this).val(); var emails = parseEmails(text); @@ -114,22 +153,24 @@ return {'dest': dest, 'forward': el}; }); - $.post(api_urls.fwd_create, new_list[dest], function() { - $('.new-list-result').html(renderAlert('Lagt til ny liste: ' + dest, 'success')); - $('.new-list textarea').val(''); - $('.new-list .js-new-list-name').val(''); - }, 'json')); - var added_list_html = nunjucks.render('list.html', { - lists: new_list, - }); - $(".forwards-container").prepend(added_list_html); + $.post( + api_urls.fwd_create, + new_list[dest], + function() { + $('.new-list-result').html(renderAlert('Lagt til ny liste: ' + dest, 'success')); + $('.new-list textarea').val(''); + $('.new-list .js-new-list-name').val(''); + }, + 'json' + ); + var added_list_html = nunjucks.render('list.html', { lists: new_list }); + forwards_container.prepend(added_list_html); }); - /* Add list filter by orgunit */ + /* Filter lists by orgunit */ $(".orgunit-list a").on('click', function(e) { var prefix = $(this).attr('data-prefix'); - var querystring = $(this).attr('href'); e.preventDefault(); /* Toggle selection */ @@ -137,52 +178,29 @@ $(this).parent().toggleClass('active'); $('.orgunits-select').val(prefix); - /* Update query string */ - window.history.pushState(null, null, querystring); - - /* Filter lists */ - var re_prefix = new RegExp('^'+prefix); - $(".fwdlist").each(function(el) { - var cur_name = $(this).attr('data-list-name'); - if(re_prefix.test(cur_name)) { - $(this).removeClass('hidden'); - } else { - $(this).addClass('hidden'); - } - }); + filter_lists(prefix, true); + $('.js-lists-filter-field').val(''); }); - $(".orgunits-select").on('change', function(e) { + $(".orgunits-select").on('change', function() { var prefix = $(this).val(); - var querystring = '/lists/?q='+prefix; /* Toggle selection */ $(".orgunit-list li").removeClass('active'); $(".orgunit-list li a[data-prefix="+prefix+"]").parent().toggleClass('active'); - /* Update query string */ - window.history.pushState(null, null, querystring); - - /* Filter lists */ - var re_prefix = new RegExp('^'+prefix); - $(".fwdlist").each(function(el) { - var cur_name = $(this).attr('data-list-name'); - if(re_prefix.test(cur_name)) { - $(this).removeClass('hidden'); - } else { - $(this).addClass('hidden'); - } - }); + filter_lists(prefix, true); + $('.js-lists-filter-field').val(''); }); }); - /* Load forwards from API and write to container */ + /* Load forwards from API and put on page */ $.getJSON(api_urls.fwd_list, function(data) { if( !data.cpanelresult ) { - $(".forwards-container").html(renderAlert("No results.", 'info')); + forwards_container.html(renderAlert("No results.", 'info')); return; } if( 'error' in data.cpanelresult ) { - $(".forwards-container").html(renderAlert("Klarte ikke hente epostlister fra APIet: "+data.cpanelresult.error, 'danger')); + forwards_container.html(renderAlert("Klarte ikke hente epostlister fra APIet: "+data.cpanelresult.error, 'danger')); return; } @@ -193,11 +211,28 @@ api_urls: api_urls }); - $(".forwards-container").html(fw_html); + forwards_container.html(fw_html); + + /* Load filter from query string */ + var q_term = getParameterByName('q'); + if(q_term) { + if(q_term[0] === '^') { + filter_lists(q_term, false); + } else { + filter_lists_with_members(q_term, false); + } + } + /* Filter by search query */ + $('.js-lists-filter-field').on('keyup', function() { + var term = $(this).val(); + filter_lists_with_members(term, true); + $(".orgunit-list li").removeClass('active'); + $(".orgunit-list li:first-child").toggleClass('active'); + }); }); /* Mark row red for deletion and show delete button if applicable */ - $(".forwards-container").on('click', '[name=fwd-delete]', function(e) { + forwards_container.on('click', '[name=fwd-delete]', function() { $(this).parent().parent().parent().toggleClass('danger'); var tbody = $(this).closest('tbody'); var num_selected = tbody.find("[name=fwd-delete]:checked").length; @@ -208,8 +243,8 @@ } }); /* Delete selected */ - $(".forwards-container").on('click', '.js-del-selected', function(e) { - $(this).attr('data-delete-list-name'); + forwards_container.on('click', '.js-del-selected', function() { + var list_name = $(this).attr('data-delete-list-name'); var checked = $('[data-list-name="'+list_name+'"] [name="fwd-delete"]:checked'); var delete_these = _.map(checked, function(el) { return $(el).val(); @@ -227,21 +262,25 @@ // TODO remove list if no more rows }); }); + /* Toggles emails textarea */ - $(".forwards-container").on('click', '.js-toggle-email-textarea', function(e) { + forwards_container.on('click', '.js-toggle-email-textarea', function(e) { e.preventDefault(); var row = $(this).closest('tbody').find('.textarea-row'); row.toggleClass('visible'); }); + /* Add emails to current list */ - $(".forwards-container").on('click', '.js-new-email', function(e) { + forwards_container.on('click', '.js-new-email', function(e) { e.preventDefault(); // TODO refactor logic from new list and add here }); + /* New list toggle display */ $('.new-list-btn').on('click', function() { $('.new-list').toggleClass('visible'); }); } + }); })(); \ No newline at end of file diff --git a/mailadmin/static/app/styles/main.scss b/mailadmin/static/app/styles/main.scss index d23b9ff..c628c9e 100644 --- a/mailadmin/static/app/styles/main.scss +++ b/mailadmin/static/app/styles/main.scss @@ -19,6 +19,9 @@ $icon-font-path: "../fonts/"; display: block; } } +.search-field { + margin-bottom: 20px; +} .orgunit-list { margin-bottom: 40px; } diff --git a/mailadmin/static/app/templates/list.html b/mailadmin/static/app/templates/list.html index 2bffb58..9721531 100644 --- a/mailadmin/static/app/templates/list.html +++ b/mailadmin/static/app/templates/list.html @@ -5,11 +5,11 @@ {% for member in members %} - + {% endfor %} diff --git a/mailadmin/static/app/templates/orgunits.html b/mailadmin/static/app/templates/orgunits.html index 19a8716..635108e 100644 --- a/mailadmin/static/app/templates/orgunits.html +++ b/mailadmin/static/app/templates/orgunits.html @@ -1,3 +1,4 @@ +
  • Alle
  • {% for ou in orgunits %}
  • {{ ou.name }}
  • {% endfor %} \ No newline at end of file diff --git a/mailadmin/static/dist/scripts/main.js b/mailadmin/static/dist/scripts/main.js index 32aa3a0..84dfce1 100644 --- a/mailadmin/static/dist/scripts/main.js +++ b/mailadmin/static/dist/scripts/main.js @@ -14,15 +14,13 @@ } /* Get each word from the text, split by spaces, end line, semicolon, quotes, commas, colons, parens and brackets. */ - var words = text.split(/[\s\n;"',;:()<>[\]\\]+/), - emails = [], - distinct_emails; + var words = text.split(/[\s\n;"',;:()<>[\]\\]+/); // Regex for identifying an email address. var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; // For each of the words, add to the array of emails if the word matches the email regex. - emails = _.filter(words, function(word) { + var emails = _.filter(words, function(word) { return word.match(re); }); emails = _.map(emails, function(el) { @@ -34,7 +32,45 @@ function renderAlert(msg, alertClass, iconClass) { return nunjucks.render('alert.html', {'msg': msg, 'alertClass': alertClass, 'iconClass': iconClass}); } + function filter_lists_with_members(term, pushState) { + console.log(pushState); + if(pushState) { + /* Update query string */ + window.history.pushState(null, null, '/lists/?q=' + term); + } + /* Filter lists */ + var re_term = new RegExp(term); + $(".fwdlist").each(function() { + var cur_name = $(this).attr('data-list-name'); + var members = $(this).find('.member'); + var hits = _.filter(members, function(el) { + return re_term.test($(el).text()); + }); + if(re_term.test(cur_name) || hits.length !== 0) { + $(this).removeClass('hidden'); + } else { + $(this).addClass('hidden'); + } + }); + + } + function filter_lists(prefix, pushState) { + if(pushState) { + /* Update query string */ + window.history.pushState(null, null, '/lists/?q=^' + prefix); + } + /* Filter lists */ + var re_prefix = new RegExp('^'+prefix); + $(".fwdlist").each(function() { + var cur_name = $(this).attr('data-list-name'); + if(re_prefix.test(cur_name)) { + $(this).removeClass('hidden'); + } else { + $(this).addClass('hidden'); + } + }); + } $(document).ready(function() { var csrf_token = $('meta[name=x-csrf-token]').attr('content'); @@ -43,14 +79,15 @@ fwd_delete: '/api/forward/', fwd_create: '/api/forward/', // + forwarder ou_list: '/api/orgunits/', - me: '/api/me/', + me: '/api/me/' }; + var forwards_container = $(".forwards-container"); nunjucks.configure({ autoescape: true }); - /* Home view (lists) */ + /* Lists view (home) */ if( $('body.home').length ) { $.getJSON(api_urls.ou_list, function(data) { - /* OrgUnit list */ + /* Load orgunit list */ var ou_html = nunjucks.render('orgunits.html', { orgunits: data }); $(".orgunit-list").append(ou_html); var ous_html = nunjucks.render('orgunits_select.html', { orgunits: data }); @@ -63,7 +100,7 @@ }); $('.new-list').html(new_list_html); - $('.new-list .js-new-list-name').on('keyup', function(e) { + $('.new-list .js-new-list-name').on('keyup', function() { var new_list_name = $('.new-list .js-new-list-name').val(); if(new_list_name === '') { new_list_name = 'Ny liste'; @@ -80,7 +117,8 @@ var prefix = $(this).parent().attr('data-value'); $('.new-list .prefix-btn').html(prefix+' '); }); - $('.new-list textarea').on('keyup', function(e) { + // TODO put this in a function with selector as argument + $('.new-list textarea').on('keyup', function() { var text = $(this).val(); var emails = parseEmails(text); @@ -114,30 +152,24 @@ return {'dest': dest, 'forward': el}; }); - var deferreds = []; - $.each(new_list[dest], function(i, el) { - el.csrfmiddlewaretoken = csrf_token; - deferreds.push($.post(api_urls.fwd_create, el, function() {}, 'json')); - }); - $.when.apply($, deferreds).then(function(){ - // Success - $('.new-list-result').html(renderAlert('Lagt til ny liste: ' + dest, 'success')); - $('.new-list textarea').val(''); - $('.new-list .js-new-list-name').val(''); - }).fail(function(err){ - $('.new-list-result').html(renderAlert('Kunne ikke opprette ny liste \'' + dest +'\': '+ err, 'danger')); - }); - var added_list_html = nunjucks.render('list.html', { - lists: new_list, - }); - $(".forwards-container").prepend(added_list_html); + $.post( + api_urls.fwd_create, + new_list[dest], + function() { + $('.new-list-result').html(renderAlert('Lagt til ny liste: ' + dest, 'success')); + $('.new-list textarea').val(''); + $('.new-list .js-new-list-name').val(''); + }, + 'json' + ); + var added_list_html = nunjucks.render('list.html', { lists: new_list }); + forwards_container.prepend(added_list_html); }); - /* Add list filter by orgunit */ + /* Filter lists by orgunit */ $(".orgunit-list a").on('click', function(e) { var prefix = $(this).attr('data-prefix'); - var querystring = $(this).attr('href'); e.preventDefault(); /* Toggle selection */ @@ -145,52 +177,29 @@ $(this).parent().toggleClass('active'); $('.orgunits-select').val(prefix); - /* Update query string */ - window.history.pushState(null, null, querystring); - - /* Filter lists */ - var re_prefix = new RegExp('^'+prefix); - $(".fwdlist").each(function(el) { - var cur_name = $(this).attr('data-list-name'); - if(re_prefix.test(cur_name)) { - $(this).removeClass('hidden'); - } else { - $(this).addClass('hidden'); - } - }); + filter_lists(prefix, true); + $('.js-lists-filter-field').val(''); }); - $(".orgunits-select").on('change', function(e) { + $(".orgunits-select").on('change', function() { var prefix = $(this).val(); - var querystring = '/lists/?q='+prefix; /* Toggle selection */ $(".orgunit-list li").removeClass('active'); $(".orgunit-list li a[data-prefix="+prefix+"]").parent().toggleClass('active'); - /* Update query string */ - window.history.pushState(null, null, querystring); - - /* Filter lists */ - var re_prefix = new RegExp('^'+prefix); - $(".fwdlist").each(function(el) { - var cur_name = $(this).attr('data-list-name'); - if(re_prefix.test(cur_name)) { - $(this).removeClass('hidden'); - } else { - $(this).addClass('hidden'); - } - }); + filter_lists(prefix, true); + $('.js-lists-filter-field').val(''); }); }); - /* Load forwards from API and write to container */ + /* Load forwards from API and put on page */ $.getJSON(api_urls.fwd_list, function(data) { if( !data.cpanelresult ) { - $(".forwards-container").html(renderAlert("No results.", 'info')); + forwards_container.html(renderAlert("No results.", 'info')); return; } if( 'error' in data.cpanelresult ) { - $(".forwards-container").html(renderAlert("Klarte ikke hente epostlister fra APIet: "+data.cpanelresult.error, 'danger')); + forwards_container.html(renderAlert("Klarte ikke hente epostlister fra APIet: "+data.cpanelresult.error, 'danger')); return; } @@ -201,11 +210,28 @@ api_urls: api_urls }); - $(".forwards-container").html(fw_html); + forwards_container.html(fw_html); + + /* Load filter from query string */ + var q_term = getParameterByName('q'); + if(q_term) { + if(q_term[0] === '^') { + filter_lists(q_term, false); + } else { + filter_lists_with_members(q_term, false); + } + } + /* Filter by search query */ + $('.js-lists-filter-field').on('keyup', function() { + var term = $(this).val(); + filter_lists_with_members(term, true); + $(".orgunit-list li").removeClass('active'); + $(".orgunit-list li:first-child").toggleClass('active'); + }); }); /* Mark row red for deletion and show delete button if applicable */ - $(".forwards-container").on('click', '[name=fwd-delete]', function(e) { + forwards_container.on('click', '[name=fwd-delete]', function() { $(this).parent().parent().parent().toggleClass('danger'); var tbody = $(this).closest('tbody'); var num_selected = tbody.find("[name=fwd-delete]:checked").length; @@ -216,45 +242,44 @@ } }); /* Delete selected */ - $(".forwards-container").on('click', '.js-del-selected', function(e) { - $(this).attr('data-delete-list-name'); + forwards_container.on('click', '.js-del-selected', function() { + var list_name = $(this).attr('data-delete-list-name'); var checked = $('[data-list-name="'+list_name+'"] [name="fwd-delete"]:checked'); var delete_these = _.map(checked, function(el) { return $(el).val(); }); - var deferreds = []; - $.each(delete_these, function(i, el) { - var data = { - type: 'DELETE', - headers: {'X-CSRFToken': csrf_token}, - url: api_urls.fwd_delete + el + '/', - dataType: 'json' - }; - deferreds.push($.ajax(data)); - }); - $.when.apply($, deferreds).then(function(){ + var data = { + type: 'DELETE', + headers: {'X-CSRFToken': csrf_token}, + url: api_urls.fwd_delete, + data: delete_these, + dataType: 'json' + }; + $.ajax(data, function(){ // Success checked.closest('tr').remove(); // TODO remove list if no more rows - }).fail(function(err){ - $('[data-list-name="'+list_name+'"] .result-alert').html(renderAlert('Kunne ikke fjerne epostaliaser', 'danger')); }); }); + /* Toggles emails textarea */ - $(".forwards-container").on('click', '.js-toggle-email-textarea', function(e) { + forwards_container.on('click', '.js-toggle-email-textarea', function(e) { e.preventDefault(); var row = $(this).closest('tbody').find('.textarea-row'); row.toggleClass('visible'); }); + /* Add emails to current list */ - $(".forwards-container").on('click', '.js-new-email', function(e) { + forwards_container.on('click', '.js-new-email', function(e) { e.preventDefault(); // TODO refactor logic from new list and add here }); + /* New list toggle display */ $('.new-list-btn').on('click', function() { $('.new-list').toggleClass('visible'); }); } + }); })(); \ No newline at end of file diff --git a/mailadmin/static/dist/scripts/templates.js b/mailadmin/static/dist/scripts/templates.js index b8ca4a0..77e5f06 100644 --- a/mailadmin/static/dist/scripts/templates.js +++ b/mailadmin/static/dist/scripts/templates.js @@ -68,7 +68,7 @@ frame.set("loop.revindex0", t_7 - t_6 - 1); frame.set("loop.first", t_6 === 0); frame.set("loop.last", t_6 === t_7 - 1); frame.set("loop.length", t_7); -output += "\n\t\t\t\t\n\t\t\t"; } } frame = frame.pop(); -output += "\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n \t\t\t\n\t\t\t\n\t\t
    {{ member.forward }}
    {{ member.forward }}
    - Legg til + Legg til Slett @@ -19,7 +19,7 @@

    Eposter

    - +
    "; +output += "\n\t\t\t\t
    "; output += runtime.suppressValue(runtime.memberLookup((t_9),"forward", env.autoesc), env.autoesc); output += "
    \n\t\t\t\t\t Legg til\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t Legg til\n\t\t\t\t\n\t\t\t\t\t Slett\n\t\t\t\t
    \n\t\t\t\t\t

    Eposter

    \n \t\t\t\t\n \t\t\t\t\n \t\t\t
    \n\t\t
    \n\t\n\n"; +output += "\" placeholder=\"asdf@studentersamfundet.no, qwerty@studentersamfundet.no f.eks. Klipp og lim så mye du orker\" rows=\"4\">\n \t\t\t\t\n \t\t\t\n \t\t\t\n\t\t\t\n\t\t\n\t\t
    \n\t\n\n"; ; } } else { @@ -129,7 +129,7 @@ frame.set("loop.revindex0", t_13 - t_12 - 1); frame.set("loop.first", t_12 === 0); frame.set("loop.last", t_12 === t_13 - 1); frame.set("loop.length", t_13); -output += "\n\t\t\t\t"; +output += "\n\t\t\t\t"; output += runtime.suppressValue(runtime.memberLookup((t_15),"forward", env.autoesc), env.autoesc); output += "\n\t\t\t"; } } frame = frame.pop(); -output += "\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t Legg til\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t Legg til\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t Slett\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t

    Eposter

    \n \t\t\t\t\n \t\t\t\t\n \t\t\t\n \t\t\t\n\t\t\t\n\t\t\n\t\t
    \n\t\n\n"; +output += "\" placeholder=\"asdf@studentersamfundet.no, qwerty@studentersamfundet.no f.eks. Klipp og lim så mye du orker\" rows=\"4\">\n \t\t\t\t\n \t\t\t\n \t\t\t\n\t\t\t\n\t\t\n\t\t
    \n\t\n\n"; ; } } @@ -223,6 +223,7 @@ var lineno = null; var colno = null; var output = ""; try { +output += "
  • Alle
  • \n"; frame = frame.push(); var t_3 = runtime.contextOrFrameLookup(context, frame, "orgunits"); if(t_3) {var t_2 = t_3.length; diff --git a/mailadmin/static/dist/styles/main.css b/mailadmin/static/dist/styles/main.css index 71ac672..0a6823b 100644 --- a/mailadmin/static/dist/styles/main.css +++ b/mailadmin/static/dist/styles/main.css @@ -6560,6 +6560,10 @@ button.close { } } +.search-field { + margin-bottom: 20px; +} + .orgunit-list { margin-bottom: 40px; } diff --git a/mailadmin/templates/base.html b/mailadmin/templates/base.html index f38fd4b..5c8e0a6 100644 --- a/mailadmin/templates/base.html +++ b/mailadmin/templates/base.html @@ -24,6 +24,7 @@ + diff --git a/mailadmin/templates/home.html b/mailadmin/templates/lists.html similarity index 84% rename from mailadmin/templates/home.html rename to mailadmin/templates/lists.html index c79c4c1..98bd429 100644 --- a/mailadmin/templates/home.html +++ b/mailadmin/templates/lists.html @@ -4,8 +4,9 @@
    diff --git a/mailadmin/templates/nav.html b/mailadmin/templates/nav.html index fac54bc..b2b4aa4 100644 --- a/mailadmin/templates/nav.html +++ b/mailadmin/templates/nav.html @@ -5,13 +5,10 @@ - lister.neuf.no + lister.neuf.no