version 1.484.2.1, 2012/05/07 02:19:44
|
version 1.490, 2012/07/06 22:46:06
|
Line 40 use Apache::lonxml;
|
Line 40 use Apache::lonxml;
|
use Apache::lonclonecourse; |
use Apache::lonclonecourse; |
use Apache::lonnavmaps; |
use Apache::lonnavmaps; |
use Apache::lonnavdisplay(); |
use Apache::lonnavdisplay(); |
|
use Apache::lonuserstate(); |
use HTML::Entities; |
use HTML::Entities; |
|
use HTML::TokeParser; |
use GDBM_File; |
use GDBM_File; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Cwd; |
use Cwd; |
Line 425 sub log_docs {
|
Line 427 sub log_docs {
|
|
|
sub docs_change_log { |
sub docs_change_log { |
my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath)=@_; |
my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath)=@_; |
|
my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/); |
my $js = '<script type="text/javascript">'."\n". |
my $js = '<script type="text/javascript">'."\n". |
'// <![CDATA['."\n". |
'// <![CDATA['."\n". |
&Apache::loncommon::display_filter_js('docslog')."\n". |
&Apache::loncommon::display_filter_js('docslog')."\n". |
|
&editing_js($env{'user.domain'},$env{'user.name'},$supplementalflag)."\n". |
&history_tab_js()."\n". |
&history_tab_js()."\n". |
&Apache::lonratedt::editscript('simple')."\n". |
&Apache::lonratedt::editscript('simple')."\n". |
'// ]]>'."\n". |
'// ]]>'."\n". |
'</script>'."\n"; |
'</script>'."\n"; |
$r->print(&Apache::loncommon::start_page('Content Change Log',$js)); |
$r->print(&Apache::loncommon::start_page('Content Change Log',$js)); |
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Content Change Log')); |
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Content Change Log')); |
$r->print(&startContentScreen('docs')); |
$r->print(&startContentScreen(($supplementalflag?'suppdocs':'docs'))); |
my %orderhash; |
my %orderhash; |
my $container='sequence'; |
my $container='sequence'; |
my $pathitem; |
my $pathitem; |
Line 453 sub docs_change_log {
|
Line 457 sub docs_change_log {
|
my $jumpto = $readfile; |
my $jumpto = $readfile; |
$jumpto =~ s{^/}{}; |
$jumpto =~ s{^/}{}; |
my $tid = 1; |
my $tid = 1; |
|
if ($supplementalflag) { |
|
$tid = 2; |
|
} |
my ($breadcrumbtrail) = &breadcrumbs($allowed,$crstype); |
my ($breadcrumbtrail) = &breadcrumbs($allowed,$crstype); |
$r->print($breadcrumbtrail. |
$r->print($breadcrumbtrail. |
&generate_edit_table($tid,\%orderhash,undef,$iconpath,$jumpto, |
&generate_edit_table($tid,\%orderhash,undef,$iconpath,$jumpto, |
Line 527 sub docs_change_log {
|
Line 534 sub docs_change_log {
|
':'.$docslog{$id}{'exe_udom'}.'</tt>'. |
':'.$docslog{$id}{'exe_udom'}.'</tt>'. |
$send_msg_link.'</td><td>'. |
$send_msg_link.'</td><td>'. |
$docslog{$id}{'logentry'}{'folder'}.'</td><td>'); |
$docslog{$id}{'logentry'}{'folder'}.'</td><td>'); |
|
my $is_supp = 0; |
|
if ($docslog{$id}{'logentry'}{'currentfolder'} =~ /^supplemental/) { |
|
$is_supp = 1; |
|
} |
# Before |
# Before |
for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { |
for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { |
my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0]; |
my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0]; |
my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0]; |
my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0]; |
if ($oldname ne $newname) { |
if ($oldname ne $newname) { |
$r->print(&LONCAPA::map::qtescape($oldname)); |
my $shown = &LONCAPA::map::qtescape($oldname); |
|
if ($is_supp) { |
|
$shown = &Apache::loncommon::parse_supplemental_title($shown); |
|
} |
|
$r->print($shown); |
} |
} |
} |
} |
$r->print('<ul>'); |
$r->print('<ul>'); |
for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { |
for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { |
if ($docslog{$id}{'logentry'}{'before_order_res_'.$idx}) { |
if ($docslog{$id}{'logentry'}{'before_order_res_'.$idx}) { |
$r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'before_order_res_'.$idx}))[0]).'</li>'); |
my $shown = &LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'before_order_res_'.$idx}))[0]); |
|
if ($is_supp) { |
|
$shown = &Apache::loncommon::parse_supplemental_title($shown); |
|
} |
|
$r->print('<li>'.$shown.'</li>'); |
} |
} |
} |
} |
$r->print('</ul>'); |
$r->print('</ul>'); |
Line 549 sub docs_change_log {
|
Line 568 sub docs_change_log {
|
my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0]; |
my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0]; |
my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0]; |
my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0]; |
if ($oldname ne '' && $oldname ne $newname) { |
if ($oldname ne '' && $oldname ne $newname) { |
$r->print(&LONCAPA::map::qtescape($newname)); |
my $shown = &LONCAPA::map::qtescape($newname); |
|
if ($is_supp) { |
|
$shown = &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($newname)); |
|
} |
|
$r->print($shown); |
} |
} |
} |
} |
$r->print('<ul>'); |
$r->print('<ul>'); |
for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { |
for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { |
if ($docslog{$id}{'logentry'}{'after_order_res_'.$idx}) { |
if ($docslog{$id}{'logentry'}{'after_order_res_'.$idx}) { |
$r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'after_order_res_'.$idx}))[0]).'</li>'); |
my $shown = &LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'after_order_res_'.$idx}))[0]); |
|
if ($is_supp) { |
|
$shown = &Apache::loncommon::parse_supplemental_title($shown); |
|
} |
|
$r->print('<li>'.$shown.'</li>'); |
} |
} |
} |
} |
$r->print('</ul>'); |
$r->print('</ul>'); |
Line 600 sub update_paste_buffer {
|
Line 627 sub update_paste_buffer {
|
my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]); |
my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]); |
if (&is_supplemental_title($title)) { |
if (&is_supplemental_title($title)) { |
&Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title}); |
&Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title}); |
($title) = &parse_supplemental_title($title); |
($title) = &Apache::loncommon::parse_supplemental_title($title); |
} elsif ($env{'docs.markedcopy_supplemental'}) { |
} elsif ($env{'docs.markedcopy_supplemental'}) { |
&Apache::lonnet::delenv('docs.markedcopy_supplemental'); |
&Apache::lonnet::delenv('docs.markedcopy_supplemental'); |
} |
} |
Line 612 sub update_paste_buffer {
|
Line 639 sub update_paste_buffer {
|
} |
} |
|
|
sub print_paste_buffer { |
sub print_paste_buffer { |
my ($r,$container) = @_; |
my ($r,$container,$folder) = @_; |
return if (!defined($env{'docs.markedcopy_url'})); |
return if (!defined($env{'docs.markedcopy_url'})); |
|
|
|
my $is_external; |
|
my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1]; |
|
if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) { |
|
$is_external = 1; |
|
} |
|
|
|
my $canpaste; |
|
if ($folder =~ /^supplemental/) { |
|
$canpaste = &supp_pasteable($env{'docs.markedcopy_url'}); |
|
} else { |
|
$canpaste = 1; |
|
} |
|
|
|
my $pasteinfo; |
|
if ($canpaste) { |
|
$pasteinfo = '<form name="pasteform" action="/adm/coursedocs" method="post">' |
|
.'<input type="submit" name="pastemarked" value="'.&mt('Paste').'" /> '; |
|
} else { |
|
$pasteinfo = &mt('Paste buffer contains:').' '; |
|
} |
|
|
$r->print('<fieldset>' |
$r->print('<fieldset>' |
.'<legend>'.&mt('Clipboard').'</legend>' |
.'<legend>'.&mt('Clipboard').'</legend>' |
.'<form name="pasteform" action="/adm/coursedocs" method="post">' |
.$pasteinfo |
.'<input type="submit" name="pastemarked" value="'.&mt('Paste').'" /> ' |
); |
); |
|
|
|
my $type; |
my $type; |
if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) { |
if ($is_external) { |
$type = &mt('External Resource'); |
$type = &mt('External Resource'); |
$r->print($type.': '. |
$r->print($type.': '. |
&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('. |
&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('. |
&LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')'); |
&LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')'); |
} else { |
} else { |
my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1]; |
|
my $icon = &Apache::loncommon::icon($extension); |
my $icon = &Apache::loncommon::icon($extension); |
if ($extension eq 'sequence' && |
if ($extension eq 'sequence' && |
$env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) { |
$env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) { |
Line 636 sub print_paste_buffer {
|
Line 682 sub print_paste_buffer {
|
$icon .= '/navmap.folder.closed.gif'; |
$icon .= '/navmap.folder.closed.gif'; |
} |
} |
$icon = '<img src="'.$icon.'" alt="" class="LC_icon" />'; |
$icon = '<img src="'.$icon.'" alt="" class="LC_icon" />'; |
$r->print($icon.$type.': '. &parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}))); |
$r->print($icon.$type.': '. &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}))); |
} |
} |
if ($container eq 'page') { |
if ($canpaste) { |
$r->print(' |
if ($container eq 'page') { |
|
$r->print(' |
<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" /> |
<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" /> |
<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" /> |
<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" /> |
'); |
'); |
} else { |
} else { |
$r->print(' |
$r->print(' |
<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /> |
<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /> |
'); |
'); |
|
} |
|
$r->print('</form>'); |
|
} else { |
|
$r->print('<br /><p class="LC_info">'.&mt('Paste into Supplemental Content unavailable for this type of content.').'</p>'); |
|
} |
|
$r->print('</fieldset>'); |
|
} |
|
|
|
sub supp_pasteable { |
|
my ($url) = @_; |
|
if (($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//}) || |
|
(($url =~ /\.sequence$/) && ($url =~ m{^/uploaded/})) || |
|
($url =~ m{^/uploaded/$match_domain/$match_courseid/(docs|supplemental)/(default|\d+)/\d+/}) || |
|
($url =~ m{^/adm/$match_domain/$match_username/aboutme}) || |
|
($url =~ m{^/public/$match_domain/$match_courseid/syllabus})) { |
|
return 1; |
} |
} |
$r->print('</form></fieldset>'); |
return; |
} |
} |
|
|
sub do_paste_from_buffer { |
sub do_paste_from_buffer { |
Line 658 sub do_paste_from_buffer {
|
Line 721 sub do_paste_from_buffer {
|
return; |
return; |
} |
} |
|
|
|
# Supplemental content may only include certain types of content |
|
if ($folder =~ /^supplemental/) { |
|
unless (&supp_pasteable($env{'docs.markedcopy_url'})) { |
|
return &mt('Paste failed: content type is not supported within Supplemental Content'); |
|
} |
|
} |
|
|
# paste resource to end of list |
# paste resource to end of list |
my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'}); |
my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'}); |
my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}); |
my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}); |
# Maps need to be copied first |
# Maps need to be copied first |
if (($url=~/\.(page|sequence)$/) && ($url=~/^\/uploaded\//)) { |
my ($oldurl,%removefrommap,%addedmaps,%rewrites,%copies,%dbcopies,%zombies,%params, |
$title=&mt('Copy of').' '.$title; |
%moves,$srcdom,$srcnum); |
|
$oldurl = $url; |
|
if ($url=~/\.(page|sequence)$/) { |
|
# If pasting a map, check if map contains other maps |
|
&contained_map_check($url,$folder,\%removefrommap,\%addedmaps); |
|
if (keys(%addedmaps) > 0) { |
|
&reinit_role($coursedom,$coursenum,$env{"course.$env{'request.course.id'}.home"}); |
|
} |
|
my %allmaps; |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (defined($navmap)) { |
|
foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_map() },1,0,1)) { |
|
$allmaps{$res->src()} = 1; |
|
} |
|
} |
|
if ($url=~ m{^/uploaded/}) { |
|
$title=&mt('Copy of').' '.$title; |
|
} |
my $newid=$$.int(rand(100)).time; |
my $newid=$$.int(rand(100)).time; |
my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/); |
my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/); |
if ($oldid =~ m{^(/uploaded/\Q$coursedom\E/\Q$coursenum\E/)(\D+)(\d+)$}) { |
if ($oldid =~ m{^(/uploaded/$match_domain/$match_courseid/)(\D+)(\d+)$}) { |
my $path = $1; |
my $path = $1; |
my $prefix = $2; |
my $prefix = $2; |
my $ancestor = $3; |
my $ancestor = $3; |
Line 674 sub do_paste_from_buffer {
|
Line 761 sub do_paste_from_buffer {
|
$ancestor = substr($ancestor,-10,10); |
$ancestor = substr($ancestor,-10,10); |
} |
} |
$oldid = $path.$prefix.$ancestor; |
$oldid = $path.$prefix.$ancestor; |
} |
my $counter = 0; |
my $counter = 0; |
my $newurl=$oldid.$newid.'.'.$ext; |
my $newurl=$oldid.$newid.'.'.$ext; |
my $is_unique = &uniqueness_check($newurl); |
my $is_unique = &uniqueness_check($newurl); |
if ($allmaps{$newurl}) { |
while (!$is_unique && $counter < 100) { |
$is_unique = 0; |
$counter ++; |
} |
$newid ++; |
while (!$is_unique && $allmaps{$newurl} && $counter < 100) { |
$newurl = $oldid.$newid; |
$counter ++; |
$is_unique = &uniqueness_check($newurl); |
$newid ++; |
} |
$newurl = $oldid.$newid; |
if (!$is_unique) { |
$is_unique = &uniqueness_check($newurl); |
if ($url=~/\.page$/) { |
} |
return &mt('Paste failed: an error occurred creating a unique URL for the composite page'); |
if ($is_unique) { |
|
if ($path =~ m{^/uploaded/($match_domain)/($match_courseid)/$}) { |
|
$srcdom = $1; |
|
$srcnum = $2; |
|
if (($1 ne $coursedom) && ($2 ne $coursenum)) { |
|
my $srcdom = $1; |
|
my $srcnum = $2; |
|
if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { |
|
&url_paste_fixups($oldid,$ext,$coursedom,$coursenum, |
|
\%allmaps, \%rewrites,\%copies,\%dbcopies,\%zombies,\%params); |
|
} else { |
|
return &mt('Paste failed: Item is from a different course which you do not have rights to edit'); |
|
} |
|
} |
|
} |
} else { |
} else { |
return &mt('Paste failed: an error occurred creating a unique URL for the folder'); |
if ($url=~/\.page$/) { |
|
return &mt('Paste failed: an error occurred creating a unique URL for the composite page'); |
|
} else { |
|
return &mt('Paste failed: an error occurred creating a unique URL for the folder'); |
|
} |
|
} |
|
my $storefn=$newurl; |
|
$storefn=~s{^/\w+/$match_domain/$match_username/}{}; |
|
my $paste_map_result = |
|
&Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn, |
|
&Apache::lonnet::getfile($url)); |
|
if ($paste_map_result eq '/adm/notfound.html') { |
|
if ($url=~/\.page$/) { |
|
return &mt('Paste failed: an error occurred saving the composite page'); |
|
} else { |
|
return &mt('Paste failed: an error occurred saving the folder'); |
|
} |
|
} |
|
$url = $newurl; |
|
} elsif ($url=~m {^/res/}) { |
|
# published maps can only exists once, so remove it from paste buffer when done |
|
&Apache::lonnet::delenv('docs.markedcopy'); |
|
if ($allmaps{$url}) { |
|
return &mt('Paste failed: only one instance of a particular published sequence or page is allowed within each course.'); |
} |
} |
} |
} |
my $storefn=$newurl; |
} elsif ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/}) { |
$storefn=~s{^/\w+/$match_domain/$match_username/}{}; |
if (($1 ne $coursedom) || ($2 ne $coursenum)) { |
my $paste_map_result = |
$srcdom = $1; |
&Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn, |
$srcnum = $2; |
&Apache::lonnet::getfile($url)); |
unless ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { |
if ($paste_map_result eq '/adm/notfound.html') { |
return &mt('Paste failed: Item is from a different course which you do not have rights to edit'); |
if ($url=~/\.page$/) { |
|
return &mt('Paste failed: an error occurred saving the composite page'); |
|
} else { |
|
return &mt('Paste failed: an error occurred saving the folder'); |
|
} |
} |
} |
} |
$url = $newurl; |
|
} |
|
# published maps can only exists once, so remove it from paste buffer when done |
|
if (($url=~/\.(page|sequence)$/) && ($url=~m {^/res/})) { |
|
&Apache::lonnet::delenv('docs.markedcopy'); |
|
} |
} |
if ($url=~ m{/smppg$}) { |
if ($url=~ m{/smppg$}) { |
my $db_name = &Apache::lonsimplepage::get_db_name($url); |
my $db_name = &Apache::lonsimplepage::get_db_name($url); |
Line 722 sub do_paste_from_buffer {
|
Line 837 sub do_paste_from_buffer {
|
$title=&mt('Copy of').' '.$title; |
$title=&mt('Copy of').' '.$title; |
} |
} |
} |
} |
|
my ($relpath,$oldprefix,$prefixchg); |
|
if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(docs|supplemental)/(.+)$}) { |
|
$oldprefix = $1; |
|
$relpath = $2; |
|
if (($folder =~ /^supplemental/) && ($oldprefix eq 'docs')) { |
|
$prefixchg = 1; |
|
} elsif (($folder =~ /^default/) && ($oldprefix eq 'supplemental')) { |
|
$prefixchg = 1; |
|
} |
|
} |
$title = &LONCAPA::map::qtunescape($title); |
$title = &LONCAPA::map::qtunescape($title); |
my $ext='false'; |
my $ext='false'; |
if ($url=~m{^http(|s)://}) { $ext='true'; } |
if ($url=~m{^http(|s)://}) { $ext='true'; } |
$url = &LONCAPA::map::qtunescape($url); |
$url = &LONCAPA::map::qtunescape($url); |
# Now insert the URL at the bottom |
# Now insert the URL at the bottom |
my $newidx = &LONCAPA::map::getresidx($url); |
my $newidx = &LONCAPA::map::getresidx($url); |
|
if ($relpath ne '') { |
|
my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$}); |
|
my ($newloc,$newsubdir) = ($folder =~ /^(default|supplemental)_?(\d*)/); |
|
my $newprefix = $newloc; |
|
if ($newloc eq 'default') { |
|
$newprefix = 'docs'; |
|
} |
|
if ($newsubdir eq '') { |
|
$newsubdir = 'default'; |
|
} |
|
if (($prefixchg) || ($srcdom ne '') && ($srcnum ne '')) { |
|
my $newpath = "$newprefix/$newsubdir/$newidx/$rem"; |
|
$url = |
|
&Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath, |
|
&Apache::lonnet::getfile($oldurl)); |
|
if ($url eq '/adm/notfound.html') { |
|
return &mt('Paste failed: an error occurred saving the file.'); |
|
} else { |
|
my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$}); |
|
$newsubpath =~ s{/+$}{/}; |
|
$moves{$oldurl} = $newsubpath; |
|
} |
|
} |
|
} |
|
my $noparams = 0; |
|
if ((ref($params{$oldurl}) eq 'HASH') && ($relpath ne '') && ($folder =~ /^supplemental/)) { |
|
$noparams = 1; |
|
} |
|
&apply_fixups($coursedom,$coursenum,$oldurl,$url,$noparams,\%rewrites,\%copies, |
|
\%dbcopies,\%zombies,\%params,\%moves); |
if ($env{'docs.markedcopy_supplemental'}) { |
if ($env{'docs.markedcopy_supplemental'}) { |
if ($folder =~ /^supplemental/) { |
if ($folder =~ /^supplemental/) { |
$title = $env{'docs.markedcopy_supplemental'}; |
$title = $env{'docs.markedcopy_supplemental'}; |
} else { |
} else { |
(undef,undef,$title) = |
(undef,undef,$title) = |
&parse_supplemental_title($env{'docs.markedcopy_supplemental'}); |
&Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'}); |
} |
} |
} else { |
} else { |
if ($folder=~/^supplemental/) { |
if ($folder=~/^supplemental/) { |
Line 748 sub do_paste_from_buffer {
|
Line 903 sub do_paste_from_buffer {
|
# Store the result |
# Store the result |
} |
} |
|
|
|
sub dbcopy { |
|
my ($url,$coursedom,$coursenum) = @_; |
|
if ($url=~ m{/smppg$}) { |
|
my $db_name = &Apache::lonsimplepage::get_db_name($url); |
|
if ($db_name =~ /^smppage_/) { |
|
#simple pages, need to copy the db contents to a new one. |
|
my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum); |
|
my $now = time(); |
|
$db_name =~ s{_\d*$ }{_$now}x; |
|
my $result=&Apache::lonnet::put($db_name,\%contents, |
|
$coursedom,$coursenum); |
|
$url =~ s{/(\d*)/smppg$ }{/$now/smppg}x; |
|
} |
|
} |
|
return $url; |
|
} |
|
|
sub uniqueness_check { |
sub uniqueness_check { |
my ($newurl) = @_; |
my ($newurl) = @_; |
my $unique = 1; |
my $unique = 1; |
Line 762 sub uniqueness_check {
|
Line 934 sub uniqueness_check {
|
return $unique; |
return $unique; |
} |
} |
|
|
|
sub contained_map_check { |
|
my ($url,$folder,$removefrommap,$addedmaps) = @_; |
|
my $content = &Apache::lonnet::getfile($url); |
|
unless ($content eq '-1') { |
|
my $parser = HTML::TokeParser->new(\$content); |
|
$parser->attr_encoded(1); |
|
while (my $token = $parser->get_token) { |
|
next if ($token->[0] ne 'S'); |
|
if ($token->[1] eq 'resource') { |
|
next if ($token->[2]->{'type'} eq 'zombie'); |
|
my $ressrc = $token->[2]->{'src'}; |
|
if ($folder =~ /^supplemental/) { |
|
unless (&supp_pasteable($ressrc)) { |
|
$removefrommap->{$url}{$token->[2]->{'id'}}; |
|
next; |
|
} |
|
} |
|
if ($ressrc =~ /\.(sequence|page)$/) { |
|
if (ref($addedmaps->{$ressrc}) eq 'ARRAY') { |
|
push(@{$addedmaps->{$ressrc}},$url); |
|
} else { |
|
$addedmaps->{$ressrc} = [$url]; |
|
} |
|
&contained_map_check($ressrc,$folder,$removefrommap,$addedmaps); |
|
} |
|
} elsif ($token->[1] !~ /^resource|map|link$/) { |
|
if ($folder =~ /^supplemental/) { |
|
$removefrommap->{$url}{$token->[1]}; |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub reinit_role { |
|
my ($cdom,$cnum,$chome) = @_; |
|
my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum"); |
|
unless ($ferr) { |
|
&Apache::loncommon::update_content_constraints($cdom,$cnum,$chome,$cdom.'_'.$cnum); |
|
} |
|
return; |
|
} |
|
|
|
sub url_paste_fixups { |
|
my ($oldurl,$ext,$cdom,$cnum,$allmaps,$rewrites,$copies,$dbcopies,$zombies,$params) = @_; |
|
my $file = &Apache::lonnet::getfile("$oldurl.$ext"); |
|
return if ($file eq '-1'); |
|
my $parser = HTML::TokeParser->new(\$file); |
|
$parser->attr_encoded(1); |
|
while (my $token = $parser->get_token) { |
|
next if ($token->[0] ne 'S'); |
|
if ($token->[1] eq 'resource') { |
|
my $ressrc = $token->[2]->{'src'}; |
|
next if ($ressrc eq ''); |
|
next if ($token->[2]->{'type'} eq 'external'); |
|
my $id = $token->[2]->{'id'}; |
|
if ($token->[2]->{'type'} eq 'zombie') { |
|
$zombies->{$oldurl}{$ressrc} = $id; |
|
} elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)}) { |
|
my $srccdom = $1; |
|
my $srccnum = $2; |
|
my $rem = $3; |
|
if (($srccdom ne $cdom) || ($srccnum ne $cnum)) { |
|
if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) { |
|
$rewrites->{$oldurl}{$ressrc} = $id; |
|
&url_paste_fixups($ressrc,$3,$cdom,$cnum,$allmaps,$rewrites,$copies,$dbcopies,$zombies,$params); |
|
} else { |
|
$rewrites->{$oldurl}{$ressrc} = $id; |
|
$copies->{$oldurl}{$ressrc} = $id; |
|
} |
|
} |
|
} elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/(.+)$}) { |
|
my $srccdom = $1; |
|
my $srccnum = $2; |
|
if (($srccdom ne $cdom) || ($srccnum ne $cnum)) { |
|
$rewrites->{$oldurl}{$ressrc} = $id; |
|
$dbcopies->{$oldurl}{$ressrc} = $id; |
|
} |
|
} elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) { |
|
my $srccdom = $1; |
|
my $srccnum = $2; |
|
if (($srccdom ne $cdom) || ($srccnum ne $cnum)) { |
|
$rewrites->{$oldurl}{$ressrc} = $id; |
|
$dbcopies->{$oldurl}{$ressrc} = $id; |
|
} |
|
} |
|
} elsif ($token->[1] eq 'param') { |
|
my $to = $token->[2]->{'to'}; |
|
if ($to ne '') { |
|
if (ref($params->{$oldurl}{$to}) eq 'ARRAY') { |
|
push (@{$params->{$oldurl}{$to}},$token->[2]->{'name'}); |
|
} else { |
|
@{$params->{$oldurl}{$to}} = ($token->[2]->{'name'}); |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub apply_fixups { |
|
my ($cdom,$cnum,$oldurl,$url,$noparams,$rewrites,$copies,$dbcopies,$zombies,$params, |
|
$moves) = @_; |
|
my (%newdb,%newdoc); |
|
if (ref($dbcopies->{$oldurl}) eq 'HASH') { |
|
foreach my $item (keys(%{$dbcopies->{$oldurl}})) { |
|
$newdb{$item} = &dbcopy($item); |
|
} |
|
} |
|
my @allcopies; |
|
if (ref($copies->{$oldurl}) eq 'HASH') { |
|
push(@allcopies,keys(%{$copies->{$oldurl}})); |
|
} |
|
if ((ref($moves) eq 'HASH') && (exists($moves->{$oldurl}))) { |
|
push(@allcopies,$oldurl); |
|
} |
|
if (@allcopies > 0) { |
|
foreach my $item (@allcopies) { |
|
my $content = &Apache::lonnet::getfile($item); |
|
unless ($content eq '-1') { |
|
my $mm = new File::MMagic; |
|
my $mimetype = $mm->checktype_contents($content); |
|
if ($mimetype eq 'text/html') { |
|
my (%allfiles,%codebase,$state); |
|
if (&Apache::lonnet::extract_embedded_items(undef,\%allfiles,\%codebase,\$content) eq 'ok') { |
|
my ($numexisting,$numpathchanges,$existing); |
|
(undef,$numexisting,$numpathchanges,$existing) = |
|
&Apache::loncommon::ask_for_embedded_content( |
|
'/adm/coursedocs',$state,\%allfiles,\%codebase, |
|
{'error_on_invalid_names' => 1, |
|
'ignore_remote_references' => 1, |
|
'docs_url' => $oldurl, |
|
'context' => 'paste'}); |
|
if ($numexisting > 0) { |
|
if (ref($existing) eq 'HASH') { |
|
my ($relpath) = ($item =~ m{^(/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(?:default|\d+)/.*/)[^/]+$}); |
|
foreach my $dep (keys(%{$existing})) { |
|
$dep =~ s{^\Q$relpath\E}{}; |
|
my $depfile = $relpath.$dep; |
|
my $depstorefn; |
|
if ((ref($copies->{$oldurl}) eq 'HASH') && |
|
($copies->{$oldurl}{$item})) { |
|
$depstorefn = $relpath; |
|
$depstorefn =~s{^/\w+/$match_domain/$match_courseid/}{}; |
|
} elsif ((ref($moves) eq 'HASH') && |
|
(exists($moves->{$oldurl}))) { |
|
$depstorefn = $moves->{$oldurl}; |
|
} |
|
$depstorefn .= $dep; |
|
my $depcontent = &Apache::lonnet::getfile($depfile); |
|
unless ($depcontent eq '-1') { |
|
&Apache::lonclonecourse::writefile($env{'request.course.id'},$depstorefn,$depcontent); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
my $storefn=$item; |
|
unless (exists($moves->{$oldurl})) { |
|
$storefn=~s{^/\w+/$match_domain/$match_courseid/}{}; |
|
$newdoc{$item} = &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn,$content); |
|
} |
|
} |
|
} |
|
} |
|
if (((ref($rewrites->{$oldurl}) eq 'HASH') || (ref($zombies->{$oldurl}) eq 'HASH')) || |
|
($noparams) || (keys(%newdb) > 0) || (keys(%newdoc) > 0)) { |
|
my $map = &Apache::lonnet::getfile($url); |
|
my $newcontent; |
|
unless ($map eq '-1') { |
|
my $parser = HTML::TokeParser->new(\$map); |
|
$parser->attr_encoded(1); |
|
while (my $token = $parser->get_token) { |
|
if ($token->[0] eq 'S') { |
|
next if ($token->[2]->{'type'} eq 'zombie'); |
|
next if (($token->[1] eq 'param') && $noparams); |
|
if ($token->[1] eq 'resource') { |
|
my $src = $token->[2]->{'src'}; |
|
my $id = $token->[2]->{'id'}; |
|
if (($rewrites->{$oldurl}{$src} eq $id) || ($newdb{$src} ne '') |
|
|| ($newdoc{$src} ne '')) { |
|
if (ref($rewrites->{$oldurl}) eq 'HASH') { |
|
if ($rewrites->{$oldurl}{$src} eq $id) { |
|
$token->[2]->{'src'} =~ s{^(/uploaded|adm|public)/$match_domain/$match_courseid/}{$1/$cdom/$cnum}; |
|
} |
|
} elsif ($newdb{$src} ne '') { |
|
$token->[2]->{'src'} = $newdb{$src}; |
|
} |
|
$newcontent .= "<$token->[1] "; |
|
foreach my $attr (@{$token->[3]}) { |
|
$newcontent .= ' '.$attr.'="'.$token->[2]->{$attr},'"' |
|
} |
|
$newcontent .= ' />'; |
|
} else { |
|
$newcontent .= $token->[4]."\n"; |
|
} |
|
} |
|
} elsif ($token->[0] eq 'E') { |
|
$newcontent .= $token->[2]."\n"; |
|
} |
|
} |
|
} |
|
my $storefn=$url; |
|
$storefn=~s{^/\w+/$match_domain/$match_courseid/}{}; |
|
my $storeres = |
|
&Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn, |
|
$newcontent); |
|
} |
|
return; |
|
} |
|
|
my %parameter_type = ( 'randompick' => 'int_pos', |
my %parameter_type = ( 'randompick' => 'int_pos', |
'hiddenresource' => 'string_yesno', |
'hiddenresource' => 'string_yesno', |
'encrypturl' => 'string_yesno', |
'encrypturl' => 'string_yesno', |
Line 1014 sub editor {
|
Line 1399 sub editor {
|
my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; |
my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; |
$r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto, |
$r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto, |
$readfile)); |
$readfile)); |
&print_paste_buffer($r,$container); |
&print_paste_buffer($r,$container,$folder); |
} else { |
} else { |
if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { |
if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { |
#Function Box for Supplemental Content for users with mdc priv. |
#Function Box for Supplemental Content for users with mdc priv. |
Line 1190 sub is_supplemental_title {
|
Line 1575 sub is_supplemental_title {
|
return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/); |
return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/); |
} |
} |
|
|
sub parse_supplemental_title { |
|
my ($title) = @_; |
|
|
|
my ($foldertitle,$renametitle); |
|
if ($title =~ /&&&/) { |
|
$title = &HTML::Entites::decode($title); |
|
} |
|
if ($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/) { |
|
$renametitle=$4; |
|
my ($time,$uname,$udom) = ($1,$2,$3); |
|
$foldertitle=&Apache::lontexconvert::msgtexconverted($4); |
|
my $name = &Apache::loncommon::plainname($uname,$udom); |
|
$name = &HTML::Entities::encode($name,'"<>&\''); |
|
$renametitle = &HTML::Entities::encode($renametitle,'"<>&\''); |
|
$title='<i>'.&Apache::lonlocal::locallocaltime($time).'</i> '. |
|
$name.': <br />'.$foldertitle; |
|
} |
|
if (wantarray) { |
|
return ($title,$foldertitle,$renametitle); |
|
} |
|
return $title; |
|
} |
|
|
|
# --------------------------------------------------------------- An entry line |
# --------------------------------------------------------------- An entry line |
|
|
sub entryline { |
sub entryline { |
my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$crstype)=@_; |
my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$crstype)=@_; |
my ($foldertitle,$pagetitle,$renametitle); |
my ($foldertitle,$pagetitle,$renametitle); |
if (&is_supplemental_title($title)) { |
if (&is_supplemental_title($title)) { |
($title,$foldertitle,$renametitle) = &parse_supplemental_title($title); |
($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title); |
$pagetitle = $foldertitle; |
$pagetitle = $foldertitle; |
} else { |
} else { |
$title=&HTML::Entities::encode($title,'"<>&\''); |
$title=&HTML::Entities::encode($title,'"<>&\''); |
Line 1664 sub checkonthis {
|
Line 2026 sub checkonthis {
|
|
|
=item list_symbs() |
=item list_symbs() |
|
|
List Content Idenifiers |
List Content Identifiers |
|
|
=cut |
=cut |
|
|
Line 2108 sub startContentScreen {
|
Line 2470 sub startContentScreen {
|
if (($mode eq 'navmaps') || ($mode eq 'supplemental')) { |
if (($mode eq 'navmaps') || ($mode eq 'supplemental')) { |
$output .= '<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b> '.&mt('Content Overview').' </b></a></li>'."\n"; |
$output .= '<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b> '.&mt('Content Overview').' </b></a></li>'."\n"; |
$output .= '<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b> '.&mt('Content Search').' </b></a></li>'."\n"; |
$output .= '<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b> '.&mt('Content Search').' </b></a></li>'."\n"; |
|
$output .= '<li'.(($mode eq 'courseindex')?' class="active"':'').'><a href="/adm/indexcourse"><b> '.&mt('Content Index').' </b></a></li>'."\n"; |
$output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>'; |
$output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>'; |
} else { |
} else { |
$output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b> '.&mt('Content Editor').' </b></a></li>'."\n"; |
$output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b> '.&mt('Content Editor').' </b></a></li>'."\n"; |
Line 2440 sub handler {
|
Line 2803 sub handler {
|
$script .= &editing_js($udom,$uname,$supplementalflag). |
$script .= &editing_js($udom,$uname,$supplementalflag). |
&history_tab_js(). |
&history_tab_js(). |
&inject_data_js(). |
&inject_data_js(). |
&resize_contentdiv_js($tabidstr); |
&Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr); |
$addentries = { |
$addentries = { |
onload => "javascript:resize_contentdiv('contentscroll','1','1');", |
onload => "javascript:resize_scrollbox('contentscroll','1','1');", |
}; |
}; |
} |
} |
} |
} |
Line 2540 sub handler {
|
Line 2903 sub handler {
|
'upld' => 'Import Document', |
'upld' => 'Import Document', |
'srch' => 'Search', |
'srch' => 'Search', |
'impo' => 'Import', |
'impo' => 'Import', |
'wish' => 'Import from Wishlist', |
'lnks' => 'Import from Stored Links', |
'selm' => 'Select Map', |
'selm' => 'Select Map', |
'load' => 'Load Map', |
'load' => 'Load Map', |
'reco' => 'Recover Deleted Documents', |
'reco' => 'Recover Deleted Documents', |
Line 2608 SEDFFORM
|
Line 2971 SEDFFORM
|
my @simpleeditdefaultforma = ( |
my @simpleeditdefaultforma = ( |
{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'" onclick="javascript:groupsearch()" />' => "$uploadtag<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" }, |
{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'" onclick="javascript:groupsearch()" />' => "$uploadtag<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" }, |
{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'" onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" }, |
{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'" onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" }, |
{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{wish}.'" onclick="javascript:open_Wishlist_Import();" />' => "<a class='LC_menubuttons_link' href='javascript:open_Wishlist_Import();'>$lt{'wish'}</a>" }, |
{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{lnks}.'" onclick="javascript:open_StoredLinks_Import();" />' => "<a class='LC_menubuttons_link' href='javascript:open_StoredLinks_Import();'>$lt{'lnks'}</a>" }, |
); |
); |
$simpleeditdefaultform .= &create_form_ul(&create_list_elements(@simpleeditdefaultforma)); |
$simpleeditdefaultform .= &create_form_ul(&create_list_elements(@simpleeditdefaultforma)); |
$simpleeditdefaultform .=(<<SEDFFORM); |
$simpleeditdefaultform .=(<<SEDFFORM); |
Line 2875 NGFFORM
|
Line 3238 NGFFORM
|
$communityform = &create_form_ul(&create_list_elements(@communityforma)); |
$communityform = &create_form_ul(&create_list_elements(@communityforma)); |
|
|
my %orderhash = ( |
my %orderhash = ( |
'aa' => ['Import Documents',$fileuploadform], |
'aa' => ['Import Content',$fileuploadform], |
'bb' => ['Published Resources',$simpleeditdefaultform], |
'bb' => ['Published Content',$simpleeditdefaultform], |
'cc' => ['Grading Resources',$gradingform], |
'cc' => ['Grading Resources',$gradingform], |
); |
); |
unless ($env{'form.pagepath'}) { |
unless ($env{'form.pagepath'}) { |
Line 2995 my @supimportdoc = (
|
Line 3358 my @supimportdoc = (
|
$supupdocform = &create_form_ul(&create_list_elements(@supimportdoc)) . '<hr id="ee_hrule" style="width:0px;text-align:left;margin-left:0" />' . $supupdocform; |
$supupdocform = &create_form_ul(&create_list_elements(@supimportdoc)) . '<hr id="ee_hrule" style="width:0px;text-align:left;margin-left:0" />' . $supupdocform; |
my %suporderhash = ( |
my %suporderhash = ( |
'00' => ['Supnewfolder', $supnewfolderform], |
'00' => ['Supnewfolder', $supnewfolderform], |
'ee' => ['Import Documents',$supupdocform], |
'ee' => ['Import Content',$supupdocform], |
'ff' => ['Special Documents',&create_form_ul(&create_list_elements(@specialdocs))] |
'ff' => ['Special Documents',&create_form_ul(&create_list_elements(@specialdocs))] |
); |
); |
if ($supplementalflag) { |
if ($supplementalflag) { |
Line 3101 sub decompression_phase_one {
|
Line 3464 sub decompression_phase_one {
|
my ($dir,$file,$warning,$error,$output); |
my ($dir,$file,$warning,$error,$output); |
my ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,$hiddenelem)= |
my ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,$hiddenelem)= |
&decompression_info(); |
&decompression_info(); |
if ($env{'form.archiveurl'} !~ m{^/uploaded/\Q$docudom/$docuname/docs/\E(?:default|supplemental|\d+).*/([^/]+)$}) { |
if ($env{'form.archiveurl'} !~ m{^/uploaded/\Q$docudom/$docuname/\E(?:docs|supplemental)/(?:default|\d+).*/([^/]+)$}) { |
$error = &mt('Archive file "[_1]" not in the expected location.',$env{'form.archiveurl'}); |
$error = &mt('Archive file "[_1]" not in the expected location.',$env{'form.archiveurl'}); |
} else { |
} else { |
my $file = $1; |
my $file = $1; |
Line 3280 sub generate_edit_table {
|
Line 3643 sub generate_edit_table {
|
my $backicon = $iconpath.'clickhere.gif'; |
my $backicon = $iconpath.'clickhere.gif'; |
my $backtext = &mt('To Overview'); |
my $backtext = &mt('To Overview'); |
$form = '<div class="LC_Box" style="margin:0;">'. |
$form = '<div class="LC_Box" style="margin:0;">'. |
'<ul id="navigation'.$tid.'" class="LC_TabContent">'."\n". |
'<ul id="navigation'.$tid.'" class="LC_TabContent">'."\n". |
'<li class="goback">'. |
'<li class="goback">'. |
'<a href="javascript:toContents('."'$jumpto'".');">'. |
'<a href="javascript:toContents('."'$jumpto'".');">'. |
'<img src="'.$backicon.'" class="LC_icon" style="border: none; vertical-align: top;"'. |
'<img src="'.$backicon.'" class="LC_icon" style="border: none; vertical-align: top;"'. |
' alt="'.$backtext.'" />'.$backtext.'</a></li>'."\n"; |
' alt="'.$backtext.'" />'.$backtext.'</a></li>'."\n". |
if ($tid == 1) { |
'<li>'. |
$form .= '<li>'. |
'<a href="javascript:groupopen('."'$readfile'".',1);">'. |
'<a href="javascript:groupopen('."'$readfile'".',1);">'. |
&mt('Undo Delete').'</a></li>'."\n"; |
&mt('Undo Delete').'</a></li>'."\n"; |
if ($env{'form.docslog'}) { |
if ($env{'form.docslog'}) { |
$form .= '<li class="active">'; |
$form .= '<li class="active">'; |
} else { |
} else { |
$form .= '<li>'; |
$form .= '<li>'; |
} |
} |
$form .= '<a href="javascript:toggleHistoryDisp(1);">'. |
$form .= '<a href="javascript:toggleHistoryDisp(1);">'. |
&mt('History').'</a></li>'."\n"; |
&mt('History').'</a></li>'."\n"; |
if ($env{'form.docslog'}) { |
if ($env{'form.docslog'}) { |
$form .= '<li><a href="javascript:toggleHistoryDisp(0);">'. |
$form .= '<li><a href="javascript:toggleHistoryDisp(0);">'. |
&mt('Edit').'</a></li>'."\n"; |
&mt('Edit').'</a></li>'."\n"; |
|
} |
|
} |
} |
foreach my $name (reverse(sort(keys(%orderhash)))) { |
foreach my $name (reverse(sort(keys(%orderhash)))) { |
if($name ne '00'){ |
if($name ne '00'){ |
Line 3682 function showPage(current, pageId, nav,
|
Line 4043 function showPage(current, pageId, nav,
|
} |
} |
} |
} |
} |
} |
resize_contentdiv('contentscroll','1','0'); |
resize_scrollbox('contentscroll','1','0'); |
return false; |
return false; |
} |
} |
|
|
Line 3799 function choose_switchserver_window() {
|
Line 4160 function choose_switchserver_window() {
|
ENDSWITCHJS |
ENDSWITCHJS |
} |
} |
|
|
sub resize_contentdiv_js { |
|
my ($tabidstr) = @_; |
|
my $viewport_js = &Apache::loncommon::viewport_geometry_js(); |
|
return <<ENDRESIZESCRIPT; |
|
|
|
window.onresize=resizeContentEditor; |
|
|
|
var activeTab; |
|
|
|
$viewport_js |
|
|
|
function resize_contentdiv(scrollboxname,chkw,chkh) { |
|
var scrollboxid = 'div_'+scrollboxname; |
|
var scrolltableid = 'table_'+scrollboxname; |
|
var scrollbox; |
|
var scrolltable; |
|
|
|
if (document.getElementById("contenteditor") == null) { |
|
return; |
|
} |
|
|
|
if (document.getElementById(scrollboxid) == null) { |
|
return; |
|
} else { |
|
scrollbox = document.getElementById(scrollboxid); |
|
} |
|
|
|
if (document.getElementById(scrolltableid) == null) { |
|
return; |
|
} else { |
|
scrolltable = document.getElementById(scrolltableid); |
|
} |
|
|
|
init_geometry(); |
|
var vph = Geometry.getViewportHeight(); |
|
var vpw = Geometry.getViewportWidth(); |
|
|
|
var alltabs = ['$tabidstr']; |
|
var listwchange; |
|
if (chkw == 1) { |
|
var contenteditorw = document.getElementById("contenteditor").offsetWidth; |
|
var contentlistw; |
|
var contentlistid = document.getElementById("contentlist"); |
|
if (contentlistid != null) { |
|
contentlistw = document.getElementById("contentlist").offsetWidth; |
|
} |
|
var contentlistwstart = contentlistw; |
|
|
|
var scrollboxw = scrollbox.offsetWidth; |
|
var scrollboxscrollw = scrollbox.scrollWidth; |
|
|
|
var offsetw = parseInt(vpw * 0.015); |
|
var paddingw = parseInt(vpw * 0.09); |
|
|
|
var minscrollboxw = 250; |
|
|
|
var maxtabw = 0; |
|
var actabw = 0; |
|
for (var i=0; i<alltabs.length; i++) { |
|
if (activeTab == alltabs[i]) { |
|
actabw = document.getElementById(alltabs[i]).offsetWidth; |
|
if (actabw > maxtabw) { |
|
maxtabw = actabw; |
|
} |
|
} else { |
|
if (document.getElementById(alltabs[i]) != null) { |
|
var thistab = document.getElementById(alltabs[i]); |
|
thistab.style.visibility = 'hidden'; |
|
thistab.style.display = 'block'; |
|
var tabw = document.getElementById(alltabs[i]).offsetWidth; |
|
thistab.style.display = 'none'; |
|
thistab.style.visibility = ''; |
|
if (tabw > maxtabw) { |
|
maxtabw = tabw; |
|
} |
|
} |
|
} |
|
} |
|
|
|
if (maxtabw > 0) { |
|
var newscrollboxw; |
|
if (maxtabw+paddingw+scrollboxscrollw<contenteditorw) { |
|
newscrollboxw = contenteditorw-paddingw-maxtabw; |
|
if (newscrollboxw < minscrollboxw) { |
|
newscrollboxw = minscrollboxw; |
|
} |
|
scrollbox.style.width = newscrollboxw+"px"; |
|
if (newscrollboxw != scrollboxw) { |
|
var newcontentlistw = newscrollboxw-offsetw; |
|
contentlistid.style.width = newcontentlistw+"px"; |
|
} |
|
} else { |
|
newscrollboxw = contenteditorw-paddingw-maxtabw; |
|
if (newscrollboxw < minscrollboxw) { |
|
newscrollboxw = minscrollboxw; |
|
} |
|
scrollbox.style.width = newscrollboxw+"px"; |
|
if (newscrollboxw != scrollboxw) { |
|
var newcontentlistw = newscrollboxw-offsetw; |
|
contentlistid.style.width = newcontentlistw+"px"; |
|
} |
|
} |
|
|
|
if (newscrollboxw != scrollboxw) { |
|
var newscrolltablew = newscrollboxw+offsetw; |
|
scrolltable.style.width = newscrolltablew+"px"; |
|
} |
|
} |
|
|
|
if (contentlistid.offsetWidth != contentlistwstart) { |
|
listwchange = 1; |
|
} |
|
|
|
if (activeTab == 'cc1') { |
|
if (document.getElementById('cc_hrule') != null) { |
|
document.getElementById('cc_hrule').style.width=actabw+"px"; |
|
} |
|
} else { |
|
if (activeTab == 'bb1') { |
|
if (document.getElementById('bb_hrule') != null) { |
|
document.getElementById('bb_hrule').style.width=actabw+"px"; |
|
} |
|
} else { |
|
if (activeTab == 'ee2') { |
|
if (document.getElementById('ee_hrule') != null) { |
|
document.getElementById('ee_hrule').style.width=actabw+"px"; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if ((chkh == 1) || (listwchange)) { |
|
var primaryheight = document.getElementById("LC_nav_bar").offsetHeight; |
|
var secondaryheight = document.getElementById("LC_secondary_menu").offsetHeight; |
|
var crumbsheight = document.getElementById("LC_breadcrumbs").offsetHeight; |
|
var dccidheight = document.getElementById("dccid").offsetHeight; |
|
|
|
var uploadresultheight = 0; |
|
if (document.getElementById("uploadfileresult") != null) { |
|
uploadresultheight = document.getElementById("uploadfileresult").offsetHeight; |
|
} |
|
var tabbedheight = document.getElementById("tabbededitor").offsetHeight; |
|
var contenteditorheight = document.getElementById("contenteditor").offsetHeight; |
|
var scrollboxheight = scrollbox.offsetHeight; |
|
var scrollboxscrollheight = scrollbox.scrollHeight; |
|
var freevspace = vph-(primaryheight+secondaryheight+crumbsheight+dccidheight+uploadresultheight+tabbedheight+contenteditorheight); |
|
|
|
var minvscrollbox = 200; |
|
var offsetv = 20; |
|
var newscrollboxheight; |
|
if (freevspace < 0) { |
|
newscrollboxheight = scrollboxheight+freevspace-offsetv; |
|
if (newscrollboxheight < minvscrollbox) { |
|
newscrollboxheight = minvscrollbox; |
|
} |
|
scrollbox.style.height = newscrollboxheight + "px"; |
|
} else { |
|
if (scrollboxscrollheight > scrollboxheight) { |
|
if (freevspace > offsetv) { |
|
newscrollboxheight = scrollboxheight+freevspace-offsetv; |
|
if (newscrollboxheight < minvscrollbox) { |
|
newscrollboxheight = minvscrollbox; |
|
} |
|
scrollbox.style.height = newscrollboxheight+"px"; |
|
} |
|
} |
|
} |
|
scrollboxheight = scrollbox.offsetHeight; |
|
var contentlistheight = document.getElementById("contentlist").offsetHeight; |
|
|
|
if (scrollboxscrollheight <= scrollboxheight) { |
|
if ((contentlistheight+offsetv)<scrollboxheight) { |
|
newscrollheight = contentlistheight+offsetv; |
|
scrollbox.style.height = newscrollheight+"px"; |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
function resizeContentEditor() { |
|
var timer; |
|
clearTimeout(timer) |
|
timer=setTimeout('resize_contentdiv("contentscroll","1","1")',500); |
|
} |
|
|
|
ENDRESIZESCRIPT |
|
return; |
|
} |
|
|
|
sub makedocslogform { |
sub makedocslogform { |
my ($formelems,$docslog) = @_; |
my ($formelems,$docslog) = @_; |
return <<"LOGSFORM"; |
return <<"LOGSFORM"; |
Line 4076 Return hash with valid author names
|
Line 4247 Return hash with valid author names
|
|
|
=item is_supplemental_title() |
=item is_supplemental_title() |
|
|
=item parse_supplemental_title() |
|
|
|
=item entryline() |
=item entryline() |
|
|
=item tiehash() |
=item tiehash() |
Line 4142 Breadcrumbs for special functions
|
Line 4311 Breadcrumbs for special functions
|
|
|
=item dump_switchserver_js() |
=item dump_switchserver_js() |
|
|
=item resize_contentdiv_js() |
=item resize_scrollbox_js() |
|
|
=item makedocslogform() |
=item makedocslogform() |
|
|
|
=item makesimpleeditform() |
|
|
=back |
=back |
|
|
=cut |
=cut |