%PDF- %PDF-
Direktori : /home/waritko/jetty-distribution-9.4.21.v20190926/webapps/ROOT/skins/flamingo/ |
Current File : //home/waritko/jetty-distribution-9.4.21.v20190926/webapps/ROOT/skins/flamingo/editobject.vm |
### ### Object editor ### ### #if($xcontext.getAction() != 'edit') $response.sendRedirect($doc.getURL('edit',"editor=object")) #end ## Macros ## #* * Displays a class name without its space prefix. XML-escapes the output. *# #macro(cleanClassname $classname)$!{escapetool.xml($classname.substring($classname.indexOf('.')).substring(1))}#end ## #* * Display an object * NOTE: the $document.display*(something, ...) methods are very difficult to use correctly, because they sometimes generate (unescaped) HTML *# #macro(displayObject $obj $class $props $firstField) <div id="xobject_${escapetool.xml($class.name)}_${obj.number}" class="xobject"> #getFieldSummary($obj $firstField $firstFieldSummary) <div id="xobject_${escapetool.xml($class.name)}_${obj.number}_title" class="xobject-title"> <h3>#cleanClassname(${class.name}) ${obj.number}#if ($firstField): $firstFieldSummary#end <a href="$doc.getURL('objectremove', "form_token=$!{services.csrf.getToken()}&classname=${escapetool.url($class.name)}&classid=${obj.number}&xredirect=${escapetool.url($doc.getURL('edit', 'editor=object'))}")" class="xobject-action delete" title="$services.localization.render('core.editors.object.removeObject.tooltip')">$services.localization.render('core.editors.object.removeObject')</a> #if (!$hasCustomObject) <a href="$doc.getURL('edit', "editor=object&classname=${escapetool.url($class.name)}&object=${obj.number}")" class="xobject-action edit" title="$services.localization.render('core.editors.object.editSingleObject.tooltip')">$services.localization.render('core.editors.object.editSingleObject')</a> #end </h3> </div> <div id="xobject_${escapetool.xml($class.name)}_${obj.number}_content" class="xobject-content"><div> <dl> #if ($hasCustomField) #set ($properties = []) #foreach ($propName in $customField.split(',')) #set ($discard = $properties.add($class.get($propName))) #end #else #set ($properties = $class.properties) #end #foreach ($prop in $properties) <dt#if ($prop.isDisabled()) class="disabled"#end> <label for="${escapetool.xml($class.name)}_${obj.number}_${escapetool.xml($prop.name)}" >$escapetool.xml($prop.translatedPrettyName)</label> <span class="xHint">$!escapetool.xml($prop.hint)</span> </dt> <dd#if ($prop.isDisabled()) class="disabled"#end> $doc.display($prop.name, 'edit', $obj) </dd> #end </dl> #set ($deprecatedProperties = $class.getDeprecatedObjectProperties($obj)) #if ($deprecatedProperties.size() > 0) <div class="box warningmessage deprecatedProperties"> <strong>$services.localization.render('core.editors.object.removeDeprecatedProperties.info', [${escapetool.xml($class.name)}])</strong> <dl> #foreach ($prop in $deprecatedProperties) <dt class="disabled"><label>${escapetool.xml($prop.name)}:</label></dt> <dd class="disabled">${escapetool.xml($prop.value)}</dd> #end </dl> <div> <a class="syncProperties" href='$doc.getURL("objectsync", "classname=${escapetool.url($class.name)}&object=${obj.number}")' title="$services.localization.render('core.editors.object.removeDeprecatedProperties.link.tooltip')">$services.localization.render('core.editors.object.removeDeprecatedProperties.link')</a> </div> </div> #end </div></div>## xobject-content </div>## xobject #end ## #* * Determine the title field of the class, the field that should be displayed as a summary of the object. *# #macro(getTitleField $props) #set($foundStringProperty = false) #set ($foundAlternativeProperty = false) ## As a backup, use the first field of the class; will be overwritten later by better values #set ($titleField = false) #foreach ($prop in $props) ## A property containing 'title' or 'name' has precedence #if ($prop.name.toLowerCase().indexOf('title') >= 0 || $prop.name.toLowerCase().indexOf('name') >= 0) #set ($titleField = $prop.name) #break ## String properties have precedence over other types #elseif (!$foundStringProperty) #if ($prop.type == 'StringClass') #set ($titleField = $prop.name) #set ($foundStringProperty = true) #elseif (!$foundAlternativeProperty && $prop.type != 'PasswordClass') #set ($titleField = $prop.name) #set ($foundAlternativeProperty = true) #end #end #end #end ## #* * Returns the first 120 characters of the first line of the raw value of the specified object field. *# #macro (getFieldSummary $obj $fieldName $fieldSummary) #set ($summary = "$!obj.getProperty($fieldName).value") #set ($summary = $summary.trim()) #set ($multiline = $summary.contains($util.newline)) #set ($summary = $stringtool.substringBefore($summary, $util.newline)) #if ($multiline || $summary.length() > 120) #set ($summary = "${stringtool.left($summary, 120)}...") #end #set ($summary = $escapetool.xml($summary)) #set ($fieldSummary = $NULL) #setVariable("$fieldSummary" $summary) #end ## #* * Display a class *# #macro(displayClass $class) #set ($props = $class.getProperties()) #getTitleField($props) <div id="xclass_${escapetool.xml($class.name)}" class="xclass"> #if ($hasCustomObject) #set ($object = $doc.getObject($class.name, $customObject)) #if ($object) <div id="xclass_${escapetool.xml($class.name)}_title" class="xclass-title"><h2>${escapetool.xml($class.name)}</h2></div> <div id="xclass_${escapetool.xml($class.name)}_content" class="xclass-content"><div> #displayObject($object $class $props $titleField) </div></div> #else #warning($services.localization.render('core.editors.object.noObject')) #end #else #set ($objects = $doc.getObjects($class.name)) #set ($objectCount = $objects.size()) <div id="xclass_${escapetool.xml($class.name)}_title" class="xclass-title"><h2>$services.localization.render('core.editors.object.objectsForClass', [${escapetool.xml($class.name)}]) <span id="xclass_${escapetool.xml($class.name)}_xobject_nb" class="xclass_xobject_nb">($objectCount)</span></h2></div> <div id="xclass_${escapetool.xml($class.name)}_content" class="xclass-content"><div> #foreach ($object in $objects) #displayObject($object $class $props $titleField) #end #displayAddObject($class) </div></div> #end </div> #end ## ## #** * Display a control for adding an object of a given class *# #macro(displayAddObject $class) <div id="add_xobject_${escapetool.xml($class.name)}" class="add_xobject"> <div id="add_xobject_${escapetool.xml($class.name)}_title" class="add_xobject-title"> <a href="$doc.getURL('edit', "xpage=editobject&xaction=addObject&classname=$escapetool.url(${class.name})&xredirect=$escapetool.url(${doc.getURL('edit', 'editor=object')})")" class="xobject-add-control" title="$services.localization.render('core.editors.object.newObjectForClass.tooltip', ["#cleanClassname(${class.name})"])">$services.localization.render('core.editors.object.newObjectForClass', ["#cleanClassname(${class.name})"])</a> </div> </div> #end ## ## #** * Display a control for adding an object from a chosen class *# #macro(displayAddObjectChooseClass) <div id="add_xobject" class="add_xobject"> <label for="classname" class="add_xobject-title"> $services.localization.render('core.editors.object.add.label'): </label> #set ($classPickerParameters = { 'id': 'classname', 'name': 'classname', 'placeholder': $services.localization.render('core.editors.object.add.selectClass'), 'data-xwiki-selectize': { 'copyClassesToDropdown': true, 'takeInputWidth': true } }) #classPicker($classPickerParameters) <span class="buttonwrapper"> <input type="submit" name="action_objectadd" class="button xobject-add-control" value="$services.localization.render('core.editors.object.add.submit')"/> </span> </div> #end ## ## #** * Check if there are deleted properties in the classes of the existing objects. * If so, provide a control to synchronize property sets of these objects. *# #macro (checkPropertyDeprecation) #set ($allClasses = $doc.getxWikiClasses()) #set ($mustSync = false) #foreach ($class in $allClasses) #set ($objects = $doc.getObjects($class.name)) #foreach ($object in $objects) #if ($class.getDeprecatedObjectProperties($object).size() > 0) #set ($mustSync = true) #break #end #end #if ($mustSync) #break #end #end #if ($mustSync) <div class="box warningmessage deprecatedProperties"> $services.localization.render('core.editors.object.removeDeprecatedProperties.all.info') <div><a class="syncProperties syncAllProperties" href="$doc.getURL('objectsync')" title="$services.localization.render('core.editors.object.removeDeprecatedProperties.all.link.tooltip')">$services.localization.render('core.editors.object.removeDeprecatedProperties.all.link')</a></div> </div> #end #end ## checkPropertyDeprecation ## ##--------------------------------- ## Done with macro definitions, now the actual content ## ## ## Ajax object add: #if ("$!{request.xaction}" == 'addObject') ## We keep 'className' for backward compatibility and use 'classname' to be consistent with other actions. #set ($classname = ${request.classname}) #if ("$!classname" == '') #set ($classname = ${request.className}) #end #set ($class = $xwiki.getClass($classname)) #set ($props = $class.getProperties()) #if ($props.isEmpty()) $response.setStatus(404) #error($services.localization.render('core.editors.object.add.invalidClassName', [$classname])) #else #set ($isNewClass = $doc.getObjects($classname).isEmpty()) #set ($newobj = $doc.newObject($classname)) #set ($discard = $doc.save()) #if ("$!{request.xredirect}" != '') $response.sendRedirect($request.xredirect) #else ## Display #if ($isNewClass) ## Output the SkinExtension hooks to allow field displayers to pull JavaScript/CSS resources. ## The object editor will move these 'includes' (link/script tags) in the head of the HTML page. ## Note that we need to pull the JavaScript/CSS only once, for the first object of a given type. <!-- com.xpn.xwiki.plugin.skinx.LinkExtensionPlugin --> #skinExtensionHooks #displayClass($class) #else #getTitleField($props) #displayObject($newobj $class $props $titleField) #end ## is new class #end ## xredirect #end ## class exists ## ## ## ## #elseif ("$!request.xpage" == 'editobject') ## Old (pre 1.0) way of using this template $response.sendRedirect($doc.getURL('edit', 'editor=object')) #else ## Actual Object editor $xwiki.ssfx.use('js/xwiki/editors/dataeditors.css', true)## $xwiki.jsfx.use('js/xwiki/editors/dataeditors.js', true)## ## Insert JS and CSS needed for the fullscreen edit feature $xwiki.jsfx.use('uicomponents/widgets/fullScreen.js', {'forceSkinAction': true, 'language': ${xcontext.locale}})## $xwiki.ssfx.use('uicomponents/widgets/fullScreen.css', true)## ## Some parameters #set ($formname = 'update') #set ($saveaction = 'save') #set ($hasCustomClass = ("$!{request.classname.trim()}" != '')) #set ($hasCustomObject = ($hasCustomClass && ("$!{request.nb.trim()}$!{request.classid.trim()}$!{request.object.trim()}" != ''))) #set ($hasCustomField = ($hasCustomClass && ("$!{request.property.trim()}" != ''))) #if ($hasCustomClass) #set ($classes = [$xwiki.getDocument($request.classname).getxWikiClass()]) #else #set ($classes = $doc.getxWikiClasses()) #end #if ($hasCustomClass || $hasCustomObject || $hasCustomField) #set ($fullEditorURL = "$doc.getURL('edit', 'editor=object')") <div class="more-actions"> <a href='$fullEditorURL' class='edit-all' title="$services.localization.render('core.editors.object.editAllObjects')">$services.localization.render('core.editors.object.editAllObjects')</a> </div> #end #set ($redirect = $xwiki.relativeRequestURL) <form id="update" method="post" action="$doc.getURL("save")" class="withLock xform"> <div id="xwikieditcontent" class="clear"> #checkPropertyDeprecation() #set ($q = 'editor=object') #if ($hasCustomClass) #set ($customClass = "${request.classname}") #set ($q = "${q}&classname=$!{escapetool.url(${customClass})}") #if ($hasCustomObject) #set ($customObject = "${request.object}") #if ($customObject == '') #set ($customObject = "${request.classid}") #if ($customObject == '') #set ($customObject = "${request.nb}") #end #end #set ($customObject = $mathtool.toInteger($customObject)) #set ($q = "${q}&object=${customObject}") #end #if ($hasCustomField) #set ($customField = "$request.property") #set ($q = "${q}&property=$!{escapetool.url(${customField})}") #end #end <div class="hidden"> ## CSRF prevention <input type="hidden" name="form_token" value="$!{services.csrf.getToken()}" /> <input type="hidden" name="xcontinue" value="$doc.getURL($xcontext.action, $q)"/> ## This input is used by the full screen widget: it stores the selector of the maximized element, so that the full screen can be restored when coming back from other views. <input type="hidden" name="x-maximized" value="$!{escapetool.xml($request.get('x-maximized'))}" /> ## A submit button that captures "enter" on the form, placed before the "objectadd" submit button, ## to prevent from accidentally adding objects when pressing enter. #editActionButton('preview', 'preview') </div> <div id="xwikiobjects"> #if (!$hasCustomClass) #displayAddObjectChooseClass() #end #foreach ($class in $classes) #displayClass($class) #end </div>## xwikiobjects </div>## xwikieditcontent <div class="bottombuttons sticky-buttons">#template("editactions.vm")</div> </form> #end ## request.xaction