Changes for page Main

Last modified by Administrator on 2023/03/27 10:53

From version 8.1
edited by Administrator
on 2023/03/27 10:53
Change comment: Install extension [org.xwiki.platform:xwiki-platform-appwithinminutes-ui/14.10.7]
To version 2.1
edited by Administrator
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#end
1 +#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.1
1 +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,102 +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">$escapetool.xml($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 ($formFieldIcon.contains('/'))
80 - #set ($formFieldIconURL = $xwiki.getSkinFile($formFieldIcon))
78 + #if($formFieldIcon.contains('/'))
79 + #set($formFieldIconURL = $xwiki.getSkinFile($formFieldIcon))
81 81   #else
82 - #set ($formFieldIconURL = $formFieldDoc.getAttachmentURL($formFieldIcon))
81 + #set($formFieldIconURL = $formFieldDoc.getAttachmentURL($formFieldIcon))
83 83   #end
84 - #set ($formFieldIconRendered = "<img src='$escapetool.xml($formFieldIconURL)' alt='$escapetool.xml($formFieldDoc.plainTitle)' class='icon' />")
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 - 'form_token': $services.csrf.getToken(),
101 - 'template': 'AppWithinMinutes.ClassTemplate',
102 - 'field': $formFieldDoc.fullName,
103 - 'xeditmode': 'text'
104 - })))
105 - <input type="hidden" value="$escapetool.xml($fieldURL)" class="data"/>
106 - </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}}
107 107   #end
108 - </ul>
109 - </li>
110 110   #end
111 - </ul>
112 - </div>
100 + )))
113 113  #end
114 114  
115 115  #**
116 116   * Displays the field canvas.
117 117   *#
118 -#macro (displayFieldCanvas)
119 - #set ($propertyType2FormField = {})
120 - #foreach ($formFieldDoc in $formFieldDocs)
106 +#macro(displayFieldCanvas)
107 + #set($propertyType2FormField = {})
108 + #foreach($formFieldDoc in $formFieldDocs)
121 121   ## Use the type of the field template.
122 - #set ($type = $formFieldDoc.getxWikiClass().properties.get(0).classType)
123 - #set ($discard = $propertyType2FormField.put($type, $formFieldDoc))
110 + #set($type = $formFieldDoc.getxWikiClass().properties.get(0).classType)
111 + #set($discard = $propertyType2FormField.put($type, $formFieldDoc))
124 124   #end
125 - <div id="canvas">
126 - <p class="hint">
127 - $services.localization.render('platform.appwithinminutes.classEditorCanvasHint')
128 - </p>
129 - <ul>
130 - #set ($unknownFields = [])
131 - #foreach ($field in $doc.getxWikiClass().properties)
132 - #set ($formFieldDoc = $propertyType2FormField.get($field.classType))
133 - #if ($formFieldDoc)
134 - <li>#displayField($field $formFieldDoc)</li>
135 - #else
136 - #set($discard = $unknownFields.add($field))
137 - #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))
138 138   #end
139 - </ul>
140 - <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}}
141 141   ## Output the field meta data even if the field is not supported to preserve it when the class is saved.
142 - #foreach ($field in $unknownFields)
137 + #foreach($field in $unknownFields)
143 143   #displayFieldMetaData($field)
144 144   #end
145 - </div>
146 - </div>
140 + {{/html}}
141 + )))
147 147  #end
148 148  
149 149  #**
150 150   * Display the options to create/update the class template, the class sheet and the class translation bundle.
151 151   *#
152 -#macro (displayClassOptions)
147 +#macro(displayClassOptions)
153 153   #set ($className = $stringtool.removeEnd($doc.fullName, 'Class'))
154 154   #set ($templateReference = $services.model.resolveDocument("${className}Template"))
155 155   #set ($translationsReference = $services.model.resolveDocument("${className}Translations"))
... ... @@ -160,6 +160,7 @@
160 160   #elseif ($classSheets.size() == 1)
161 161   #set ($sheetReference = $classSheets.get(0))
162 162   #end
158 + {{html}}
163 163   ## Hide the options if neither the sheet nor the template nor the translation bundle exists. They don't have to be
164 164   ## updated, they have to be created.
165 165   <dl id="options" #if (!$xwiki.exists($sheetReference) && !$xwiki.exists($templateReference)
... ... @@ -208,6 +208,7 @@
208 208   </span>
209 209   </dd>
210 210   </dl>
207 + {{/html}}
211 211  #end
212 212  
213 213  #macro (pageLink $reference)
... ... @@ -219,21 +219,25 @@
219 219   #set ($action = 'create')
220 220   #set ($discard = $params.put('parent', $doc.fullName))
221 221   #end
222 - <span class="$class"><a href="$escapetool.xml($xwiki.getURL($reference, $action, $escapetool.url($params)))"
223 - >$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>##
224 224  #end
225 225  
226 226  #**
227 227   * Display a form field.
228 228   *#
229 -#macro (displayField $field $formFieldDoc)
230 - #if ($formFieldDoc.getObject('XWiki.StyleSheetExtension'))
231 - #set ($discard = $xwiki.ssx.use($formFieldDoc.fullName))
229 +#macro(displayField $field $formFieldDoc)
230 + #if($formFieldDoc.getObject('XWiki.StyleSheetExtension'))
231 + #set($discard = $xwiki.ssx.use($formFieldDoc.fullName))
232 232   #end
233 - #if ($formFieldDoc.getObject('XWiki.JavaScriptExtension'))
234 - #set ($discard = $xwiki.jsx.use($formFieldDoc.fullName))
233 + #if($formFieldDoc.getObject('XWiki.JavaScriptExtension'))
234 + #set($discard = $xwiki.jsx.use($formFieldDoc.fullName))
235 235   #end
236 - <div class="hidden">
236 + (% class="hidden" %)
237 + {{html}}
237 237   #displayFieldMetaData($field)
238 238   ## We need this information to avoid querying and loading all FormField documents twice.
239 239   ## NOTE: We use a different ID format to avoid collisions with the field meta properties.
... ... @@ -240,35 +240,35 @@
240 240   <input type="hidden" id="template-$field.name" name="template-$field.name"
241 241   value="$escapetool.xml($formFieldDoc.fullName)"
242 242   data-propertyName="$escapetool.xml($formFieldDoc.getxWikiClass().propertyNames[0])" />
243 - </div>
244 - #set ($className = $stringtool.removeEnd($doc.fullName, 'Class'))
245 - #set ($templateRef = $services.model.resolveDocument("${className}Template"))
246 - #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))
247 247   ## Simulate the editing of the class instance from the template document.
248 248   ## Note that we can't simply call display on the template document because $field could be a new field that hasn't
249 249   ## been added to the class yet (so the object from the template doesn't have this field yet).
250 - <dl class="field-viewer">
251 - #displayFieldProperty($field "${doc.fullName}_0_" $templateDoc.getObject($doc.fullName, true))
252 - </dl>
253 - #set ($propertyNames = ['name', 'prettyName', 'number', 'required', 'hint'])
254 - #set ($formFieldObj = $formFieldDoc.getObject('AppWithinMinutes.FormFieldClass'))
255 - #set ($customPropertyNames = $formFieldObj.getProperty('properties').value.split('\s+'))
256 - #set ($discard = $customPropertyNames.removeAll($propertyNames))
257 - #set ($discard = $propertyNames.addAll($customPropertyNames.subList(0, $customPropertyNames.size())))
258 - <dl class="field-config">
259 - #foreach ($propertyName in $propertyNames)
260 - #set ($propertyDefinition = $field.xWikiClass.get($propertyName))
261 - #if ($propertyDefinition)
262 - #displayFieldProperty($propertyDefinition "field-${field.name}_" $field)
263 - #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)
264 264   #end
265 - </dl>
266 + #end
266 266  #end
267 267  
268 268  #**
269 269   * Display the field meta data. This is needed to preserve the field when its type is not supported by the editor.
270 270   *#
271 -#macro (displayFieldMetaData $field)
272 +#macro(displayFieldMetaData $field)
272 272   <input type="hidden" id="type-$field.name" name="type-$field.name" value="$field.classType" />
273 273  #end
274 274  
... ... @@ -275,18 +275,13 @@
275 275  #**
276 276   * Displays a configuration property of a class field. This macro can also be used to display a property of an object.
277 277   *#
278 -#macro (displayFieldProperty $property $prefix $field)
279 - #set ($displayFormType = $property.getProperty('displayFormType'))
280 - #if ($property.classType == 'Boolean' && (!$displayFormType || $displayFormType.value == 'checkbox'))
281 - <dt>
282 - <label for="$!{prefix}$property.name">
283 - #displayPropertyEditInput($property, $prefix, $field)$escapetool.xml($property.prettyName)
284 - </label>
285 - </dt>
286 - <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}}
287 287   #else
288 - <dt><label for="${prefix}$property.name">$escapetool.xml($property.prettyName)</label></dt>
289 - <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}}
290 290   #end
291 291  #end
292 292  
... ... @@ -293,18 +293,12 @@
293 293  #**
294 294   * Displays the input used to edit the specified property of the given object. The given object can be either an
295 295   * instance of an XWiki class or a class field. In the first case the property represents an object field and in the
296 - * second case the property represents a field meta property. We currently don't use custom display for metaproperty,
297 - * so in that case we fallback on displayEdit.
292 + * second case the property represents a field meta property.
298 298   *#
299 -#macro (displayPropertyEditInput $property $prefix $object)
300 - #set ($wrappedProperty = $property.propertyClass)
301 - #if ($wrappedProperty.isCustomDisplayed($xcontext.context))
302 - #set ($customDisplayer = $!xcontext.get('propertyCustomDisplayer').display($property, $prefix, $object))
303 - #if ((! $customDisplayer) && ("$!customDisplayer" == ""))
304 - $doc.displayEdit($property, $prefix, $object)
305 - #else
306 - $customDisplayer
307 - #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)
308 308   #else
309 309   $doc.displayEdit($property, $prefix, $object)
310 310   #end
... ... @@ -313,23 +313,26 @@
313 313  #**
314 314   * Called when a new form field is added via AJAX.
315 315   *#
316 -#macro (displayNewField)
306 +#macro(displayNewField)
317 317   ## Output the SkinExtension hooks to allow field displayers to pull JavaScript/CSS resources.
318 318   ## Output also the LinkExtension hook because $xwiki.linkx.use() is used to load CSS files from WebJars.
319 319   ## The class editor moves this resource includes in the HTML page head.
310 + {{html}}
320 320   <!-- com.xpn.xwiki.plugin.skinx.LinkExtensionPlugin -->
321 321   #skinExtensionHooks
322 - #set ($formFieldDoc = $xwiki.getDocument($request.field))
323 - #set ($formFieldDocClassFields = $formFieldDoc.getxWikiClass().getXWikiClass().properties)
324 - #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)
325 325   ## Clone the field template.
326 - #set ($field = $formFieldDocClassFields.get(0).clone())
327 - #if ("$!field.prettyName" == '')
328 - #set ($discard = $field.setPrettyName($formFieldDoc.title))
319 + #set($field = $formFieldDocClassFields.get(0).clone())
320 + #if("$!field.prettyName" == '')
321 + #set($discard = $field.setPrettyName($formFieldDoc.title))
329 329   #end
330 - #set ($xclass = $doc.getxWikiClass().getXWikiClass())
331 - #set ($discard = $xclass.addField($field.name, $field))
332 - #set ($discard = $field.setObject($xclass))
323 + #set($xclass = $doc.getxWikiClass().getXWikiClass())
324 + #set($discard = $xclass.addField($field.name, $field))
325 + #set($discard = $field.setObject($xclass))
333 333   #displayField($doc.getxWikiClass().get($field.name) $formFieldDoc)
334 334   #else
335 335   Unsupported form field.
... ... @@ -339,90 +339,87 @@
339 339  #**
340 340   * Preview a class field (requires Programming Right).
341 341   *#
342 -#macro (previewField)
335 +#macro(previewField)
343 343   ## Find the request parameter that specifies the field template.
344 - #foreach ($paramName in $request.getParameterMap().keySet())
345 - #if ($paramName.startsWith('template-'))
346 - #set ($fieldName = $paramName.substring(9))
347 - #set ($fieldTemplateDoc = $xwiki.getDocument($request.getParameter($paramName)))
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)))
348 348   #break
349 349   #end
350 350   #end
351 351   ##
352 352   ## Clone the field template.
353 - #set ($field = $fieldTemplateDoc.getxWikiClass().getXWikiClass().properties.get(0).clone())
346 + #set($field = $fieldTemplateDoc.getxWikiClass().getXWikiClass().properties.get(0).clone())
354 354   ##
355 355   ## Update the field meta properties based on the submitted data.
356 - #set ($valuesFromRequest = $xcontext.context.getForm().getObject("field-$fieldName"))
357 - #set ($discard = $field.getxWikiClass().fromMap($valuesFromRequest, $field))
349 + #set($valuesFromRequest = $xcontext.context.getForm().getObject("field-$fieldName"))
350 + #set($discard = $field.getxWikiClass().fromMap($valuesFromRequest, $field))
358 358   ##
359 359   ## Don't rename the field (ignore the submitted name).
360 - #set ($discard = $field.setName($fieldName))
353 + #set($discard = $field.setName($fieldName))
361 361   ##
362 362   ## We have to add the field to the class before setting its value.
363 363   ## (otherwise the field value from the request is ignored).
364 - #set ($xclass = $doc.getxWikiClass().getXWikiClass())
365 - #set ($discard = $xclass.addField($fieldName, $field))
366 - #set ($discard = $field.setObject($xclass))
357 + #set($xclass = $doc.getxWikiClass().getXWikiClass())
358 + #set($discard = $xclass.addField($fieldName, $field))
359 + #set($discard = $field.setObject($xclass))
367 367   ##
368 368   ## Create an object that has this field and set its value from request.
369 - #set ($object = $fieldTemplateDoc.getObject($doc.fullName, true))
362 + #set($object = $fieldTemplateDoc.getObject($doc.fullName, true))
370 370   ##
371 371   ## Filter empty values from the request, otherwise the update method could try to select an invalid value.
372 - #set ($values = [])
373 - #foreach ($value in $request.getParameterValues("${doc.fullName}_0_$fieldName"))
374 - #if ($value != '')
375 - #set ($discard = $values.add($value))
365 + #set($values = [])
366 + #foreach($value in $request.getParameterValues("${doc.fullName}_0_$fieldName"))
367 + #if($value != '')
368 + #set($discard = $values.add($value))
376 376   #end
377 377   #end
378 - #if ($values.size() > 0)
379 - #set ($stringArray = $request.getParameterValues("template-$fieldName"))
380 - #set ($discard = $xclass.fromMap({$fieldName: $values.toArray($stringArray)}, $object.getXWikiObject()))
371 + #if($values.size() > 0)
372 + #set($stringArray = $request.getParameterValues("template-$fieldName"))
373 + #set($discard = $xclass.fromMap({$fieldName: $values.toArray($stringArray)}, $object.getXWikiObject()))
381 381   #end
382 382   ##
383 383   ## Display the field.
384 - #set ($field = $doc.getxWikiClass().get($fieldName))
385 - #displayPropertyEditInput($field, "${doc.fullName}_0_", $object)
377 + #set($field = $doc.getxWikiClass().get($fieldName))
378 + {{html clean="false"}}#displayPropertyEditInput($field, "${doc.fullName}_0_", $object){{/html}}
386 386  #end
387 387  
388 388  #**
389 389   * Display the edit class form.
390 390   *#
391 -#macro (displayEditForm)
392 - #set ($discard = $xwiki.jsx.use('AppWithinMinutes.ClassEditSheet'))
393 - #set ($discard = $xwiki.ssx.use('AppWithinMinutes.ClassEditSheet'))
394 - #set ($discard = $xwiki.ssx.use('AppWithinMinutes.ClassSheetGenerator'))
395 - #if ("$!request.wizard" == 'true')
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')
396 396   #appWizardHeader('structure')
391 +
397 397   #end
398 398   #displayFieldPalette()
399 399   #displayFieldCanvas()
400 400   #displayClassOptions()
401 401   #if("$!request.wizard" == 'true')
397 +
402 402   #appWizardFooter('structure')
403 403   #end
404 - <div class="clearfloats"></div>
400 + (% class="clearfloats" %)((()))
405 405  #end
406 406  
407 407  #**
408 408   * Displays either the edit class form or a new form field. The later is used when adding a new form field via AJAX.
409 409   *#
410 -#macro (doEdit)
411 - #if ("$!request.field" != '')
406 +#macro(doEdit)
407 + #if("$!request.field" != '')
412 412   #displayNewField()
413 - #elseif ("$!request.preview" == 'true')
409 + #elseif("$!request.preview" == 'true')
414 414   #previewField()
415 415   #else
416 416   ## Make sure that only the sheet content is rendered when the class is saved using AJAX.
417 - <div class="hidden">
418 - <input type="hidden" name="xpage" value="plain" />
419 - #if ($request.wizard == 'true')
420 - ## Preserve the wizard mode.
421 - <input type="hidden" name="wizard" value="true" />
422 - #end
423 - ## Compute the application title to be used as the wizard step title.
424 - #getAppTitle
425 - </div>
413 + (% class="hidden" %)
414 + {{html}}<input type="hidden" name="xpage" value="plain" />{{/html}}
415 +
426 426   #displayEditForm()
427 427   #end
428 428  #end
... ... @@ -438,7 +438,10 @@
438 438   #try()
439 439   #set ($discard = $copyAsJob.join())
440 440   #set ($copyAsJobStatus = $services.job.getJobStatus($copyAsJob.request.id))
441 - #set ($errorMessage = $copyAsJobStatus.logTail.getFirstLogEvent('ERROR').toString())
431 + #set ($errorLogs = $copyAsJobStatus.log.getLogs('ERROR'))
432 + #if ($errorLogs.size() > 0)
433 + #set ($errorMessage = $errorLogs.get(0).toString())
434 + #end
442 442   #end
443 443   #end
444 444  #end
... ... @@ -577,7 +577,7 @@
577 577   #set($className = $stringtool.removeEnd($doc.fullName, 'Class'))
578 578   #set($templateRef = $services.model.resolveDocument("${className}Template"))
579 579   #set($templateDoc = $xwiki.getDocument($templateRef))
580 - #set($discard = $templateDoc.setParent($doc.documentReference.name))
573 + #set($discard = $templateDoc.setParent($doc.name))
581 581   #if ($request.templateTitle)
582 582   #set($discard = $templateDoc.setTitle($request.templateTitle))
583 583   #end
... ... @@ -615,13 +615,9 @@
615 615   #if($sheetReference)
616 616   #set($sheetDoc = $xwiki.getDocument($sheetReference))
617 617   #set($sheetGeneratorDoc = $xwiki.getDocument('AppWithinMinutes.ClassSheetGenerator'))
618 - #set($discard = $sheetDoc.setParent($doc.documentReference.name))
611 + #set($discard = $sheetDoc.setParent($doc.name))
619 619   #set($discard = $sheetDoc.setContent($doc.getRenderedContent($sheetGeneratorDoc.content,
620 620   $sheetGeneratorDoc.syntax.toIdString(), 'plain/1.0')))
621 - ## We assume for now that the output produced by the sheet generator uses the same syntax as the code of the sheet
622 - ## generator. We have to set the syntax because the default wiki syntax (used when creating new wiki pages) could
623 - ## be different than the one used by the sheet generator.
624 - #set($discard = $sheetDoc.setSyntax($sheetGeneratorDoc.syntax))
625 625   #set($discard = $sheetDoc.setHidden(true))
626 626   #set($discard = $sheetDoc.save($services.localization.render('platform.appwithinminutes.classEditorSheetSaveComment'),
627 627   $minorEdit))
... ... @@ -643,11 +643,10 @@
643 643   #set ($scope = 'WIKI')
644 644   #end
645 645   #set($discard = $translationsObj.set('scope', $scope))
646 - #set($discard = $translationsDoc.setParent($doc.documentReference.name))
635 + #set($discard = $translationsDoc.setParent($doc.name))
647 647   #set($translationsGeneratorDoc = $xwiki.getDocument('AppWithinMinutes.ClassTranslationsGenerator'))
648 648   #set($discard = $translationsDoc.setContent($doc.getRenderedContent($translationsGeneratorDoc.content,
649 649   $translationsGeneratorDoc.syntax.toIdString(), 'plain/1.0')))
650 - #set($discard = $translationsDoc.setSyntaxId('plain/1.0'))
651 651   #set($discard = $translationsDoc.setHidden(true))
652 652   #set($discard = $translationsDoc.save(
653 653   $services.localization.render('platform.appwithinminutes.classEditorTranslationsSaveComment'),
... ... @@ -658,17 +658,17 @@
658 658  #**
659 659   * Updates and saves the class definition, the class sheet and the class template.
660 660   *#
661 -#macro (doSave)
662 - #set ($minorEdit = "$!request.minorEdit" != '')
649 +#macro(doSave)
650 + #set($minorEdit = "$!request.minorEdit" != '')
663 663   #maybeCreateCodeSpace
664 664   #updateAndSaveClass
665 665   #updateAndSaveTemplate
666 666   #updateAndSaveSheet
667 667   #updateAndSaveTranslations
668 - #if ($action == 'save')
669 - #if ($errorMessage)
670 - <div class="box errormessage">$errorMessage</div>
671 - #elseif ("$!request.wizard" == 'true')
656 + #if($action == 'save')
657 + #if($errorMessage)
658 + {{error}}{{html}}$errorMessage{{/html}}{{/error}}
659 + #elseif("$!request.wizard" == 'true')
672 672   ## Redirect to next wizard step.
673 673   #set ($className = $stringtool.removeEnd($doc.fullName, 'Class'))
674 674   #set ($templateProviderReference = $services.model.resolveDocument("${className}TemplateProvider"))
... ... @@ -678,7 +678,6 @@
678 678   })
679 679   #if (!$xwiki.exists($templateProviderReference))
680 680   #set ($discard = $queryString.putAll({
681 - 'form_token': $services.csrf.getToken(),
682 682   'template': 'XWiki.TemplateProviderTemplate',
683 683   'parent': $doc.fullName
684 684   }))
... ... @@ -689,7 +689,7 @@
689 689   $response.sendRedirect($doc.getURL())
690 690   #end
691 691   #else
692 - #if ($errorMessage)
679 + #if($errorMessage)
693 693   $response.sendError(400, $errorMessage)
694 694   #else
695 695   $response.setStatus(204)
... ... @@ -705,23 +705,21 @@
705 705  {{/velocity}}
706 706  
707 707  {{velocity}}
708 -{{html clean="false"}}
709 709  ## Determine the action button that triggered the request
710 -#set ($action = 'edit')
711 -#foreach ($paramName in $request.getParameterMap().keySet())
712 - #if ($paramName.startsWith('xaction_'))
713 - #set ($action = $paramName.substring(8))
696 +#set($action = 'edit')
697 +#foreach($paramName in $request.getParameterMap().keySet())
698 + #if($paramName.startsWith('xaction_'))
699 + #set($action = $paramName.substring(8))
714 714   #break
715 715   #end
716 716  #end
717 -#if ($action == 'edit')
703 +#if($action == 'edit')
718 718   #doEdit()
719 -#elseif ($action == 'save' || $action == 'saveandcontinue')
720 - #if ($services.csrf.isTokenValid($request.form_token))
705 +#elseif($action == 'save' || $action == 'saveandcontinue')
706 + #if($services.csrf.isTokenValid($request.form_token))
721 721   #doSave()
722 722   #else
723 - $response.sendRedirect($services.csrf.getResubmissionURL())
709 + $response.sendRedirect($services.csrf.getResubmissionURL());
724 724   #end
725 725  #end
726 -{{/html}}
727 727  {{/velocity}}
XWiki.JavaScriptExtension[2]
Code
... ... @@ -515,11 +515,15 @@
515 515  }(XWiki || {}));
516 516  
517 517  (function() {
518 - function initForm(form) {
519 - // Let the sheet handle the form submit. The form is submitted by default to the preview action which dispatches the
520 - // request to the save action if the save button is detected on the request parameters. By submitting to the edit
521 - // action the edit sheet is evaluated and thus it can handle the save by itself.
522 - form.action = XWiki.currentDocument.getURL('edit');
518 + function init() {
519 + var form = $('inline');
520 + if (!form) {
521 + return false;
522 + }
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;
523 523  
524 524   // Apply the vertical form layout standard.
525 525   form.addClassName('xform');
... ... @@ -553,18 +553,9 @@
553 553   // Make the palette and the canvas live.
554 554   new XWiki.FormFieldPalette('palette');
555 555   new XWiki.FormCanvas('canvas');
556 - }
557 557  
558 - function init() {
559 - var form = $('inline');
560 - if (form) {
561 - require(['scriptaculous/dragdrop'], function() {
562 - initForm(form);
563 - });
564 - }
565 - return form;
561 + return true;
566 566   }
567 -
568 568   (XWiki.domIsLoaded && init()) || document.observe('xwiki:dom:loaded', init);
569 569  }).call();
570 570