diff --git a/admin/tools/groups.tool b/admin/tools/groups.tool new file mode 100644 index 0000000000000000000000000000000000000000..83e315a62d151b8dfe729bc840bb7e938623d1c1 --- /dev/null +++ b/admin/tools/groups.tool @@ -0,0 +1,355 @@ +<div> + <table class="table table-hover groups-table"> + <thead> + <tr> + </tr> + </thead> + <tbody> + </tbody> + </table> +</div> + +<script type="text/javascript"> + var groups = { + showInTable: ['name'], + curUserData: null, + + // Page + page: { + max: Number.MAX_VALUE, + cur: function() { + return parseInt(tools.mem.session.get('curPage')); + }, + set: function(num) { + num = parseInt(num); + if (num > 0 && num < groups.page.max + 1) + tools.mem.session.set('curPage', num); + $('.groups-cur-page-cont').html(groups.page.cur()); + groups.get(); + }, + inc: function() { + groups.page.set(groups.page.cur() + 1); + }, + dec: function() { + groups.page.set(groups.page.cur() - 1); + } + }, + + //Sorting + sort: { + cur: function() { + return tools.mem.session.get('curSort'); + }, + set: function(sort) { + tools.mem.session.set('curSort', sort); + groups.get(); + }, + inv: function() { + var tmp = groups.sort.cur(); + if (tmp.charAt(0) == '-') + groups.sort.set(tmp.slice(1)); + else + groups.sort.set('-' + tmp); + } + }, + + //Searching + search: { + cur: function() { + return tools.mem.session.get('search'); + }, + set: function(dom, val) { + tools.mem.session.set('search', dom + '==' + val); + groups.page.set(1); + }, + clr: function() { + tools.mem.session.set('search', ''); + groups.page.set(1); + }, + }, + + // Get groups + get: function() { + amivcore.groups.GET({ + data: { + 'max_results': '50', + page: groups.page.cur(), + sort: groups.sort.cur(), + where: groups.search.cur(), + } + }, function(ret) { + + if (ret === undefined || ret['_items'].length == 0) { + tools.log('No Data', 'w'); + return; + } + + groups.meta = ret['_meta']; + groups.page.max = Math.ceil(groups.meta.total / groups.meta.max_results); + $('.groups-page-max-cont').html(groups.page.max); + + // Clear table from previous contentent + $('.groups-table thead tr, .groups-table tbody').html(''); + + groups.showInTable.forEach(function(i) { + $('.groups-table thead tr').append('<th>' + i + '</th>'); + }); + + for (var n in ret['_items']) { + var tmp = ''; + groups.showInTable.forEach(function(i) { + tmp += '<td>' + ret['_items'][n][i] + '</td>'; + }); + $('.groups-table tbody').append('<tr data-id="' + ret['_items'][n]['id'] + '">' + tmp + '</tr>'); + } + $('.groups-table tbody tr').click(groups.showDetails); + }); + }, + + // Make Modal with editable table data + showDetails: function() { + amivcore.groups.GET({ + id: $(this).attr('data-id') + }, function(ret) { + console.log(ret); + curUserData = ret; + + var tmp = '<div class="groups-edit-cont" data-etag="' + ret['_etag'] + '" data-id="' + ret['id'] + '">'; + for (var cur in ret) + if (cur.charAt(0) != '_') + if (cur == 'user_subscribers') { + tmp += '<p><strong>Subscribed: <kbd>' + ret[cur].length + '</kbd> <kbd class="groups-show-users"><span class="glyphicon glyphicon-edit" aria-hidden="true"></span></kbd></strong></p>'; + } else { + switch (amivcore.getParamType('groups', cur)) { + case 'boolean': + tmp += '<div class="checkbox"><label><input type="checkbox" value="' + ret[cur] + '" name="' + cur + '">' + cur + '</label></div>'; + break; + + case 'integer': + tmp += '<div class="form-group"><label>' + cur + ':</label><input type="number" value="' + ret[cur] + '" class="form-control" name="' + cur + '" min="0" step="1"></div>'; + break; + + default: + tmp += '<div class="form-group"><label>' + cur + ':</label><input type="text" value="' + ret[cur] + '" class="form-control" name="' + cur + '"></div>'; + break; + } + } + tmp += '</div>'; + + tools.modal({ + head: ret.firstname + ' ' + ret.lastname, + body: tmp, + button: { + 'Delete': { + type: 'danger', + callback: function() { + if (confirm('Fo\' shizzle my nizzle? U fo\' real?')) + amivcore.groups.DELETE({ + id: $('.groups-edit-cont').first().attr('data-id'), + header: { + 'If-Match': $('.groups-edit-cont').attr('data-etag') + }, + }, function(ret) { + if (ret === undefined) { + tools.log('Group successfully deleted', 's'); + groups.get(); + tools.modalClose(); + } else { + tools.log('Error', 'e'); + } + }); + } + }, + 'Update': { + type: 'success', + close: true, + callback: groups.inspect, + }, + } + }); + + }); + + $('.groups-show-users').off('click').on('click', function() { + console.log($('groups-edit-cont').first().attr('data-id')); + }); + }, + + // Check wether changes were maid and saves it in that case + inspect: function() { + var newUserData = {}; + $('.groups-edit-cont tr').each(function() { + newUserData[$(this).children('td:nth-child(1)').html()] = $(this).children('td:nth-child(2)').html(); + }); + var changed = false, + curUserDataChanged = {}; + for (var i in newUserData) { + if (newUserData[i] != String(curUserData[i])) { + changed = true; + curUserDataChanged[i] = newUserData[i]; + } + } + if (changed) { + amivcore.groups.PATCH({ + id: curUserData.id, + header: { + 'If-Match': $('.groups-edit-cont').attr('data-etag') + }, + data: curUserDataChanged + }, function() { + tools.log('User Updated', 's'); + groups.get(); + }); + } + }, + + //Make new user + add: function() { + var tmp = '<div class="row groups-user-add-form">' + + '<div class="form-group"><label for="groups-name">Name:</label><input type="text" class="form-control" name="name" id="groups-name"></div>' + + '<div class="form-group"><label for="groups-moderator">Group Admin:</label><input type="text" class="form-control" id="groups-moderator" name="moderator_id"></div>' + + '<label class="checkbox-inline"><input type="checkbox" name="has_zoidberg_share">Has Zoidberg share</label>' + + '<label class="checkbox-inline pull-right"><input type="checkbox" name="allow_self_enrollment">Self-Enrollment</label>' + + '</div>'; + tools.modal({ + head: 'Create Group', + body: tmp, + button: { + 'Add': { + type: 'success', + callback: function() { + var modName = $('#groups-moderator').val().trim().split(' '); + if (modName.length != 2) { + tools.log('Wrong input for Moderator', 'w'); + return; + } + amivcore.users.GET({ + data: { + where: 'firstname==' + modName[0] + ';lastname==' + modName[1] + } + }, function(ret) { + if (ret['_items'].length !== 1) { + tools.log('Moderator not found', 'w'); + return; + } + var newUserData = {}; + $('.groups-user-add-form input').each(function() { + newUserData[$(this).attr('name')] = $(this).val(); + }); + newUserData['moderator_id'] = ret['_items'][0].id; + console.log(newUserData); + amivcore.groups.POST({ + data: newUserData + }, function(ret) { + if (!ret.hasOwnProperty('_status') || ret['_status'] != 'OK') + tools.log(JSON.stringify(ret.responseJSON['_issues']), 'e'); + else { + tools.modalClose(); + tools.log('Group Created', 's'); + groups.get(); + } + }); + }); + } + } + } + }); + } + }; + + // Setup Menu + tools.ui.menu({ + '<span class="glyphicon glyphicon-plus" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="New Group"></span>': { + callback: groups.add + }, + '<span class="glyphicon glyphicon-arrow-left" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Previous Page"></span>': { + callback: groups.page.dec + }, + '<span data-toggle="tooltip" data-placement="bottom" title="Set Page"><span class="groups-cur-page-cont" aria-hidden="true"></span> / <span class="groups-page-max-cont" aria-hidden="true"></span></span>': { + callback: function() { + tools.modal({ + head: 'Go To Page:', + body: '<div class="form-group"><input type="number" value="' + groups.page.cur() + '" class="form-control groups-go-page"></div>', + button: { + 'Go': { + type: 'success', + close: true, + callback: function() { + groups.page.set($('.groups-go-page').val()); + }, + } + } + }); + } + }, + '<span class="glyphicon glyphicon-arrow-right" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Next Page"></span>': { + callback: groups.page.inc + }, + '<span class="glyphicon glyphicon-sort" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Sort"></span>': { + callback: function() { + var tmp = '<div class="form-group"><select class="form-control groups-sort-select">'; + var cur = groups.sort.cur(); + ['name'].forEach(function(i) { + tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>⇡ ' + i + '</option>'; + tmp += '<option value="-' + i + '"' + (('-' + i == cur) ? ' selected' : '') + '>⇣ ' + i + '</option>'; + }); + tmp += '</select></div>'; + tools.modal({ + head: 'Sort', + body: tmp, + button: { + 'Sort': { + type: 'success', + close: true, + callback: function() { + groups.sort.set($('.groups-sort-select').val()); + } + } + } + + }); + } + }, + '<span class="glyphicon glyphicon-search" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Search"></span>': { + callback: function() { + var tmp = '<div class="form-group"><select class="form-control groups-search-select">'; + var cur = groups.search.cur(); + if (cur === null || cur == '') + cur = ''; + else + cur = cur.split('==')[1]; + ['name'].forEach(function(i) { + tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>' + i + '</option>'; + }); + tmp += '</select><br><input type="text" value="' + cur + '" class="form-control groups-search-val"></div>'; + tools.modal({ + head: 'Search', + body: tmp, + button: { + 'Clear': { + type: 'warning', + close: true, + callback: groups.search.clr, + }, + 'Search': { + type: 'success', + close: true, + callback: function() { + groups.search.set($('.groups-search-select').val(), $('.groups-search-val').val()); + } + }, + } + }) + } + } + }); + + //Set Toolpit + $('[data-toggle="tooltip"]').tooltip() + + // Set Initail Page and get first groups + if (groups.page.cur() === null || isNaN(groups.page.cur())) + groups.page.set(1); + else + groups.page.set(groups.page.cur()); +</script>