antville/code/Skins/Skins.js

180 lines
5 KiB
JavaScript
Raw Normal View History

// The Antville Project
// http://code.google.com/p/antville
//
// Copyright 20012014 by the Workers of Antville.
//
// Licensed under the Apache License, Version 2.0 (the ``License'');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
2014-07-04 15:32:18 +02:00
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an ``AS IS'' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileOverview Defines the Skins prototype.
*/
markgettext('Skins');
markgettext('skins');
/**
* @name Skins
* @constructor
* @param {String} name
* @param {Skins} parent
* @property {Skin[]} _children
* @property {Skin[]} custom
* @property {Skin[]} modified
* @property {String} name
* @property {Skins} parent
* @extends HopObject
*/
Skins.prototype.constructor = function(name, parent) {
this.name = name;
this.parent = parent;
return this;
}
/**
*
* @param {String} action
* @returns {Boolean}
*/
Skins.prototype.getPermission = function(action) {
return res.handlers.layout.getPermission('main');
}
/**
*
* @param {String} name
* @returns {Skins|Skin}
*/
Skins.prototype.getChildElement = function(name) {
2014-07-04 15:32:18 +02:00
if (this.parent) {
var group = path[path.length - 1].name;
var skin = this.getSkin(group, name);
if (skin) {
return skin;
}
if (global[group] || group === 'Global') {
2014-07-04 15:32:18 +02:00
return this.getSkin(group, name);
}
}
return new Skins(name, this);
}
Skins.prototype.onRequest = function() {
2014-07-04 15:32:18 +02:00
if (this.parent) {
res.redirect(res.handlers.layout.skins.href(req.action));
}
return HopObject.prototype.onRequest.call(this);
}
Skins.prototype.main_action = function() {
res.data.title = gettext('Basic Skins');
res.data.body = this.renderSkinAsString('$Skins#main');
res.handlers.site.renderSkin('Site#page');
2014-07-04 15:32:18 +02:00
return;
}
Skins.prototype.create_action = function() {
2014-07-04 15:32:18 +02:00
if (req.postParams.save) {
try {
var prototype = req.postParams.prototype;
var name = stripTags(req.postParams.name);
if (!prototype || !req.postParams.name) {
throw Error(gettext('Please choose a prototype and enter a skin name'));
2014-07-04 15:32:18 +02:00
} else if (name !== req.postParams.name || /\s/.test(name) || NAMEPATTERN.test(name)) {
throw Error(gettext('Please avoid special characters or HTML code in the name field.'));
2014-07-04 15:32:18 +02:00
} else if (Skin.getByName(prototype, name)) {
throw Error('Sorry, there is already a skin with that name. Please enter a different one.');
}
2014-07-04 15:32:18 +02:00
var skin = this.getSkin(prototype, name);
skin.update(req.postParams);
res.message = gettext('The changes were saved successfully.');
2014-07-04 15:32:18 +02:00
if (req.postParams.save == 1) {
res.redirect(skin.href('edit'));
2014-07-04 15:32:18 +02:00
} else {
res.redirect(res.handlers.layout.skins.href('modified'));
2014-07-04 15:32:18 +02:00
}
} catch (ex) {
res.message = ex;
app.log(ex);
}
}
res.data.title = gettext('Add Skin');
res.data.action = this.href(req.action);
HopObject.confirmConstructor(Skin);
res.data.body = (new Skin).renderSkinAsString('$Skin#edit');
this.renderSkin('$Skins#page');
2014-07-04 15:32:18 +02:00
return;
}
Skins.prototype.modified_action = function() {
res.data.title = gettext('Modified Skins');
res.data.list = renderList(this.modified, '$Skin#listItem');
res.data.body = this.renderSkinAsString('$Skins#list');
res.handlers.site.renderSkin('Site#page');
2014-07-04 15:32:18 +02:00
return;
}
* Refactored code and skins in respect for comprehensive i18n * Refactored and unified remove() methods and calls for greater flexibility as well as reliability * Added option to remove all comments by a user to Comment.remove() method and $Comment#delete skin * Added global #listItemFlag skin as well as listItemFlag_macro() for rendering vertically written text of items in a list view (e.g. closed) * Fixed bug in gettext_macro() and ngettext_macro() causing incorrect whitespace * Refactored timezone and locale handling * Modified automatic translation of untitled links in HopObject.link_macro() * Added honeypot to login and registration forms * Fixed client-side JavaScript to be evaluated when login or registration form is submitted, not only when the submit button is clicked * Removed redundant filter expression from DB mapping of Membership.images collection * Added Membership.content collection * Changed terminology from open to running polls, thus renaming Polls.open_action() method and Polls.open collection * Moved a lot of CSS used in root or administration sections from Site#stylesheet to $Root#stylesheet skin * Added Root.updateDomains() method (most likely already obsolete) * Removed Root.processHref() method (only necessary for very advanced setup) and obsolete comments * Fixed Root.xgettext() method to correctly read UTF-8 encoded data * Fixed Site.deleted_macro() to return the date object for late formatting * Refactored Site.processHref() for more convenient custom domain name mapping * Renamed Skins.advanced_action() method to Skins.all_action() * Removed redundant filter from Stories.comments collection * Removed unnecessary filter from Story.comments collection
2010-01-10 14:40:36 +00:00
Skins.prototype.all_action = function() {
2014-07-04 15:32:18 +02:00
if (this.parent) {
res.redirect(res.handlers.layout.skins.href(req.action));
}
res.push()
for (let set of this.getListOfSkins()) {
res.write(renderList(set[1], '$Skin#listItem'));
}
res.data.list = res.pop();
res.data.title = gettext('All Skins');
res.data.body = this.renderSkinAsString('$Skins#list');
res.handlers.site.renderSkin('Site#page');
2014-07-04 15:32:18 +02:00
return;
}
Skins.prototype.safe_action = function() {
res.data.title = gettext('Modified Skins (Safe Mode)');
res.data.list = renderList(this.modified, '$Skin#listItem');
res.data.body = this.renderSkinAsString('$Skins#list');
this.renderSkin('$Skins#page');
2014-07-04 15:32:18 +02:00
return;
}
/**
*
* @param {String} group
* @param {String} name
* @returns {Skin}
*/
Skins.prototype.getSkin = function(group, name) {
2014-07-04 15:32:18 +02:00
return Skin.getByName(group, name) || new Skin(group, name);
}
/**
*
* @returns {String}
*/
2015-01-07 14:34:37 +01:00
Skins.prototype.getListOfSkins = function() {
var result = [];
2014-07-04 15:32:18 +02:00
var options = Skin.getPrototypeOptions();
for (let option of options) {
var skins = [];
var prototype = option.value;
var skinfiles = app.getSkinfilesInPath(res.skinpath);
var skin = createSkin(skinfiles[prototype][prototype]);
for (let name of skin.getSubskinNames()) {
var subskin = this.getSkin(prototype, name);
skins.push(subskin);
2014-07-04 15:32:18 +02:00
}
2015-02-14 17:38:54 +01:00
skins.sort(new String.Sorter('name'));
2015-01-07 14:34:37 +01:00
result.push([prototype, skins]);
2014-07-04 15:32:18 +02:00
}
2015-01-07 14:34:37 +01:00
return result;
}