mourningdove/cgi-bin/LJ/Widget/CustomizeTheme.pm

240 lines
8 KiB
Perl
Raw Normal View History

2026-05-24 01:03:05 +00:00
# This code was forked from the LiveJournal project owned and operated
# by Live Journal, Inc. The code has been modified and expanded by
# Dreamwidth Studios, LLC. These files were originally licensed under
# the terms of the license supplied by Live Journal, Inc, which can
# currently be found at:
#
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
#
# In accordance with the original license, this code and all its
# modifications are provided under the GNU General Public License.
# A copy of that license can be found in the LICENSE file included as
# part of this distribution.
package LJ::Widget::CustomizeTheme;
use strict;
use base qw(LJ::Widget);
use Carp qw(croak);
use LJ::Customize;
sub authas { 1 }
sub need_res { qw( stc/widgets/customizetheme.css ) }
sub render_body {
my $class = shift;
my %opts = @_;
my $u = $class->get_effective_remote();
die "Invalid user." unless LJ::isu($u);
my $remote = LJ::get_remote();
my $getextra = $u->user ne $remote->user ? "?authas=" . $u->user : "";
my $getsep = $getextra ? "&" : "?";
my $headextra = $opts{headextra};
my $group = $opts{group} ? $opts{group} : "display";
my $style = LJ::S2::load_style( $u->prop('s2_style') );
die "Style not found." unless $style && $style->{userid} == $u->id;
my $nav_class = sub {
my $g = shift;
my $classes = "";
if ( $g eq $group ) {
$classes .= " class='on";
$classes .= "'";
}
return $classes;
};
my $propgroup_name = sub {
my $prop = shift;
return LJ::Customize->propgroup_name( $prop, $u, $style );
};
my %groups = LJ::Customize->get_propgroups( $u, $style );
my $group_names = $groups{groups};
my %has_group = map { $_ => 1 } @$group_names;
my $vars = {
style => $style,
u => $u,
groups => \%groups,
has_group => \%has_group,
propgroup_name => $propgroup_name,
nav_class => $nav_class,
group_names => $group_names,
group => $group,
};
# Display Group
if ( $group eq "display" ) {
my $mood_theme_chooser = LJ::Widget::MoodThemeChooser->new;
$$headextra .= $mood_theme_chooser->wrapped_js( page_js_obj => "Customize" );
my $nav_strip_chooser = LJ::Widget::NavStripChooser->new;
$$headextra .= $nav_strip_chooser->wrapped_js( page_js_obj => "Customize" );
$vars->{mood_theme_chooser} = $mood_theme_chooser->render;
$vars->{nav_strip_chooser} = $nav_strip_chooser->render;
}
# Presentation Group
elsif ( $group eq "presentation" ) {
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
$vars->{s2_propgroup} = $s2_propgroup->render(
props => $groups{props},
propgroup => "presentation",
groupprops => $groups{groupprops}->{presentation},
show_lang_chooser => 0,
);
}
# Colors Group
elsif ( $group eq "colors" ) {
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
$vars->{s2_propgroup} = $s2_propgroup->render(
props => $groups{props},
propgroup => "colors",
groupprops => $groups{groupprops}->{colors},
);
}
# Fonts Group
elsif ( $group eq "fonts" ) {
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
$vars->{s2_propgroup} = $s2_propgroup->render(
props => $groups{props},
propgroup => "fonts",
groupprops => $groups{groupprops}->{fonts},
);
}
# Images Group
elsif ( $group eq "images" ) {
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
$vars->{s2_propgroup} .= $s2_propgroup->render(
props => $groups{props},
propgroup => "images",
groupprops => $groups{groupprops}->{images},
);
}
# Text Group
elsif ( $group eq "text" ) {
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
$vars->{s2_propgroup} = $s2_propgroup->render(
props => $groups{props},
propgroup => "text",
groupprops => $groups{groupprops}->{text},
);
}
# Links List Group
elsif ( $group eq "linkslist" ) {
$vars->{linkslist} = LJ::Widget::LinksList->render( post => $opts{post} );
}
# Custom CSS Group
elsif ( $group eq "customcss" ) {
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
$vars->{s2_propgroup} = $s2_propgroup->render(
props => $groups{props},
propgroup => "customcss",
groupprops => $groups{groupprops}->{customcss},
);
}
# Other Groups
else {
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
$vars->{s2_propgroup} = $s2_propgroup->render(
props => $groups{props},
propgroup => $group,
groupprops => $groups{groupprops}->{$group},
);
}
return DW::Template->template_string( 'widget/customizetheme.tt', $vars );
}
sub js {
q [
initWidget: function () {
var self = this;
// confirmation when reseting the form
DOM.addEventListener($('reset_btn_top'), "click", function (evt) { self.confirmReset(evt) });
DOM.addEventListener($('reset_btn_bottom'), "click", function (evt) { self.confirmReset(evt) });
self.form_changed = false;
// capture onclicks on the nav links to confirm form saving
var links = $('customize_theme_nav_links').getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
if (links[i].href != "") {
DOM.addEventListener(links[i], "click", function (evt) { self.navclick_save(evt) })
}
}
// register all form changes to confirm them later
var selects = $('customize-form').getElementsByTagName('select');
for (var i = 0; i < selects.length; i++) {
DOM.addEventListener(selects[i], "change", function (evt) { self.form_change() });
}
var inputs = $('customize-form').getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++) {
DOM.addEventListener(inputs[i], "change", function (evt) { self.form_change() });
}
var textareas = $('customize-form').getElementsByTagName('textarea');
for (var i = 0; i < textareas.length; i++) {
DOM.addEventListener(textareas[i], "change", function (evt) { self.form_change() });
}
},
confirmReset: function (evt) {
if (! confirm("Are you sure you want to reset all changes on this page to their defaults?")) {
Event.stop(evt);
}
},
navclick_save: function (evt) {
var confirmed = false;
if (this.form_changed == false) {
return true;
} else {
confirmed = confirm("Save your changes?");
}
if (confirmed) {
$('customize-form').submit();
}
},
form_change: function () {
if (this.form_changed == true) { return; }
this.form_changed = true;
},
onRefresh: function (data) {
this.initWidget();
}
];
}
1;