<!DOCTYPE html> <html> <head> <base target="_top"> <script src="https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4/dist/js/bootstrap.min.js"></script> <script defer src="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/js/all.min.js"></script> <link href="https://cdn.jsdelivr.net/npm/bootswatch@4/dist/materia/bootstrap.min.css" rel="stylesheet" /> <style>body{padding-top:40px}</style> </head> <body> <div class="container"> <div class="row"> <div class="col-auto mr-auto"> <h1><span class="fas fa-users fa-fw"></span>Google Group Directory Listings</h1> </div> <div class="col-auto"> <button type="button" id="refresh" class="btn btn-primary btn-lg"><span class="fas fa-sync"></span></button> </div> </div> <div id="content" class="row"> </div> </div> <script> $(document).ready(function() { getGroups(); }); function getGroups() { $('#refresh').addClass('disabled').html('<span class="fas fa-spin fa-sync"></span>').off(); google.script.run.withSuccessHandler(updateCards).withFailureHandler(handleError).getAllGroups(); } function updateCards(groups) { console.log('Updating all groups...'); let content = ''; for (let group of groups) { let id = sanitizeForId(group.email); content += '<div class="col-12 col-md-6 col-xl-4">'; content += '<div id="' + id + '" class="card border-light mb-3">'; content += '<div class="card-header">' + group.email + ' <small>(' + group.directMembersCount + ')</small></div>'; content += '<div class="card-body">'; content += '<h4 class="card-title">' + group.name + '</h4>'; content += '<p id="' + id + '-status" class="card-text"><button id="' + id + '-button" type="button" class="btn btn-sm btn-secondary disabled">Loading...</button></p>'; content += '</div>'; content += '</div>'; content += '</div>'; } $('#content').empty().html(content); console.log('Updated all groups! Updating statuses for each card...'); let delay = 0; // avoid requesting all groups at once, apps script has a concurrent script limit for (let group of groups) { setTimeout(() => {google.script.run.withSuccessHandler(updateCardStatus).withFailureHandler(handleError).getGroupSettings(group.email)}, delay); delay += 50; // ms } $('#refresh').removeClass('disabled').html('<span class="fas fa-sync"></span>').click(getGroups); } function handleError(error) { console.error(error); } function updateCardStatus(settings) { console.log('Updating Card for ' + settings.email + '...'); let id = sanitizeForId(settings.email); let card = $('#' + id); let status = $('#' + id + '-status'); card.removeClass('border-light border-success border-danger border-warning'); if (settings.includeInGlobalAddressList == 'true') { card.addClass('border-success'); status.html('<button id="' + id + '-button" onclick="unlist(\'' + settings.email + '\')" type="button" class="btn btn-sm btn-success"><span class="fas fa-minus fa-fw"></span>Unlist from Directory</button>'); } else if (settings.includeInGlobalAddressList == 'false') { card.addClass('border-danger'); status.html('<button id="' + id + '-button" onclick="relist(\'' + settings.email + '\')" type="button" class="btn btn-sm btn-danger"><span class="fas fa-plus fa-fw"></span>Relist to Directory</button>'); } else { card.addClass('border-warning'); status.html('<button id="' + id + '-button" type="button" class="btn btn-sm btn-warning disabled">Error</button>'); } } function unlist(groupId) { console.log('Unlisting ' + groupId + '...'); $('#' + sanitizeForId(groupId) + '-button').addClass('disabled').prop('onclick', null).off('click'); google.script.run.withSuccessHandler(updateCardStatus).withFailureHandler(handleError).showGroupInDirectory(groupId, 'false'); } function relist(groupId) { console.log('Relisting ' + groupId + '...'); $('#' + sanitizeForId(groupId) + '-button').addClass('disabled').prop('onclick', null).off('click'); google.script.run.withSuccessHandler(updateCardStatus).withFailureHandler(handleError).showGroupInDirectory(groupId, 'true'); } function sanitizeForId(email) { return email.replace(/@|\./g, '').trim().toLowerCase(); } </script> </body> </html>