2014-09-18 17:58:47 -06:00
|
|
|
$(function(){
|
2015-08-03 15:43:40 +02:00
|
|
|
var root = window || {};
|
|
|
|
|
root = root.GravJS = root.GravJS || {};
|
2014-09-18 17:58:47 -06:00
|
|
|
|
2015-08-03 15:43:40 +02:00
|
|
|
//Make it global because used by ./forms/form.js
|
|
|
|
|
root.currentValues = getState();
|
2015-08-03 14:46:12 +02:00
|
|
|
var clickedLink;
|
2015-07-31 14:32:49 -07:00
|
|
|
|
2014-09-18 17:58:47 -06:00
|
|
|
// selectize
|
2015-09-08 11:26:56 -07:00
|
|
|
var pageFilter = $('input.page-filter'),
|
|
|
|
|
pageTypes = pageFilter.data('template-types'),
|
2015-10-21 18:41:49 +02:00
|
|
|
accessLevels = pageFilter.data('template-access-levels'),
|
2015-09-08 11:26:56 -07:00
|
|
|
options = [
|
|
|
|
|
{flag: 'Modular', key: 'Modular', cat: 'mode'},
|
|
|
|
|
{flag: 'Visible', key: 'Visible', cat: 'mode'},
|
2015-09-09 19:37:29 -06:00
|
|
|
{flag: 'Routable', key: 'Routable', cat: 'mode'},
|
|
|
|
|
{flag: 'Published', key: 'Published', cat: 'mode'},
|
2015-09-09 21:38:28 -06:00
|
|
|
{flag: 'Non-Modular', key: 'NonModular', cat: 'mode'},
|
|
|
|
|
{flag: 'Non-Visible', key: 'NonVisible', cat: 'mode'},
|
|
|
|
|
{flag: 'Non-Routable', key: 'NonRoutable', cat: 'mode'},
|
2015-09-09 19:37:29 -06:00
|
|
|
{flag: 'Non-Published', key: 'NonPublished', cat: 'mode'},
|
2015-09-08 11:26:56 -07:00
|
|
|
];
|
|
|
|
|
|
2015-09-08 12:33:02 -07:00
|
|
|
if (pageFilter && pageTypes) {
|
|
|
|
|
jQuery.each(pageTypes, function(key, name){
|
|
|
|
|
options.push({flag: name, key: key, cat: 'type'});
|
|
|
|
|
})
|
2015-09-08 11:26:56 -07:00
|
|
|
|
2015-10-21 18:41:49 +02:00
|
|
|
jQuery.each(accessLevels, function(key, name){
|
|
|
|
|
options.push({flag: name, key: key, cat: 'access'});
|
|
|
|
|
})
|
|
|
|
|
|
2015-09-08 12:33:02 -07:00
|
|
|
pageFilter.selectize({
|
|
|
|
|
maxItems: null,
|
|
|
|
|
valueField: 'key',
|
|
|
|
|
labelField: 'flag',
|
|
|
|
|
searchField: ['flag', 'key'],
|
|
|
|
|
options: options,
|
|
|
|
|
optgroups: [
|
|
|
|
|
{id: 'mode', name: 'Page Modes'},
|
|
|
|
|
{id: 'type', name: 'Page Types'},
|
2015-10-21 18:41:49 +02:00
|
|
|
{id: 'access', name: 'Access'},
|
2015-09-08 12:33:02 -07:00
|
|
|
],
|
|
|
|
|
optgroupField: 'cat',
|
|
|
|
|
optgroupLabelField: 'name',
|
|
|
|
|
optgroupValueField: 'id',
|
2015-10-21 18:41:49 +02:00
|
|
|
optgroupOrder: ['mode', 'type', 'access'],
|
2015-09-08 12:33:02 -07:00
|
|
|
plugins: ['optgroup_columns']
|
|
|
|
|
});
|
|
|
|
|
}
|
2014-09-18 17:58:47 -06:00
|
|
|
|
2015-07-27 14:32:31 -07:00
|
|
|
var childrenToggles = $('[data-toggle="children"]'),
|
|
|
|
|
storage = sessionStorage.getItem('grav:admin:pages'),
|
|
|
|
|
collapseAll = function(store) {
|
|
|
|
|
childrenToggles.each(function(i, element){
|
|
|
|
|
var icon = $(element).find('.page-icon'),
|
|
|
|
|
open = icon.hasClass('children-open'),
|
|
|
|
|
key = $(element).closest('[data-nav-id]').data('nav-id'),
|
|
|
|
|
children = $(element).closest('li.page-item').find('ul:first');
|
|
|
|
|
|
|
|
|
|
if (open) {
|
|
|
|
|
children.hide();
|
|
|
|
|
if (store) delete storage[key];
|
|
|
|
|
icon.removeClass('children-open').addClass('children-closed');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (store) sessionStorage.setItem('grav:admin:pages', JSON.stringify(storage));
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
expandAll = function(store) {
|
|
|
|
|
childrenToggles.each(function(i, element){
|
|
|
|
|
var icon = $(element).find('.page-icon'),
|
|
|
|
|
open = icon.hasClass('children-open'),
|
|
|
|
|
key = $(element).closest('[data-nav-id]').data('nav-id'),
|
|
|
|
|
children = $(element).closest('li.page-item').find('ul:first');
|
|
|
|
|
|
|
|
|
|
if (!open) {
|
|
|
|
|
children.show();
|
|
|
|
|
if (store) storage[key] = 1;
|
|
|
|
|
icon.removeClass('children-closed').addClass('children-open');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (store) sessionStorage.setItem('grav:admin:pages', JSON.stringify(storage));
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
restoreStates = function() {
|
|
|
|
|
collapseAll();
|
|
|
|
|
for (var key in storage) {
|
|
|
|
|
var element = $('[data-nav-id="' + key + '"]'),
|
|
|
|
|
icon = element.find('.page-icon').first(),
|
|
|
|
|
open = icon.hasClass('children-open'),
|
|
|
|
|
children = element.closest('li.page-item').find('ul:first');
|
|
|
|
|
|
|
|
|
|
children.show();
|
|
|
|
|
icon.removeClass('children-closed').addClass('children-open');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (!storage) {
|
|
|
|
|
sessionStorage.setItem('grav:admin:pages', (storage = '{}'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
storage = JSON.parse(storage);
|
|
|
|
|
|
2015-07-27 14:33:32 -07:00
|
|
|
restoreStates();
|
|
|
|
|
|
2015-04-20 20:41:34 +02:00
|
|
|
var startFilterPages = function () {
|
2015-08-08 17:41:53 +02:00
|
|
|
var task = 'task' + GravAdmin.config.param_sep;
|
2015-04-20 20:41:34 +02:00
|
|
|
|
|
|
|
|
$('input[name="page-search"]').focus();
|
|
|
|
|
var flags = $('input[name="page-filter"]').val(),
|
|
|
|
|
query = $('input[name="page-search"]').val();
|
|
|
|
|
|
|
|
|
|
if (!flags.length && !query.length) {
|
2015-07-27 14:32:31 -07:00
|
|
|
GravAjax.jqxhr.abort();
|
2015-04-20 20:41:34 +02:00
|
|
|
return finishFilterPages([], true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GravAjax({
|
|
|
|
|
dataType: 'json',
|
|
|
|
|
method: 'POST',
|
2015-08-08 17:41:53 +02:00
|
|
|
url: GravAdmin.config.base_url_relative + '/pages-filter.json/' + task + 'filterPages',
|
2015-04-20 20:41:34 +02:00
|
|
|
data: {
|
|
|
|
|
flags: flags,
|
|
|
|
|
query: query
|
|
|
|
|
},
|
2015-05-11 16:37:43 +02:00
|
|
|
toastErrors: true,
|
2015-04-20 20:41:34 +02:00
|
|
|
success: function (result, status) {
|
|
|
|
|
finishFilterPages(result.results);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var finishFilterPages = function (pages, reset) {
|
|
|
|
|
var items = $('[data-nav-id]');
|
|
|
|
|
|
|
|
|
|
items.removeClass('search-match');
|
|
|
|
|
|
|
|
|
|
if (reset) {
|
|
|
|
|
items.addClass('search-match');
|
2015-07-27 14:32:31 -07:00
|
|
|
restoreStates();
|
2015-04-20 20:41:34 +02:00
|
|
|
} else {
|
|
|
|
|
pages.forEach(function (id) {
|
2015-07-27 14:32:31 -07:00
|
|
|
var match = items.filter('[data-nav-id="' + id + '"]'),
|
|
|
|
|
parents = match.parents('[data-nav-id]');
|
2015-04-20 20:41:34 +02:00
|
|
|
match.addClass('search-match');
|
|
|
|
|
match.find('[data-nav-id]').addClass('search-match');
|
2015-07-27 14:32:31 -07:00
|
|
|
parents.addClass('search-match');
|
|
|
|
|
parents.find('[data-toggle="children"]').each(function(index, element){
|
|
|
|
|
var icon = $(this).find('.page-icon'),
|
|
|
|
|
open = icon.hasClass('children-open'),
|
|
|
|
|
children = $(this).closest('li.page-item').find('ul:first');
|
|
|
|
|
|
|
|
|
|
if (!open) {
|
|
|
|
|
children.show();
|
|
|
|
|
icon.removeClass('children-closed').addClass('children-open');
|
|
|
|
|
}
|
|
|
|
|
});
|
2015-04-20 20:41:34 +02:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
items.each(function (key, item) {
|
|
|
|
|
if ($(item).hasClass('search-match')) {
|
|
|
|
|
$(item).show();
|
|
|
|
|
} else {
|
|
|
|
|
$(item).hide();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// selectize
|
|
|
|
|
$('input[name="page-search"]').on('input', startFilterPages);
|
|
|
|
|
$('input[name="page-filter"]').on('change', startFilterPages);
|
|
|
|
|
|
|
|
|
|
|
2014-09-18 17:58:47 -06:00
|
|
|
// auto generate folder based on title
|
|
|
|
|
// on user input on folder, autogeneration stops
|
|
|
|
|
// if user empties the folder, autogeneration restarts
|
|
|
|
|
$('input[name="folder"]').on('input', function(){
|
|
|
|
|
$(this).data('user-custom-folder', true);
|
|
|
|
|
if (!$(this).val()) $(this).data('user-custom-folder', false);
|
2015-07-27 14:32:31 -07:00
|
|
|
});
|
|
|
|
|
|
2014-09-18 17:58:47 -06:00
|
|
|
$('input[name="title"]').on('input', function(e){
|
|
|
|
|
if (!$('input[name="folder"]').data('user-custom-folder')) {
|
2015-08-28 17:14:28 -06:00
|
|
|
folder = $.slugify($(this).val());
|
2014-09-18 17:58:47 -06:00
|
|
|
$('input[name="folder"]').val(folder);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2015-08-28 17:14:28 -06:00
|
|
|
$('#slug-target').slugify('#slug-source');
|
|
|
|
|
|
|
|
|
|
|
2014-09-26 10:58:44 -07:00
|
|
|
$('input[name="folder"]').on('input', function(e){
|
2015-09-07 13:06:07 -07:00
|
|
|
var start = this.selectionStart,
|
|
|
|
|
end = this.selectionEnd;
|
|
|
|
|
|
2014-09-26 10:58:44 -07:00
|
|
|
value = $(this).val().toLowerCase().replace(/\s/g, '-').replace(/[^a-z0-9_\-]/g, '');
|
|
|
|
|
$(this).val(value);
|
2015-09-07 13:06:07 -07:00
|
|
|
|
|
|
|
|
// restore cursor position
|
|
|
|
|
this.setSelectionRange(start, end);
|
2014-09-26 10:58:44 -07:00
|
|
|
});
|
|
|
|
|
|
2015-07-27 14:32:31 -07:00
|
|
|
childrenToggles.on('click', function () {
|
2015-04-20 16:43:30 +02:00
|
|
|
var icon = $(this).find('.page-icon'),
|
|
|
|
|
open = icon.hasClass('children-open'),
|
2015-07-27 14:32:31 -07:00
|
|
|
key = $(this).closest('[data-nav-id]').data('nav-id'),
|
2015-04-20 16:43:30 +02:00
|
|
|
children = $(this).closest('li.page-item').find('ul:first');
|
|
|
|
|
|
|
|
|
|
if (open) {
|
|
|
|
|
children.hide();
|
2015-07-27 14:32:31 -07:00
|
|
|
delete storage[key];
|
2015-04-20 16:43:30 +02:00
|
|
|
icon.removeClass('children-open').addClass('children-closed');
|
|
|
|
|
} else {
|
|
|
|
|
children.show();
|
2015-07-27 14:32:31 -07:00
|
|
|
storage[key] = true;
|
2015-04-20 16:43:30 +02:00
|
|
|
icon.removeClass('children-closed').addClass('children-open');
|
|
|
|
|
}
|
2015-07-27 14:32:31 -07:00
|
|
|
|
|
|
|
|
sessionStorage.setItem('grav:admin:pages', JSON.stringify(storage));
|
2015-04-20 16:43:30 +02:00
|
|
|
});
|
|
|
|
|
|
2015-07-27 14:57:59 -07:00
|
|
|
$('[data-page-toggleall]').on('click', function() {
|
|
|
|
|
var state = $(this).data('page-toggleall');
|
|
|
|
|
if (state == 'collapse') collapseAll(true);
|
|
|
|
|
else expandAll(true);
|
|
|
|
|
});
|
|
|
|
|
|
2014-09-18 17:58:47 -06:00
|
|
|
$('#admin-main button').on('click', function(){
|
|
|
|
|
$(window).off('beforeunload');
|
|
|
|
|
});
|
|
|
|
|
|
2014-09-18 17:32:58 -07:00
|
|
|
$('[data-remodal-id] form').on('submit', function(){
|
|
|
|
|
$(window).off('beforeunload');
|
|
|
|
|
});
|
|
|
|
|
|
2014-09-18 17:58:47 -06:00
|
|
|
$("#admin-mode-toggle input[name=mode-switch]").on('change', function(e){
|
2014-09-18 17:35:05 -07:00
|
|
|
var value = $(this).val(),
|
|
|
|
|
uri = $(this).data('leave-url');
|
2014-09-18 17:58:47 -06:00
|
|
|
|
2015-08-03 15:43:40 +02:00
|
|
|
if (root.currentValues == getState()) {
|
2014-09-18 17:58:47 -06:00
|
|
|
setTimeout(function(){
|
2014-09-18 17:35:05 -07:00
|
|
|
window.location.href = uri;
|
2014-09-18 17:58:47 -06:00
|
|
|
}, 200)
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
|
|
|
|
var confirm = $.remodal.lookup[$('[data-remodal-id=changes]').data('remodal')],
|
|
|
|
|
buttons = $('[data-remodal-id=changes] a.button'),
|
|
|
|
|
action;
|
|
|
|
|
|
|
|
|
|
buttons.on('click', function(e){
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
action = $(this).data('leave-action');
|
|
|
|
|
|
|
|
|
|
buttons.off('click');
|
|
|
|
|
confirm.close();
|
|
|
|
|
|
|
|
|
|
if (action == 'continue') {
|
|
|
|
|
$(window).off('beforeunload');
|
2014-09-21 18:27:12 -07:00
|
|
|
window.location.href = $("#admin-mode-toggle input[name=mode-switch]:checked").data('leave-url');
|
2014-09-18 17:58:47 -06:00
|
|
|
} else {
|
|
|
|
|
$('input[name=mode-switch][checked]').prop('checked', true);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
confirm.open();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$('a[href]:not([href^=#])').on('click', function(e){
|
2015-08-03 15:43:40 +02:00
|
|
|
if (root.currentValues != getState()){
|
2014-09-18 17:58:47 -06:00
|
|
|
e.preventDefault();
|
|
|
|
|
|
|
|
|
|
clickedLink = $(this).attr('href');
|
|
|
|
|
|
|
|
|
|
var confirm = $.remodal.lookup[$('[data-remodal-id=changes]').data('remodal')],
|
|
|
|
|
buttons = $('[data-remodal-id=changes] a.button'),
|
|
|
|
|
action;
|
|
|
|
|
|
|
|
|
|
buttons.on('click', function(e){
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
action = $(this).data('leave-action');
|
|
|
|
|
|
|
|
|
|
buttons.off('click');
|
|
|
|
|
confirm.close();
|
|
|
|
|
|
|
|
|
|
if (action == 'continue') {
|
|
|
|
|
$(window).off('beforeunload');
|
|
|
|
|
window.location.href = clickedLink;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
confirm.open();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2014-09-30 15:49:28 -07:00
|
|
|
// deletion
|
|
|
|
|
$('[data-remodal-target="delete"]').on('click', function(){
|
|
|
|
|
var okdelete = $('[data-remodal-id=delete] a.button');
|
|
|
|
|
|
|
|
|
|
okdelete.data('delete-action', $(this).data('delete-url'));
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$('[data-delete-action]').on('click', function(){
|
|
|
|
|
var confirm = $.remodal.lookup[$('[data-remodal-id=delete]').data('remodal')],
|
|
|
|
|
okdelete = $(this).data('delete-action');
|
|
|
|
|
|
|
|
|
|
window.location.href = okdelete;
|
|
|
|
|
confirm.close();
|
|
|
|
|
});
|
|
|
|
|
|
2014-09-18 17:58:47 -06:00
|
|
|
$(window).on('beforeunload', function(){
|
2015-08-03 15:43:40 +02:00
|
|
|
if (root.currentValues != getState()){
|
2014-09-18 17:58:47 -06:00
|
|
|
return "You have made changes on this page that you have not yet confirmed. If you navigate away from this page you will lose your unsaved changes";
|
|
|
|
|
}
|
|
|
|
|
});
|
2015-08-03 11:26:58 -07:00
|
|
|
|
2015-08-03 11:31:11 -07:00
|
|
|
// Move dropdown sync (on dropdown change)
|
|
|
|
|
/*$('body').on('change', '[data-page-move] select', function(){
|
2015-08-03 11:26:58 -07:00
|
|
|
var route = jQuery('form#blueprints').first().find('select[name="route"]'),
|
|
|
|
|
value = $(this).val();
|
|
|
|
|
if (route.length && route.val() !== value) {
|
|
|
|
|
route.val(value);
|
|
|
|
|
route.data('selectize').setValue(value);
|
|
|
|
|
}
|
2015-08-03 11:31:11 -07:00
|
|
|
});*/
|
|
|
|
|
|
|
|
|
|
// Move dropdown sync (on continue)
|
|
|
|
|
$('[data-page-move] button').on('click', function(){
|
|
|
|
|
var route = jQuery('form#blueprints').first().find('select[name="route"]'),
|
|
|
|
|
value = $('[data-page-move] select').val();
|
|
|
|
|
if (route.length && route.val() !== value) {
|
2015-08-21 10:11:19 -07:00
|
|
|
var selectize = route.data('selectize');
|
2015-08-03 11:31:11 -07:00
|
|
|
route.val(value);
|
2015-08-21 10:11:19 -07:00
|
|
|
if (selectize) selectize.setValue(value);
|
2015-08-03 11:31:11 -07:00
|
|
|
}
|
2015-08-03 11:26:58 -07:00
|
|
|
});
|
2014-09-18 17:58:47 -06:00
|
|
|
});
|