Changes for page Main
Last modified by Administrator on 2023/03/27 10:53
From version
3.1


edited by Administrator
on 2020/01/07 18:45
on 2020/01/07 18:45
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-appwithinminutes-ui/11.10.2]
To version
2.1


edited by Administrator
on 2019/11/04 23:53
on 2019/11/04 23:53
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-appwithinminutes-ui/10.11.9]
Summary
Details
- Page properties
-
- Title
-
... ... @@ -1,1 +1,1 @@ 1 -#if "$!appTitle" !='')$appTitle#else$doc.pageReference.name#end1 +#if(!$doc.name.endsWith('Sheet'))$services.localization.render('appWithinMinutes.classEditor.title', [$stringtool.removeEnd($doc.title, 'Class').trim()])#{else}$doc.name#end - Syntax
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki 2. 11 +XWiki 2.0 - Content
-
... ... @@ -1,5 +3,3 @@ 1 -{{include reference="AppWithinMinutes.VelocityMacros" /}} 2 - 3 3 {{groovy}} 4 4 import com.xpn.xwiki.XWikiContext; 5 5 import com.xpn.xwiki.api.Context; ... ... @@ -54,100 +54,99 @@ 54 54 #** 55 55 * Displays the field palette. 56 56 *# 57 -#macro (displayFieldPalette) 58 - <div id="palette"> 59 - <p><strong>$services.localization.render('platform.appwithinminutes.classEditorPaletteTitle')</strong></p> 60 - <p class="xHint">$services.localization.render('platform.appwithinminutes.classEditorPaletteHint')</p> 55 +#macro(displayFieldPalette) 56 + (% id="palette" %) 57 + ((( 58 + **$services.localization.render('platform.appwithinminutes.classEditorPaletteTitle')** 59 + 60 + (% class="xHint" %) 61 + $services.localization.render('platform.appwithinminutes.classEditorPaletteHint') 62 + 61 61 ## List all form field types, grouped by category. 62 - #set ($formFieldDocs = []) 63 - #set ($formFieldClassName = 'AppWithinMinutes.FormFieldClass') 64 - #set ($categoryListStatement = 'from doc.object(AppWithinMinutes.FormFieldCategoryClass) as category order by category.priority') 65 - <ul> 66 - #foreach ($category in $services.query.xwql($categoryListStatement).execute()) 67 - #set ($categoryDoc = $xwiki.getDocument($category)) 68 - <li> 69 - <div class="category">$categoryDoc.plainTitle</div> 70 - #set ($formFieldsForCategoryStatement = "from doc.object($formFieldClassName) as field where field.category = :category order by field.priority") 71 - #set ($formFieldsForCategoryQuery = $services.query.xwql($formFieldsForCategoryStatement).bindValue('category', $category)) 72 - <ul> 73 - #foreach ($formField in $formFieldsForCategoryQuery.execute()) 74 - #set ($formFieldDoc = $xwiki.getDocument($formField)) 75 - #set ($discard = $formFieldDocs.add($formFieldDoc)) 76 - #set ($formFieldIcon = $formFieldDoc.getObject($formFieldClassName).getProperty('icon').value) 77 - #set ($formFieldIconRendered = $services.icon.renderHTML($formFieldIcon)) 64 + #set($formFieldDocs = []) 65 + #set($formFieldClassName = 'AppWithinMinutes.FormFieldClass') 66 + #set($categoryListStatement = 'from doc.object(AppWithinMinutes.FormFieldCategoryClass) as category order by category.priority') 67 + #foreach($category in $services.query.xwql($categoryListStatement).execute()) 68 + #set($categoryDoc = $xwiki.getDocument($category)) 69 + * (% class="category" %)$categoryDoc.plainTitle 70 + #set($formFieldsForCategoryStatement = "from doc.object($formFieldClassName) as field where field.category = :category order by field.priority") 71 + #set($formFieldsForCategoryQuery = $services.query.xwql($formFieldsForCategoryStatement).bindValue('category', $category)) 72 + #foreach($formField in $formFieldsForCategoryQuery.execute()) 73 + #set($formFieldDoc = $xwiki.getDocument($formField)) 74 + #set($discard = $formFieldDocs.add($formFieldDoc)) 75 + #set($formFieldIcon = $formFieldDoc.getObject($formFieldClassName).getProperty('icon').value) 76 + #set($formFieldIconRendered = $services.icon.renderHTML($formFieldIcon)) 78 78 #if ("$!formFieldIconRendered" == "") 79 - #if 80 - #set 78 + #if($formFieldIcon.contains('/')) 79 + #set($formFieldIconURL = $xwiki.getSkinFile($formFieldIcon)) 81 81 #else 82 - #set 81 + #set($formFieldIconURL = $formFieldDoc.getAttachmentURL($formFieldIcon)) 83 83 #end 84 - #set 83 + #set($formFieldIconRendered = "<img src='$formFieldIconURL' alt='$escapetool.xml($formFieldDoc.plainTitle)' class='icon' />") 85 85 #end 86 - <li class="field"> 87 - $formFieldIconRendered 88 - $escapetool.xml($formFieldDoc.plainTitle) 89 - ## FIXME: We should use the 'get' action instead to prevent the stats module from recording this AJAX request. 90 - ## The 'edit' action is a temporary solution until the sheet module is modified to allow a sheet to be enforced through 91 - ## the query string even if it doesn't match the action (e.g. the 'get' action). 92 - ## The sheet parameter is required when editing a new class because the request will be made to a document that doesn't exist. 93 - ## FIXME2: In the future don't force the text editor type and instead use the default editor. This means 94 - ## that if the WYSIWYG editor is used, we'll need to convert the HTML into the target syntax so that the 95 - ## Template in #updateAndSaveTemplate is saved with target syntax and not HTML. 96 - ## See https://jira.xwiki.org/browse/XWIKI-13789 97 - #set ($fieldURL = $doc.getURL('edit', $escapetool.url({ 98 - 'xpage': 'plain', 99 - 'sheet': 'AppWithinMinutes.ClassEditSheet', 100 - 'field': $formFieldDoc.fullName, 101 - 'xeditmode': 'text' 102 - }))) 103 - <input type="hidden" value="$fieldURL" class="data"/> 104 - </li> 85 + ** (% class="field" %){{html}} 86 + $formFieldIconRendered 87 + $escapetool.xml($formFieldDoc.plainTitle) 88 + ## FIXME: We should use the 'get' action instead to prevent the stats module from recording this AJAX request. 89 + ## The 'edit' action is a temporary solution until the sheet module is modified to allow a sheet to be enforced through 90 + ## the query string even if it doesn't match the action (e.g. the 'get' action). 91 + ## The sheet parameter is required when editing a new class because the request will be made to a document that doesn't exist. 92 + ## FIXME2: In the future don't force the text editor type and instead use the default editor. This means 93 + ## that if the WYSIWYG editor is used, we'll need to convert the HTML into the target syntax so that the 94 + ## Template in #updateAndSaveTemplate is saved with target syntax and not HTML. 95 + ## See https://jira.xwiki.org/browse/XWIKI-13789 96 + <input type="hidden" value="$doc.getURL('edit', "xpage=plain&sheet=AppWithinMinutes.ClassEditSheet&field=$escapetool.url($formFieldDoc.fullName)&xeditmode=text")" class="data"/> 97 + {{/html}} 105 105 #end 106 - </ul> 107 - </li> 108 108 #end 109 - </ul> 110 - </div> 100 + ))) 111 111 #end 112 112 113 113 #** 114 114 * Displays the field canvas. 115 115 *# 116 -#macro 117 - #set 118 - #foreach 106 +#macro(displayFieldCanvas) 107 + #set($propertyType2FormField = {}) 108 + #foreach($formFieldDoc in $formFieldDocs) 119 119 ## Use the type of the field template. 120 - #set 121 - #set 110 + #set($type = $formFieldDoc.getxWikiClass().properties.get(0).classType) 111 + #set($discard = $propertyType2FormField.put($type, $formFieldDoc)) 122 122 #end 123 - <div id="canvas"> 124 - <p class="hint"> 125 - $services.localization.render('platform.appwithinminutes.classEditorCanvasHint') 126 - </p> 127 - <ul> 128 - #set ($unknownFields = []) 129 - #foreach ($field in $doc.getxWikiClass().properties) 130 - #set ($formFieldDoc = $propertyType2FormField.get($field.classType)) 131 - #if ($formFieldDoc) 132 - <li>#displayField($field $formFieldDoc)</li> 133 - #else 134 - #set($discard = $unknownFields.add($field)) 135 - #end 113 + (% id="canvas" %) 114 + ((( 115 + (% class="hint" %) 116 + $services.localization.render('platform.appwithinminutes.classEditorCanvasHint') 117 + 118 + #set($unknownFields = []) 119 + #set($empty = true) 120 + #foreach ($field in $doc.getxWikiClass().properties) 121 + #set($formFieldDoc = $propertyType2FormField.get($field.classType)) 122 + #if($formFieldDoc) 123 + #set($empty = false) 124 + * (((#displayField($field $formFieldDoc)))) 125 + #else 126 + #set($discard = $unknownFields.add($field)) 136 136 #end 137 - </ul> 138 - <div class="hidden"> 128 + #end 129 + #if(!$empty) 130 + ## Leave an empty line to separate the blocks. 131 + 132 + #end 133 + ## 134 + (% class="hidden" %) 135 + {{html}} 139 139 ## Output the field meta data even if the field is not supported to preserve it when the class is saved. 140 - #foreach 137 + #foreach($field in $unknownFields) 141 141 #displayFieldMetaData($field) 142 142 #end 143 - </div>144 - </div>140 + {{/html}} 141 + ))) 145 145 #end 146 146 147 147 #** 148 148 * Display the options to create/update the class template, the class sheet and the class translation bundle. 149 149 *# 150 -#macro 147 +#macro(displayClassOptions) 151 151 #set ($className = $stringtool.removeEnd($doc.fullName, 'Class')) 152 152 #set ($templateReference = $services.model.resolveDocument("${className}Template")) 153 153 #set ($translationsReference = $services.model.resolveDocument("${className}Translations")) ... ... @@ -158,6 +158,7 @@ 158 158 #elseif ($classSheets.size() == 1) 159 159 #set ($sheetReference = $classSheets.get(0)) 160 160 #end 158 + {{html}} 161 161 ## Hide the options if neither the sheet nor the template nor the translation bundle exists. They don't have to be 162 162 ## updated, they have to be created. 163 163 <dl id="options" #if (!$xwiki.exists($sheetReference) && !$xwiki.exists($templateReference) ... ... @@ -206,6 +206,7 @@ 206 206 </span> 207 207 </dd> 208 208 </dl> 207 + {{/html}} 209 209 #end 210 210 211 211 #macro (pageLink $reference) ... ... @@ -217,21 +217,25 @@ 217 217 #set ($action = 'create') 218 218 #set ($discard = $params.put('parent', $doc.fullName)) 219 219 #end 220 - <span class="$class"><a href="$escapetool.xml($xwiki.getURL($reference, $action, $escapetool.url($params)))" 221 - >$escapetool.xml($reference.name)</a></span>## 219 + <span class="$class">## 220 + <a href="$escapetool.xml($xwiki.getURL($reference, $action, $escapetool.url($params)))">## 221 + $escapetool.xml($reference.name)## 222 + </a>## 223 + </span>## 222 222 #end 223 223 224 224 #** 225 225 * Display a form field. 226 226 *# 227 -#macro 228 - #if 229 - #set 229 +#macro(displayField $field $formFieldDoc) 230 + #if($formFieldDoc.getObject('XWiki.StyleSheetExtension')) 231 + #set($discard = $xwiki.ssx.use($formFieldDoc.fullName)) 230 230 #end 231 - #if 232 - #set 233 + #if($formFieldDoc.getObject('XWiki.JavaScriptExtension')) 234 + #set($discard = $xwiki.jsx.use($formFieldDoc.fullName)) 233 233 #end 234 - <div class="hidden"> 236 + (% class="hidden" %) 237 + {{html}} 235 235 #displayFieldMetaData($field) 236 236 ## We need this information to avoid querying and loading all FormField documents twice. 237 237 ## NOTE: We use a different ID format to avoid collisions with the field meta properties. ... ... @@ -238,35 +238,35 @@ 238 238 <input type="hidden" id="template-$field.name" name="template-$field.name" 239 239 value="$escapetool.xml($formFieldDoc.fullName)" 240 240 data-propertyName="$escapetool.xml($formFieldDoc.getxWikiClass().propertyNames[0])" /> 241 - </div> 242 - #set ($className = $stringtool.removeEnd($doc.fullName, 'Class')) 243 - #set ($templateRef = $services.model.resolveDocument("${className}Template")) 244 - #set ($templateDoc = $xwiki.getDocument($templateRef)) 244 + {{/html}} 245 + 246 + #set($className = $stringtool.removeEnd($doc.fullName, 'Class')) 247 + #set($templateRef = $services.model.resolveDocument("${className}Template")) 248 + #set($templateDoc = $xwiki.getDocument($templateRef)) 245 245 ## Simulate the editing of the class instance from the template document. 246 246 ## Note that we can't simply call display on the template document because $field could be a new field that hasn't 247 247 ## been added to the class yet (so the object from the template doesn't have this field yet). 248 - <dl class="field-viewer"> 249 - #displayFieldProperty($field "${doc.fullName}_0_" $templateDoc.getObject($doc.fullName, true)) 250 - </dl> 251 - #set ($propertyNames = ['name', 'prettyName', 'number', 'required', 'hint']) 252 - #set ($formFieldObj = $formFieldDoc.getObject('AppWithinMinutes.FormFieldClass')) 253 - #set ($customPropertyNames = $formFieldObj.getProperty('properties').value.split('\s+')) 254 - #set ($discard = $customPropertyNames.removeAll($propertyNames)) 255 - #set ($discard = $propertyNames.addAll($customPropertyNames.subList(0, $customPropertyNames.size()))) 256 - <dl class="field-config"> 257 - #foreach ($propertyName in $propertyNames) 258 - #set ($propertyDefinition = $field.xWikiClass.get($propertyName)) 259 - #if ($propertyDefinition) 260 - #displayFieldProperty($propertyDefinition "field-${field.name}_" $field) 261 - #end 252 + (% class="field-viewer" %) 253 + #displayFieldProperty($field "${doc.fullName}_0_" $templateDoc.getObject($doc.fullName, true)) 254 + 255 + #set($propertyNames = ['name', 'prettyName', 'number', 'required', 'hint']) 256 + #set($formFieldObj = $formFieldDoc.getObject('AppWithinMinutes.FormFieldClass')) 257 + #set($customPropertyNames = $formFieldObj.getProperty('properties').value.split('\s+')) 258 + #set($discard = $customPropertyNames.removeAll($propertyNames)) 259 + #set($discard = $propertyNames.addAll($customPropertyNames.subList(0, $customPropertyNames.size()))) 260 + (% class="field-config" %) 261 + #foreach($propertyName in $propertyNames) 262 + #set($propertyDefinition = $field.xWikiClass.get($propertyName)) 263 + #if($propertyDefinition) 264 + #displayFieldProperty($propertyDefinition "field-${field.name}_" $field) 262 262 #end 263 - </dl>266 + #end 264 264 #end 265 265 266 266 #** 267 267 * Display the field meta data. This is needed to preserve the field when its type is not supported by the editor. 268 268 *# 269 -#macro 272 +#macro(displayFieldMetaData $field) 270 270 <input type="hidden" id="type-$field.name" name="type-$field.name" value="$field.classType" /> 271 271 #end 272 272 ... ... @@ -273,18 +273,13 @@ 273 273 #** 274 274 * Displays a configuration property of a class field. This macro can also be used to display a property of an object. 275 275 *# 276 -#macro (displayFieldProperty $property $prefix $field) 277 - #set ($displayFormType = $property.getProperty('displayFormType')) 278 - #if ($property.classType == 'Boolean' && (!$displayFormType || $displayFormType.value == 'checkbox')) 279 - <dt> 280 - <label for="$!{prefix}$property.name"> 281 - #displayPropertyEditInput($property, $prefix, $field)$escapetool.xml($property.prettyName) 282 - </label> 283 - </dt> 284 - <dd></dd> 279 +#macro(displayFieldProperty $property $prefix $field) 280 + #set($displayFormType = $property.getProperty('displayFormType')) 281 + #if($property.classType == 'Boolean' && (!$displayFormType || $displayFormType.value == 'checkbox')) 282 + ; {{html clean="false"}}<label for="$!{prefix}$property.name">#displayPropertyEditInput($property, $prefix, $field)$escapetool.xml($property.prettyName)</label>{{/html}} 285 285 #else 286 - <dt><label for="${prefix}$property.name">$escapetool.xml($property.prettyName)</label></dt>287 - <dd>#displayPropertyEditInput($property, $prefix, $field)</dd>284 + ; {{html}}<label for="${prefix}$property.name">$escapetool.xml($property.prettyName)</label>{{/html}} 285 + : {{html clean="false"}}#displayPropertyEditInput($property, $prefix, $field){{/html}} 288 288 #end 289 289 #end 290 290 ... ... @@ -291,18 +291,12 @@ 291 291 #** 292 292 * Displays the input used to edit the specified property of the given object. The given object can be either an 293 293 * instance of an XWiki class or a class field. In the first case the property represents an object field and in the 294 - * second case the property represents a field meta property. We currently don't use custom display for metaproperty, 295 - * so in that case we fallback on displayEdit. 292 + * second case the property represents a field meta property. 296 296 *# 297 -#macro (displayPropertyEditInput $property $prefix $object) 298 - #set ($wrappedProperty = $property.propertyClass) 299 - #if ($wrappedProperty.isCustomDisplayed($xcontext.context)) 300 - #set ($customDisplayer = $!xcontext.get('propertyCustomDisplayer').display($property, $prefix, $object)) 301 - #if ((! $customDisplayer) && ("$!customDisplayer" == "")) 302 - $doc.displayEdit($property, $prefix, $object) 303 - #else 304 - $customDisplayer 305 - #end 294 +#macro(displayPropertyEditInput $property $prefix $object) 295 + #set($wrappedProperty = $property.propertyClass) 296 + #if($wrappedProperty.isCustomDisplayed($xcontext.context)) 297 + $xcontext.get('propertyCustomDisplayer').display($property, $prefix, $object) 306 306 #else 307 307 $doc.displayEdit($property, $prefix, $object) 308 308 #end ... ... @@ -311,23 +311,26 @@ 311 311 #** 312 312 * Called when a new form field is added via AJAX. 313 313 *# 314 -#macro 306 +#macro(displayNewField) 315 315 ## Output the SkinExtension hooks to allow field displayers to pull JavaScript/CSS resources. 316 316 ## Output also the LinkExtension hook because $xwiki.linkx.use() is used to load CSS files from WebJars. 317 317 ## The class editor moves this resource includes in the HTML page head. 310 + {{html}} 318 318 <!-- com.xpn.xwiki.plugin.skinx.LinkExtensionPlugin --> 319 319 #skinExtensionHooks 320 - #set ($formFieldDoc = $xwiki.getDocument($request.field)) 321 - #set ($formFieldDocClassFields = $formFieldDoc.getxWikiClass().getXWikiClass().properties) 322 - #if ($formFieldDocClassFields.size() > 0) 313 + {{/html}} 314 + 315 + #set($formFieldDoc = $xwiki.getDocument($request.field)) 316 + #set($formFieldDocClassFields = $formFieldDoc.getxWikiClass().getXWikiClass().properties) 317 + #if($formFieldDocClassFields.size() > 0) 323 323 ## Clone the field template. 324 - #set 325 - #if 326 - #set 319 + #set($field = $formFieldDocClassFields.get(0).clone()) 320 + #if("$!field.prettyName" == '') 321 + #set($discard = $field.setPrettyName($formFieldDoc.title)) 327 327 #end 328 - #set 329 - #set 330 - #set 323 + #set($xclass = $doc.getxWikiClass().getXWikiClass()) 324 + #set($discard = $xclass.addField($field.name, $field)) 325 + #set($discard = $field.setObject($xclass)) 331 331 #displayField($doc.getxWikiClass().get($field.name) $formFieldDoc) 332 332 #else 333 333 Unsupported form field. ... ... @@ -337,91 +337,87 @@ 337 337 #** 338 338 * Preview a class field (requires Programming Right). 339 339 *# 340 -#macro 335 +#macro(previewField) 341 341 ## Find the request parameter that specifies the field template. 342 - #foreach 343 - #if 344 - #set 345 - #set 337 + #foreach($paramName in $request.getParameterMap().keySet()) 338 + #if($paramName.startsWith('template-')) 339 + #set($fieldName = $paramName.substring(9)) 340 + #set($fieldTemplateDoc = $xwiki.getDocument($request.getParameter($paramName))) 346 346 #break 347 347 #end 348 348 #end 349 349 ## 350 350 ## Clone the field template. 351 - #set 346 + #set($field = $fieldTemplateDoc.getxWikiClass().getXWikiClass().properties.get(0).clone()) 352 352 ## 353 353 ## Update the field meta properties based on the submitted data. 354 - #set 355 - #set 349 + #set($valuesFromRequest = $xcontext.context.getForm().getObject("field-$fieldName")) 350 + #set($discard = $field.getxWikiClass().fromMap($valuesFromRequest, $field)) 356 356 ## 357 357 ## Don't rename the field (ignore the submitted name). 358 - #set 353 + #set($discard = $field.setName($fieldName)) 359 359 ## 360 360 ## We have to add the field to the class before setting its value. 361 361 ## (otherwise the field value from the request is ignored). 362 - #set 363 - #set 364 - #set 357 + #set($xclass = $doc.getxWikiClass().getXWikiClass()) 358 + #set($discard = $xclass.addField($fieldName, $field)) 359 + #set($discard = $field.setObject($xclass)) 365 365 ## 366 366 ## Create an object that has this field and set its value from request. 367 - #set 362 + #set($object = $fieldTemplateDoc.getObject($doc.fullName, true)) 368 368 ## 369 369 ## Filter empty values from the request, otherwise the update method could try to select an invalid value. 370 - #set 371 - #foreach 372 - #if 373 - #set 365 + #set($values = []) 366 + #foreach($value in $request.getParameterValues("${doc.fullName}_0_$fieldName")) 367 + #if($value != '') 368 + #set($discard = $values.add($value)) 374 374 #end 375 375 #end 376 - #if 377 - #set 378 - #set 371 + #if($values.size() > 0) 372 + #set($stringArray = $request.getParameterValues("template-$fieldName")) 373 + #set($discard = $xclass.fromMap({$fieldName: $values.toArray($stringArray)}, $object.getXWikiObject())) 379 379 #end 380 380 ## 381 381 ## Display the field. 382 - #set 383 - #displayPropertyEditInput($field, "${doc.fullName}_0_", $object) 377 + #set($field = $doc.getxWikiClass().get($fieldName)) 378 + {{html clean="false"}}#displayPropertyEditInput($field, "${doc.fullName}_0_", $object){{/html}} 384 384 #end 385 385 386 386 #** 387 387 * Display the edit class form. 388 388 *# 389 -#macro 390 - #set ($discard = $xwiki.jsfx.use('js/scriptaculous/dragdrop.js'))391 - #set ($discard = $xwiki.jsx.use('AppWithinMinutes.ClassEditSheet'))392 - #set ($discard = $xwiki.ssx.use('AppWithinMinutes.ClassEditSheet'))393 - #set ($discard = $xwiki.ssx.use('AppWithinMinutes.ClassSheetGenerator'))394 - #if 384 +#macro(displayEditForm) 385 + $xwiki.jsfx.use('js/scriptaculous/dragdrop.js')## 386 + $xwiki.jsx.use('AppWithinMinutes.ClassEditSheet')## 387 + $xwiki.ssx.use('AppWithinMinutes.ClassEditSheet')## 388 + $xwiki.ssx.use('AppWithinMinutes.ClassSheetGenerator')## 389 + #if("$!request.wizard" == 'true') 395 395 #appWizardHeader('structure') 391 + 396 396 #end 397 397 #displayFieldPalette() 398 398 #displayFieldCanvas() 399 399 #displayClassOptions() 400 400 #if("$!request.wizard" == 'true') 397 + 401 401 #appWizardFooter('structure') 402 402 #end 403 - <divclass="clearfloats"></div>400 + (% class="clearfloats" %)((())) 404 404 #end 405 405 406 406 #** 407 407 * Displays either the edit class form or a new form field. The later is used when adding a new form field via AJAX. 408 408 *# 409 -#macro 410 - #if 406 +#macro(doEdit) 407 + #if("$!request.field" != '') 411 411 #displayNewField() 412 - #elseif 409 + #elseif("$!request.preview" == 'true') 413 413 #previewField() 414 414 #else 415 415 ## Make sure that only the sheet content is rendered when the class is saved using AJAX. 416 - <div class="hidden"> 417 - <input type="hidden" name="xpage" value="plain" /> 418 - #if ($request.wizard == 'true') 419 - ## Preserve the wizard mode. 420 - <input type="hidden" name="wizard" value="true" /> 421 - #end 422 - ## Compute the application title to be used as the wizard step title. 423 - #getAppTitle 424 - </div> 413 + (% class="hidden" %) 414 + {{html}}<input type="hidden" name="xpage" value="plain" />{{/html}} 415 + 425 425 #displayEditForm() 426 426 #end 427 427 #end ... ... @@ -437,7 +437,10 @@ 437 437 #try() 438 438 #set ($discard = $copyAsJob.join()) 439 439 #set ($copyAsJobStatus = $services.job.getJobStatus($copyAsJob.request.id)) 440 - #set ($errorMessage = $copyAsJobStatus.logTail.getFirstLogEvents('ERROR').toString()) 431 + #set ($errorLogs = $copyAsJobStatus.log.getLogs('ERROR')) 432 + #if ($errorLogs.size() > 0) 433 + #set ($errorMessage = $errorLogs.get(0).toString()) 434 + #end 441 441 #end 442 442 #end 443 443 #end ... ... @@ -576,7 +576,7 @@ 576 576 #set($className = $stringtool.removeEnd($doc.fullName, 'Class')) 577 577 #set($templateRef = $services.model.resolveDocument("${className}Template")) 578 578 #set($templateDoc = $xwiki.getDocument($templateRef)) 579 - #set($discard = $templateDoc.setParent($doc. documentReference.name))573 + #set($discard = $templateDoc.setParent($doc.name)) 580 580 #if ($request.templateTitle) 581 581 #set($discard = $templateDoc.setTitle($request.templateTitle)) 582 582 #end ... ... @@ -614,7 +614,7 @@ 614 614 #if($sheetReference) 615 615 #set($sheetDoc = $xwiki.getDocument($sheetReference)) 616 616 #set($sheetGeneratorDoc = $xwiki.getDocument('AppWithinMinutes.ClassSheetGenerator')) 617 - #set($discard = $sheetDoc.setParent($doc. documentReference.name))611 + #set($discard = $sheetDoc.setParent($doc.name)) 618 618 #set($discard = $sheetDoc.setContent($doc.getRenderedContent($sheetGeneratorDoc.content, 619 619 $sheetGeneratorDoc.syntax.toIdString(), 'plain/1.0'))) 620 620 #set($discard = $sheetDoc.setHidden(true)) ... ... @@ -638,7 +638,7 @@ 638 638 #set ($scope = 'WIKI') 639 639 #end 640 640 #set($discard = $translationsObj.set('scope', $scope)) 641 - #set($discard = $translationsDoc.setParent($doc. documentReference.name))635 + #set($discard = $translationsDoc.setParent($doc.name)) 642 642 #set($translationsGeneratorDoc = $xwiki.getDocument('AppWithinMinutes.ClassTranslationsGenerator')) 643 643 #set($discard = $translationsDoc.setContent($doc.getRenderedContent($translationsGeneratorDoc.content, 644 644 $translationsGeneratorDoc.syntax.toIdString(), 'plain/1.0'))) ... ... @@ -652,17 +652,17 @@ 652 652 #** 653 653 * Updates and saves the class definition, the class sheet and the class template. 654 654 *# 655 -#macro 656 - #set 649 +#macro(doSave) 650 + #set($minorEdit = "$!request.minorEdit" != '') 657 657 #maybeCreateCodeSpace 658 658 #updateAndSaveClass 659 659 #updateAndSaveTemplate 660 660 #updateAndSaveSheet 661 661 #updateAndSaveTranslations 662 - #if 663 - #if 664 - <div class="boxerrormessage">$errorMessage</div>665 - #elseif 656 + #if($action == 'save') 657 + #if($errorMessage) 658 + {{error}}{{html}}$errorMessage{{/html}}{{/error}} 659 + #elseif("$!request.wizard" == 'true') 666 666 ## Redirect to next wizard step. 667 667 #set ($className = $stringtool.removeEnd($doc.fullName, 'Class')) 668 668 #set ($templateProviderReference = $services.model.resolveDocument("${className}TemplateProvider")) ... ... @@ -682,7 +682,7 @@ 682 682 $response.sendRedirect($doc.getURL()) 683 683 #end 684 684 #else 685 - #if 679 + #if($errorMessage) 686 686 $response.sendError(400, $errorMessage) 687 687 #else 688 688 $response.setStatus(204) ... ... @@ -698,23 +698,21 @@ 698 698 {{/velocity}} 699 699 700 700 {{velocity}} 701 -{{html clean="false"}} 702 702 ## Determine the action button that triggered the request 703 -#set 704 -#foreach 705 - #if 706 - #set 696 +#set($action = 'edit') 697 +#foreach($paramName in $request.getParameterMap().keySet()) 698 + #if($paramName.startsWith('xaction_')) 699 + #set($action = $paramName.substring(8)) 707 707 #break 708 708 #end 709 709 #end 710 -#if 703 +#if($action == 'edit') 711 711 #doEdit() 712 -#elseif 713 - #if 705 +#elseif($action == 'save' || $action == 'saveandcontinue') 706 + #if($services.csrf.isTokenValid($request.form_token)) 714 714 #doSave() 715 715 #else 716 - $response.sendRedirect($services.csrf.getResubmissionURL()) 709 + $response.sendRedirect($services.csrf.getResubmissionURL()); 717 717 #end 718 718 #end 719 -{{/html}} 720 720 {{/velocity}}
- XWiki.JavaScriptExtension[2]
-
- Code
-
... ... @@ -520,10 +520,10 @@ 520 520 if (!form) { 521 521 return false; 522 522 } 523 - // Let the sheet handle the form submit. The form is submitted by default to the preview action which dispatches the524 - // requestto thesave actionifthe savebuttonisdetectedonthe requestparameters.Bysubmittingtothedit525 - // action the edit sheetsevaluatedandthusitcanhandlethesavebyitself.526 - form.action = XWiki.currentDocument.getURL('edit');523 + // Let the sheet handle the form submit. 524 + // NOTE: The code that handles Save&Continue uses this URL to make the AJAX request and Firefox 3.6 doesn't resolve 525 + // the empty string to the current page URL so we have to explicitly specify it. 526 + form.action = window.location.href; 527 527 528 528 // Apply the vertical form layout standard. 529 529 form.addClassName('xform');