mourningdove/views/entry/form.tt

448 lines
17 KiB
Text
Raw Permalink Normal View History

2026-05-24 01:03:05 +00:00
[%# entry.tt
Page to post and edit entries
Authors:
Afuna <coder.dw@afunamatata.com>
Copyright (c) 2011-2014 by Dreamwidth Studios, LLC.
This program is free software; you may redistribute it and/or modify it under
the same terms as Perl itself. For a copy of the license, please reference
'perldoc perlartistic' or 'perldoc perlgpl'.
%]
[%- CALL dw.active_resource_group( "foundation" ) -%]
[%- dw.need_res(
"stc/css/pages/entry/new.css"
"stc/css/components/button-groups.css"
"stc/display_none.css"
) -%]
[%- dw.need_res( { group => "foundation" },
## tags (autocomplete)
"js/vendor/jquery.vertigro.js"
"js/jquery/jquery.ui.menu.js"
"js/jquery/jquery.ui.autocomplete.js"
"js/components/jquery.autocompletewithunknown.js"
"stc/jquery/jquery.ui.menu.css"
"stc/jquery/jquery.ui.autocomplete.css"
"stc/css/components/autocompletewithunknown.css"
## collapsing
"js/components/jquery.collapse.js"
"stc/css/components/collapse.css"
## date
"js/vendor/pickadate.js/picker.js"
"js/vendor/pickadate.js/picker.date.js"
"js/vendor/pickadate.js/picker.time.js"
"js/vendor/pickadate.js/legacy.js"
"stc/css/components/pickadate/datetime.css"
# page-specific
"js/pages/entry/new.js"
# code required for old RTE
"js/6alib/httpreq.js"
"js/6alib/core.js"
"js/6alib/dom.js"
"js/livejournal.js"
"js/6alib/ippu.js"
"js/lj_ippu.js"
"js/poll.js"
"stc/fck/fckeditor.js"
"js/pages/entry/rte.js"
# old drafts functionality
"js/pages/entry/drafts.js"
) -%]
[% sections.title = action.edit ? dw.ml( '.title.edit' ) : dw.ml( '.title' ) %]
[% sections.contentopts = '' %]
[% sections.head = BLOCK %]
[%- chalresp_js -%]
<script type="text/javascript">
var postFormInitData = new Object();
postFormInitData.edit = [% action.edit ? "true" : "false" %];
postFormInitData.moodpics = {
[%- FOREACH mood = moodtheme.pics.pairs %]
[% mood.key | js %] : [ [% mood.value.name | js %], [% mood.value.pic | js %], [% mood.value.width | js %], [% mood.value.height | js %] ]
[%- UNLESS loop.last %],[% END -%]
[% END %]
};
postFormInitData.panels = {
"show" : {
[%- FOREACH panel = panels.show.pairs -%]
[%- panel.key | js -%] : [%- panel.value ? "true" : "false" -%]
[%- UNLESS loop.last %],[% END -%]
[%- END -%]
}
};
postFormInitData.security = {
[%- FOREACH level = security_options.pairs %]
[%- level.key | js %] : { 'value': [%~ level.value.value | js ~%]
, 'label': [%~ level.value.label | ml | js ~%]
, 'format': [%~ level.value.format | ml | js ~%]
[%- IF level.value.image -%]
, 'image': { 'src': [%~ level.value.image.src | js ~%]
, 'width': [%~ level.value.image.width | js ~%]
, 'height': [%~ level.value.image.height | js ~%]
}
[%- END -%]
}
[%- UNLESS loop.last %],[% END -%]
[% END %]
};
postFormInitData.minAnimation = [% min_animation ? "true" : "false" %];
postFormInitData.strings = {
"delete_confirm" : [%- "entryform.delete.confirm" | ml | js -%],
"delete_xposts_confirm": [%- "entryform.delete.xposts.confirm" | ml | js -%]
};
[%- IF remote && remote.can_use_userpic_select -%]
postFormInitData.iconBrowser = {
"keywordorder": [%- icon_browser.keywordorder ? "true" : "false" -%],
"metatext": [%- icon_browser.metatext ? "true" : "false" -%],
"smallicons": [%- icon_browser.smallicons ? "true": "false" -%]
};
[%- END -%]
</script>
[% END # sections.head %]
<div class="alert-box secondary">[% ".beta.on" | ml( aopts = "href='$site.root/betafeatures'", user = betacommunity.ljuser_display ) %]</div>
[%- IF warnings.exist -%]
[%- FOREACH warning IN warnings.get_all -%]
<div class="alert-box">[%- warning.message -%]</div>
[%- END -%]
[%- END -%]
<form method="POST" id="js-post-entry" action="[% action.url %]" class="
[%- formwidth == "narrow" ? "entry-partial-width" : "entry-full-width" -%]">
<input type="hidden" id="nojs" value="1" name="nojs" />
[%- dw.form_auth -%]
<div class="current-entry row"><div class="columns"><!-- Start main column sub & entry -->
[%- IF remote -%]
<div class="toolbar-container">
<div class="row"><div class="columns">
<div class='panel radius toolbar text-right'>
[%- IF remote.can_create_polls OR journalu.can_create_polls -%]
[%- INCLUDE "components/icon-link-decorative.tt"
link = {
url = site.root _ "/poll/create"
newwindow = 1
}
icon = "graph-horizontal"
text = "Create Poll"
-%]
[%- END -%]
<span id="js-entry-settings">
[%- INCLUDE "components/icon-link-decorative.tt"
link = {
url = site.root _ "/entry/options"
newwindow = 1
}
icon = "widget"
text = "Rearrange Panels"
-%]
</span>
</div>
</div></div>
<div class="row"><div class="columns">
<div class="panel" id="js-settings-panel"></div>
</div></div>
</div>
[%- END -%]
<div class="row"><div class="columns">
<div class='subject-container'>
[%- form.textbox( label = dw.ml(".subject.label")
name = "subject"
maxlength = limits.subject_length
size = "50"
labelclass = "hidden"
class = "draft-autosave"
placeholder = dw.ml(".subject.placeholder")
) -%]
</div>
</div></div>
<div class="row"><div class="columns">
<div class='markup-container'>
[%- form.select(
label = 'Formatting type'
labelclass = 'invisible'
name = 'editor'
id = 'editor'
select = editors.selected
items = editors.items
class = "draft-autosave"
) -%]
<a href="[% 'markup.helplink.url' | ml %]" tabindex="-1" target="_blank">[%-
dw.img('help', '',
{
alt => dw.ml('markup.helplink.alttext'),
title => dw.ml('markup.helplink.alttext'),
style => 'box-sizing: content-box;'
}
)
-%]</a>
</div>
</div></div>
<div class="row"><div class="columns">
<div class='event-container'>
[%- form.textarea( label = dw.ml(".event.label")
name = "event"
id = "entry-body"
cols = "50"
rows = "18"
wrap = "soft"
labelclass = "hidden"
class = "draft-autosave"
placeholder = dw.ml(".event.placeholder")
) -%]
<small id="draftstatus" type="text" disabled="disabled" name="draftstatus" role="status" aria-live="polite"></small>
</div>
</div></div>
<div class="row"><div class="columns">
<div class="button-bar entry-quick-actions">
<ul class="no-bullet entry-quick-metadata">
<li>
[%- form.submit(
value = dw.ml(action.edit ? '.button.edit.quick' : '.button.post.quick')
name = "action:post"
)
%]</li>[%- FOREACH level = security;
level.label = dw.ml( level.label );
level.format = dw.ml( level.format );
END;
-%]<li>[%- INCLUDE components/fancyselect.tt
name = "security"
id = "js-security"
label = dw.ml( '.select.security' )
items = security
-%]</li>
[%~ IF journallist.size > 1 %]
[%-
journalselect = [];
FOREACH journal IN journallist;
isJournal = journal.equals(remote);
userFormat = isJournal ? "@$journal.user" : "@c:$journal.user";
journalselect.push({
label = journal.user
value = (isJournal ? "" : journal.user)
format = dw.ml( ".select.usejournal.format", { user => userFormat } )
});
END
~%]
<li>[%- INCLUDE components/fancyselect.tt
name = "usejournal"
id = "js-usejournal"
label = dw.ml( '.select.usejournal' )
items = journalselect
-%]</li>
[%~ ELSE ~%]
[%- SET usejournal = journallist.first
isComm = usejournal.is_community
isAdmin = isComm && remote.can_manage( usejournal )
~%]
[%~ IF usejournal ~%]
<li>
<span class="usejournal-text">
[% '.select.usejournal.format' | ml( user = usejournal.ljuser_display ) %]
</span>
[% form.hidden( name = "usejournal", id = "js-usejournal", value = usejournal.user,
"data-is-admin" = isAdmin
"data-is-comm" = isComm
) %]
</li>
[%~ ELSE ~%]
<li>
[%~ form.textbox(
name = "usejournal"
id = "js-usejournal"
label = dw.ml( '.select.usejournal' )
placeholder = dw.ml( '.select.usejournal.format', user = "journal" )
"data-is-admin" = isAdmin
"data-is-comm" = isComm
class = "radius"
) -%]
</li>
[%- END -%]
[%- END -%]
[%- form.hidden( id = "js-remote", name = "poster_remote", value = remote.user ) -%]
</ul>
<ul class="no-bullet secondary-actions">
<li>[%- form.submit( value = dw.ml('talk.btn.preview')
name = "action:preview"
id = "js-preview-button"
class = "secondary button"
)
-%]</li>
</ul>
</div>
</div></div>
</div>
</div> <!-- End main column sub & entry -->
[%- BLOCK components forCommunity = 0 %]
[% FOREACH component = items %]
[%- IF forCommunity -%]<div class='columns medium-6 large-4 [% IF loop.count == items.size %]end[% END %]'>[%- END -%]
<div class='panel component [% component %]-component[% UNLESS forCommunity || panels.show.$component -%] inactive-component[%- END -%]'
data-collapse='[% component %]' data-collapse-state='[% panels.collapsed.$component ? "collapsed" : "expanded" %]'>
[%- file = forCommunity || editable.$component
? "entry/module-${component}.tt"
: "entry/display/module-${component}.tt"
-%]
[%- dw.scoped_include( file ); %]
</div>
[%- IF forCommunity -%]</div>[%- END -%]
[%- END -%]
[% END -%]
<div class="row components-columns">
<div class="columns components first-column sortable-components"><!-- first column of components -->
<div class="inner">
[% PROCESS components items = panels.order.shift %]
</div>
</div>
<div class='columns components second-column sortable-components'> <!-- second column of components -->
<div class="inner">
[% PROCESS components items = panels.order.shift %]
</div>
</div>
<div class='columns components third-column sortable-components'> <!-- third column of components -->
<div class="inner">
[% PROCESS components items = panels.order.shift %]
</div>
</div>
</div>
[%- IF remote -%]
<div class="community-administration">
<hr>
<div class="row">
<div class="columns"><h2>Community Administration</h2></div>
</div>
<div class="row components">
[%- PROCESS components forCommunity = 1
items = [ "community-flags", "sticky" ] -%]
</div>
</div>
[%- END -%]
<div class="row components js-only">
<div class="columns">
[%- dw.scoped_include( "entry/module-access.tt" ) %]
[%- UNLESS remote -%]
[%- dw.scoped_include( "entry/login.tt" ) -%]
[%- END -%]
</div>
</div>
<div class="row">
<div class="columns">
<div class="button-bar">
[%- form.submit( value = dw.ml(action.edit ? '.button.edit' : '.button.post')
name = "action:post"
class = "button left"
)
-%]
[% IF action.edit %]
[%- form.submit( value = dw.ml( '.button.delete' )
name = "action:delete"
id = "js-delete-button"
class = "button secondary right"
)
-%]
[% END %]
</div>
</div>
</div>
</form>
[% js_for_rte %]
<script>
var FCKLang;
if (!FCKLang) FCKLang = {};
FCKLang.UserPrompt = [% dw.ml('fcklang.userprompt') | js %];
FCKLang.UserPrompt_User = [% dw.ml('fcklang.userprompt.user') | js %];
FCKLang.UserPrompt_Site = [% dw.ml('fcklang.userprompt.site') | js %];
FCKLang.UserPrompt_SiteList =[% sitevalues %];
FCKLang.InvalidChars = [% dw.ml('fcklang.invalidchars') | js %];
FCKLang.LJUser = [% dw.ml('fcklang.ljuser') | js %];
FCKLang.LJVideo = [% dw.ml('fcklang.ljvideo2') | js %];
FCKLang.EmbedContents = [% dw.ml('fcklang.embedcontents') | js %];
FCKLang.EmbedPrompt = [% dw.ml('fcklang.embedprompt') | js %];
FCKLang.CutPrompt = [% dw.ml('fcklang.cutprompt') | js %];
FCKLang.ReadMore = [% dw.ml('fcklang.readmore') | js %];
FCKLang.CutContents = [% dw.ml('fcklang.cutcontents') | js %];
FCKLang.LJCut = [% dw.ml('fcklang.ljcut') | js %];
</script>
<script>
// These JS variables contain the contents of the various draft fields.
var restoredDraft = [% draft | js %];
var restoredEditor = [% draft_properties.editor | js %];
var restoredSubject = [% draft_properties.subject | js %];
var restoredUserpic = [% draft_properties.userpic | js %];
var restoredTaglist = [% draft_properties.taglist | js %];
var restoredMoodID = [% draft_properties.moodid | js %];
var restoredMood = [% draft_properties.mood | js %];
var restoredLocation = [% draft_properties.location1 | js %];
var restoredMusic = [% draft_properties.music | js %];
var restoredAdultReason = [% draft_properties.adultreason | js %];
var restoredCommentSet = [% draft_properties.commentset | js %];
var restoredCommentScr = [% draft_properties.commentscr | js %];
var restoredAdultCnt = [% draft_properties.adultcnt | js %];
var autoSaveInterval = [% autosave_interval || 3 %];
var savedMsg = [% dw.ml('.draft.autosave', {time => '[[time]]'}) | js %];
var restoredMsg = [% dw.ml('.draft.restored') | js %]
var confirmMsg = [% draft_subject_raw.defined && draft_subject_raw.length > 0 ? dw.ml( '.draft.confirm2', { subjectline => draft_subject_raw } ) : dw.ml('.draft.confirm') | js %]
var should_init = [%init_draft || 'null' %];
</script>