Added conference list page, administration tools, and re-designed conference administration
This commit is contained in:
+123
-108
@@ -1,115 +1,130 @@
|
||||
(function() {
|
||||
var pens = {};
|
||||
var pens = {};
|
||||
|
||||
Array.prototype.forEach.call(document.querySelectorAll('.textarea'), function(editor) {
|
||||
var event= editor.dataset.editOn;
|
||||
if (event == 'load') {
|
||||
startEditing(editor);
|
||||
} else {
|
||||
editor.addEventListener(event, function() {
|
||||
if (editor.getAttribute('contenteditable') !== 'true') {
|
||||
startEditing(editor);
|
||||
// for content editable, we need to refocus to show the caret
|
||||
editor.blur();
|
||||
editor.focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
Array.prototype.forEach.call(document.querySelectorAll('.textarea'), function(editor) {
|
||||
var event= editor.dataset.editOn;
|
||||
if (event == 'load') {
|
||||
startEditing(editor);
|
||||
} else {
|
||||
editor.addEventListener(event, function() {
|
||||
if (editor.getAttribute('contenteditable') !== 'true') {
|
||||
startEditing(editor);
|
||||
// for content editable, we need to refocus to show the caret
|
||||
editor.blur();
|
||||
editor.focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function startEditing(editor) {
|
||||
var name = editor.dataset.name;
|
||||
pens[name] = new Pen({
|
||||
editor: editor,
|
||||
class: 'pen',
|
||||
textarea: '<textarea name="' + name + '"></textarea>',
|
||||
list: ['p', 'h1', 'h2', 'blockquote', 'insertorderedlist', 'insertunorderedlist', 'bold', 'italic', 'underline', 'strikethrough', 'createlink', 'insertimage'],
|
||||
title: {
|
||||
'p': 'Paragraph',
|
||||
'h1': 'Major Heading',
|
||||
'h2': 'Minor Heading',
|
||||
'blockquote': 'Quotation',
|
||||
'insertorderedlist': 'Ordered List',
|
||||
'insertunorderedlist': 'Unordered List',
|
||||
'bold': 'Bold',
|
||||
'italic': 'Italic',
|
||||
'underline': 'Underline',
|
||||
'strikethrough': 'Strikethrough',
|
||||
'createlink': 'Link',
|
||||
'insertimage': 'Image'
|
||||
}
|
||||
});
|
||||
return pens[name];
|
||||
}
|
||||
function startEditing(editor) {
|
||||
var name = editor.dataset.name;
|
||||
pens[name] = new Pen({
|
||||
editor: editor,
|
||||
class: 'pen',
|
||||
textarea: '<textarea name="' + name + '"></textarea>',
|
||||
list: ['p', 'h1', 'h2', 'blockquote', 'insertorderedlist', 'insertunorderedlist', 'bold', 'italic', 'underline', 'strikethrough', 'createlink', 'insertimage'],
|
||||
title: {
|
||||
'p': 'Paragraph',
|
||||
'h1': 'Major Heading',
|
||||
'h2': 'Minor Heading',
|
||||
'blockquote': 'Quotation',
|
||||
'insertorderedlist': 'Ordered List',
|
||||
'insertunorderedlist': 'Unordered List',
|
||||
'bold': 'Bold',
|
||||
'italic': 'Italic',
|
||||
'underline': 'Underline',
|
||||
'strikethrough': 'Strikethrough',
|
||||
'createlink': 'Link',
|
||||
'insertimage': 'Image'
|
||||
}
|
||||
});
|
||||
return pens[name];
|
||||
}
|
||||
|
||||
Array.prototype.forEach.call(document.querySelectorAll('form'), function(form) {
|
||||
var shouldAllowAlert = false;
|
||||
form.addEventListener('submit', function() {
|
||||
if (shouldAllowAlert) {
|
||||
return;
|
||||
}
|
||||
Array.prototype.forEach.call(document.querySelectorAll('.textarea'), function(editor) {
|
||||
var name = editor.dataset.name;
|
||||
var textarea = document.querySelector('textarea[name="' + name + '"]');
|
||||
if (!textarea) {
|
||||
textarea = document.createElement('textarea');
|
||||
textarea.name = name;
|
||||
textarea.style.display = 'none';
|
||||
form.appendChild(textarea);
|
||||
}
|
||||
textarea.value = editor.innerHTML;
|
||||
if (pens[name]) {
|
||||
pens[name].destroy();
|
||||
}
|
||||
});
|
||||
}, false);
|
||||
Array.prototype.forEach.call(form.querySelectorAll('button'), function(button) {
|
||||
form.addEventListener('click', function(event) {
|
||||
shouldAllowAlert = (event.target.value === 'cancel');
|
||||
});
|
||||
});
|
||||
});
|
||||
Array.prototype.forEach.call(document.querySelectorAll('form'), function(form) {
|
||||
var shouldAllowAlert = false;
|
||||
form.addEventListener('submit', function() {
|
||||
if (shouldAllowAlert) {
|
||||
return;
|
||||
}
|
||||
Array.prototype.forEach.call(document.querySelectorAll('.textarea'), function(editor) {
|
||||
var name = editor.dataset.name;
|
||||
var textarea = document.querySelector('textarea[name="' + name + '"]');
|
||||
if (!textarea) {
|
||||
textarea = document.createElement('textarea');
|
||||
textarea.name = name;
|
||||
textarea.style.display = 'none';
|
||||
form.appendChild(textarea);
|
||||
}
|
||||
textarea.value = editor.innerHTML;
|
||||
if (pens[name]) {
|
||||
pens[name].destroy();
|
||||
}
|
||||
});
|
||||
}, false);
|
||||
Array.prototype.forEach.call(form.querySelectorAll('button'), function(button) {
|
||||
form.addEventListener('click', function(event) {
|
||||
shouldAllowAlert = (event.target.value === 'cancel');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Array.prototype.forEach.call(document.querySelectorAll('.check-box-field .other input'), function(input) {
|
||||
var checkbox = document.getElementById(input.parentElement.parentElement.attributes.for.value);
|
||||
input.addEventListener('keyup', function(event) {
|
||||
if (event.target.value) {
|
||||
checkbox.checked = true;
|
||||
}
|
||||
});
|
||||
input.addEventListener('click', function(event) {
|
||||
checkbox.checked = true;
|
||||
});
|
||||
var setRequired = function() {
|
||||
if (checkbox.checked) {
|
||||
input.setAttribute('required', 'required');
|
||||
} else {
|
||||
input.removeAttribute('required');
|
||||
}
|
||||
};
|
||||
Array.prototype.forEach.call(document.querySelectorAll('.check-box-field input'), function(_input) {
|
||||
_input.addEventListener('change', function(event) { setRequired(); });
|
||||
});
|
||||
});
|
||||
Array.prototype.forEach.call(document.querySelectorAll('.check-box-field .other input'), function(input) {
|
||||
var checkbox = document.getElementById(input.parentElement.parentElement.attributes.for.value);
|
||||
input.addEventListener('keyup', function(event) {
|
||||
if (event.target.value) {
|
||||
checkbox.checked = true;
|
||||
}
|
||||
});
|
||||
input.addEventListener('click', function(event) {
|
||||
checkbox.checked = true;
|
||||
});
|
||||
var setRequired = function() {
|
||||
if (checkbox.checked) {
|
||||
input.setAttribute('required', 'required');
|
||||
} else {
|
||||
input.removeAttribute('required');
|
||||
}
|
||||
};
|
||||
Array.prototype.forEach.call(document.querySelectorAll('.check-box-field input'), function(_input) {
|
||||
_input.addEventListener('change', function(event) { setRequired(); });
|
||||
});
|
||||
});
|
||||
|
||||
Array.prototype.forEach.call(document.querySelectorAll('[data-toggles]'), function(checkbox) {
|
||||
var toggles = document.getElementById(checkbox.dataset.toggles);
|
||||
toggles.classList.add('toggleable');
|
||||
var form = checkbox.parentNode;
|
||||
while (form && form.nodeName != 'FORM') {
|
||||
form = form.parentNode;
|
||||
}
|
||||
var toggle = function() {
|
||||
toggles.classList[checkbox.checked ? 'add' : 'remove']('open');
|
||||
if (form) {
|
||||
if (checkbox.checked) {
|
||||
form.removeAttribute('novalidate');
|
||||
} else {
|
||||
form.setAttribute('novalidate', 'novalidate');
|
||||
}
|
||||
}
|
||||
};
|
||||
toggle();
|
||||
checkbox.addEventListener('change', function(event) { toggle(); });
|
||||
});
|
||||
Array.prototype.forEach.call(document.querySelectorAll('[data-toggles]'), function(checkbox) {
|
||||
var toggles = document.getElementById(checkbox.dataset.toggles);
|
||||
toggles.classList.add('toggleable');
|
||||
var form = checkbox.parentNode;
|
||||
while (form && form.nodeName != 'FORM') {
|
||||
form = form.parentNode;
|
||||
}
|
||||
var toggle = function() {
|
||||
toggles.classList[checkbox.checked ? 'add' : 'remove']('open');
|
||||
if (form) {
|
||||
if (checkbox.checked) {
|
||||
form.removeAttribute('novalidate');
|
||||
} else {
|
||||
form.setAttribute('novalidate', 'novalidate');
|
||||
}
|
||||
}
|
||||
};
|
||||
toggle();
|
||||
checkbox.addEventListener('change', function(event) { toggle(); });
|
||||
});
|
||||
|
||||
Array.prototype.forEach.call(document.querySelectorAll('fieldset.translator'), function(translator) {
|
||||
Array.prototype.forEach.call(translator.querySelectorAll('.locale-select a'), function(selector) {
|
||||
selector.addEventListener('click', function(event) {
|
||||
event.preventDefault();
|
||||
var locale = event.target.parentElement.getAttribute('data-locale');
|
||||
Array.prototype.forEach.call(translator.querySelectorAll('.locale-select li'), function(_selector) {
|
||||
_selector.className = _selector.getAttribute('data-locale') == locale ? 'selected' : '';
|
||||
});
|
||||
Array.prototype.forEach.call(translator.querySelectorAll('.text-editors li'), function(editor) {
|
||||
editor.className = editor.getAttribute('data-locale') == locale ? 'selected' : '';
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
})();
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
(function() {
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var fields = document.getElementsByClassName('file-field');
|
||||
for (var i = 0; i < fields.length; i++) {
|
||||
var field = fields[i];
|
||||
var input = field.getElementsByTagName('input')[0];
|
||||
var image = field.getElementsByTagName('img')[0];
|
||||
var state = field.getElementsByClassName('file-field-name')[0];
|
||||
|
||||
input.onchange = function() {
|
||||
state.className = 'file-field-name selected';
|
||||
state.innerHTML = this.value.split(/[\/\\]/).reverse()[0];
|
||||
var uploadButton = this.form.querySelector('[value="upload"]');
|
||||
if (uploadButton) {
|
||||
uploadButton.setAttribute('data-enabled', '1');
|
||||
}
|
||||
|
||||
if (this.files && this.files[0] && typeof FileReader !== "undefined") {
|
||||
var reader = new FileReader();
|
||||
|
||||
reader.onload = function (e) {
|
||||
image.className = 'changed';
|
||||
image.src = e.target.result;
|
||||
};
|
||||
|
||||
reader.readAsDataURL(this.files[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}, false);
|
||||
})();
|
||||
Vendored
-4
File diff suppressed because one or more lines are too long
@@ -230,4 +230,15 @@
|
||||
});
|
||||
};
|
||||
initNode();
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var errors = document.getElementsByClassName('has-error');
|
||||
if (errors.length <= 0) {
|
||||
errors = document.getElementsByClassName('info-message');
|
||||
}
|
||||
|
||||
if (errors.length > 0) {
|
||||
errors[0].scrollIntoView();
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
(function() {
|
||||
function loadMap() {
|
||||
var projection = d3.geo.mercator();
|
||||
var path = d3.geo.path().projection(projection);
|
||||
var tooltip = document.getElementById('tooltip');
|
||||
|
||||
var initialScale = 3.5;
|
||||
var initialPosition = [-100, -175];
|
||||
|
||||
var zoom = d3.behavior.zoom()
|
||||
.scaleExtent([1, 20])
|
||||
.scale(initialScale).translate(initialPosition)
|
||||
.on("zoom", function() {
|
||||
setZoom(d3.event.translate, d3.event.scale);
|
||||
});
|
||||
|
||||
function setZoom(translate, scale) {
|
||||
container.attr("transform", "translate(" + translate + ") scale(" + scale + ")").attr('data-scale', scale);
|
||||
}
|
||||
|
||||
var container = d3.select('#map').call(zoom).insert('g', ':first-child').attr('class', 'map');
|
||||
|
||||
setZoom(initialPosition, initialScale);
|
||||
|
||||
container.append("path")
|
||||
.datum(d3.geo.graticule())
|
||||
.attr("class", "graticule")
|
||||
.attr("d", path);
|
||||
|
||||
d3.selection.prototype.moveToFront = function() {
|
||||
return this.each(function(){
|
||||
this.parentNode.appendChild(this);
|
||||
});
|
||||
};
|
||||
|
||||
d3.json('/assets/world-110m.json', function(error, world) {
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
container.selectAll('path')
|
||||
.data(topojson.feature(world, world.objects.countries).features)
|
||||
.enter()
|
||||
.append('path')
|
||||
.attr('d', path)
|
||||
.attr('class', 'country');
|
||||
|
||||
var year = (new Date()).getFullYear();
|
||||
var conferences = document.querySelectorAll('#conferences .conference');
|
||||
var conference_path = []
|
||||
|
||||
for (var i = 0; i < conferences.length; i++) {
|
||||
var d = conferences[i];
|
||||
if (d.getAttribute('data-t') === 'annual') {
|
||||
var coords = projection([d.getAttribute('data-o'), d.getAttribute('data-a')]);
|
||||
if (conference_path.length) {
|
||||
conference_path[conference_path.length - 1].x2 = coords[0];
|
||||
conference_path[conference_path.length - 1].y2 = coords[1];
|
||||
}
|
||||
conference_path.push({
|
||||
x1: coords[0],
|
||||
y1: coords[1]
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
container.append('defs').html('<filter id="svg-gooey-filter"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -7" result="svg-gooey-filter"></feColorMatrix><feComposite in="SourceGraphic" in2="svg-gooey-filter" operator="atop"></feComposite></filter>')
|
||||
|
||||
var regionalConferences = container.append('g').attr('filter', 'url(#svg-gooey-filter)').attr('class', 'cities regional-conferences');
|
||||
var annualConferences = container.append('g').attr('filter', 'url(#svg-gooey-filter)').attr('class', 'cities annual-conferences');
|
||||
|
||||
function mouseover(e) {
|
||||
c = document.getElementById('conference-' + event.target.getAttribute('data-c'));
|
||||
tooltip.innerHTML = '<h3>' + c.querySelector('.title').innerHTML + '</h3>' +
|
||||
'<div class="conference-details">' + c.querySelector('.conference-details').innerHTML + '</div>';
|
||||
tooltip.className = 'open';
|
||||
}
|
||||
|
||||
function mouseout(e) {
|
||||
tooltip.className = '';
|
||||
}
|
||||
|
||||
function click(e) {
|
||||
l = document.querySelector('#conference-' + event.target.getAttribute('data-c') + ' .conference-link');
|
||||
window.location.href = l.getAttribute('href');
|
||||
}
|
||||
|
||||
for (var i = conferences.length - 1; i >= 0; i--) {
|
||||
var c = conferences[i];
|
||||
var type = c.getAttribute('data-t');
|
||||
var coords = projection([c.getAttribute('data-o'), c.getAttribute('data-a')]);
|
||||
|
||||
(type === 'annual' ? annualConferences : regionalConferences)
|
||||
.append('circle')
|
||||
.attr('class', 'city type-' + type)
|
||||
.attr('data-c', c.id.replace(/^conference\-/, ''))
|
||||
.attr('cx', function(d) { return coords[0]; })
|
||||
.attr('cy', function(d) { return coords[1]; })
|
||||
.attr('r', Math.max(3,
|
||||
(15 - (
|
||||
(year - parseInt(c.getAttribute('data-y'))) * 2.5)) * 1.125)
|
||||
)
|
||||
.on('mouseover', mouseover)
|
||||
.on('mouseout', mouseout)
|
||||
.on('click', click);
|
||||
}
|
||||
});
|
||||
|
||||
d3.select("#map").attr('class', 'loaded');
|
||||
}
|
||||
|
||||
document.onreadystatechange = function () {
|
||||
if (document.readyState == 'complete') {
|
||||
loadMap();
|
||||
}
|
||||
};
|
||||
})();
|
||||
@@ -0,0 +1,26 @@
|
||||
(function() {
|
||||
function find_user(email, f) {
|
||||
var request = new XMLHttpRequest();
|
||||
request.open('POST', '/user/find', true);
|
||||
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');
|
||||
request.setRequestHeader('X-CSRF-Token', encodeURI(document.querySelector('meta[name="csrf-token"]').getAttribute('content')));
|
||||
request.send('e=' + encodeURI(email));
|
||||
request.onreadystatechange = function() {
|
||||
if (request.readyState == 4) {
|
||||
if (request.status == 200) {
|
||||
f(JSON.parse(request.responseText));
|
||||
} else {
|
||||
f({error: request.status});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var fields = document.getElementsByClassName('user-field');
|
||||
for (var i = 0; i < fields.length; i++) {
|
||||
var field = fields[i];
|
||||
var input = field.getElementsByTagName('input')[0];
|
||||
var name = field.getElementsByClassName('user-name')[0];
|
||||
}
|
||||
}, false);
|
||||
})();
|
||||
Reference in New Issue
Block a user