Cambios para el documento ClassEditSheet
Última modificación por Administrator el 2024/06/06 11:40
Desde la versión 3.1
editado por Administrator
el 2024/06/06 11:40
el 2024/06/06 11:40
Cambiar el comentario:
Install extension [org.xwiki.platform:xwiki-platform-appwithinminutes-ui/15.10.10]
Hasta la versión 2.1
editado por Administrator
el 2024/06/05 19:09
el 2024/06/05 19:09
Cambiar el comentario:
Migrated property [contentType] from class [XWiki.StyleSheetExtension]
Resumen
-
Propiedades de página (3 modificado, 0 añadido, 0 eliminado)
-
Objetos (2 modificado, 0 añadido, 0 eliminado)
Detalles
- Propiedades de página
-
- Título
-
... ... @@ -1,1 +1,1 @@ 1 -#if "$!appTitle" !='')$appTitle#else$doc.pageReference.name#end1 +#if(!$doc.name.endsWith('Sheet'))Class: $stringtool.removeEnd($doc.title, 'Class')#{else}$doc.name#end - Syntax
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki 2. 11 +XWiki 2.0 - Contenido
-
... ... @@ -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; ... ... @@ -48,227 +48,167 @@ 48 48 #** 49 49 * Constants 50 50 *# 51 -## Magic date used to mark in AWM that the date field is not set for the current entry. See http s://jira.xwiki.org/browse/XWIKI-1029649 +## Magic date used to mark in AWM that the date field is not set for the current entry. See http://jira.xwiki.org/browse/XWIKI-10296 52 52 #set($MAGIC_DATE = $datetool.toDate('yyyy-MM-dd', '9999-12-31')) 53 53 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)) 78 - #if ("$!formFieldIconRendered" == "") 79 - #if ($formFieldIcon.contains('/')) 80 - #set ($formFieldIconURL = $xwiki.getSkinFile($formFieldIcon)) 81 - #else 82 - #set ($formFieldIconURL = $formFieldDoc.getAttachmentURL($formFieldIcon)) 83 - #end 84 - #set ($formFieldIconRendered = "<img src='$escapetool.xml($formFieldIconURL)' alt='$escapetool.xml($formFieldDoc.plainTitle)' class='icon' />") 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 + #if($formFieldIcon.contains('/')) 77 + #set($formFieldIconURL = $xwiki.getSkinFile($formFieldIcon)) 78 + #else 79 + #set($formFieldIconURL = $formFieldDoc.getAttachmentURL($formFieldIcon)) 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> 81 + ** (% class="field" %){{html}} 82 + <img src="$formFieldIconURL" alt="$escapetool.xml($formFieldDoc.plainTitle)" class="icon" /> 83 + $escapetool.xml($formFieldDoc.plainTitle) 84 + ## FIXME: We should use the 'get' action instead to prevent the stats module from recording this AJAX request. 85 + ## The 'edit' action is a temporary solution until the sheet module is modified to allow a sheet to be enforced through 86 + ## the query string even if it doesn't match the action (e.g. the 'get' action). 87 + ## The sheet parameter is required when editing a new class because the request will be made to a document that doesn't exist. 88 + <input type="hidden" value="$doc.getURL('edit', "xpage=plain&sheet=AppWithinMinutes.ClassEditSheet&field=$escapetool.url($formFieldDoc.fullName)")" class="data"/> 89 + {{/html}} 107 107 #end 108 - </ul> 109 - </li> 110 110 #end 111 - </ul> 112 - </div> 92 + ))) 113 113 #end 114 114 115 115 #** 116 116 * Displays the field canvas. 117 117 *# 118 -#macro 119 - #set 120 - #foreach 98 +#macro(displayFieldCanvas) 99 + #set($propertyType2FormField = {}) 100 + #foreach($formFieldDoc in $formFieldDocs) 121 121 ## Use the type of the field template. 122 - #set 123 - #set 102 + #set($type = $formFieldDoc.getxWikiClass().properties.get(0).classType) 103 + #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 105 + (% id="canvas" %) 106 + ((( 107 + (% class="hint" %) 108 + $services.localization.render('platform.appwithinminutes.classEditorCanvasHint') 109 + 110 + #set($unknownFields = []) 111 + #set($empty = true) 112 + #foreach ($field in $doc.getxWikiClass().properties) 113 + #set($formFieldDoc = $propertyType2FormField.get($field.classType)) 114 + #if($formFieldDoc) 115 + #set($empty = false) 116 + * (((#displayField($field $formFieldDoc)))) 117 + #else 118 + #set($discard = $unknownFields.add($field)) 138 138 #end 139 - </ul> 140 - <div class="hidden"> 120 + #end 121 + #if(!$empty) 122 + ## Leave an empty line to separate the blocks. 123 + 124 + #end 125 + ## 126 + (% class="hidden" %) 127 + {{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 129 + #foreach($field in $unknownFields) 143 143 #displayFieldMetaData($field) 144 144 #end 145 - </div>146 - </div>132 + {{/html}} 133 + ))) 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) 153 - #set ($className = $stringtool.removeEnd($doc.fullName, 'Class')) 154 - #set ($templateReference = $services.model.resolveDocument("${className}Template")) 155 - #set ($translationsReference = $services.model.resolveDocument("${className}Translations")) 156 - #set ($classSheets = $services.sheet.getClassSheets($doc)) 157 - #set ($sheetReference = $null) 158 - #if ($classSheets.isEmpty()) 159 - #set ($sheetReference = $services.model.resolveDocument("${className}Sheet")) 160 - #elseif ($classSheets.size() == 1) 161 - #set ($sheetReference = $classSheets.get(0)) 139 +#macro(displayClassOptions) 140 + #set($className = $stringtool.removeEnd($doc.name, 'Class')) 141 + #set($templateName = "${className}Template") 142 + #set($translationsName = "${className}Translations") 143 + #set($classSheets = $services.sheet.getClassSheets($doc)) 144 + #if($classSheets.isEmpty()) 145 + #set($sheetName = "${className}Sheet") 146 + #elseif($classSheets.size() == 1) 147 + #set($sheetName = $services.model.serialize($classSheets.get(0))) 162 162 #end 163 - ## Hide the options if neither the sheet nor the template nor the translation bundle exists. They don't have to be 164 - ## updated, they have to be created. 165 - <dl id="options" #if (!$xwiki.exists($sheetReference) && !$xwiki.exists($templateReference) 166 - && !$xwiki.exists($translationsReference))class="hidden"#end> 167 - <dt> 168 - <label for="updateClassTemplate"> 169 - <input type="checkbox" id="updateClassTemplate" name="updateClassTemplate" checked="checked" /> 170 - $services.localization.render('platform.appwithinminutes.classEditorUpdateTemplateLabel') 171 - </label> 172 - </dt> 173 - <dd> 174 - <span class="xHint"> 175 - $services.localization.render('platform.appwithinminutes.classEditorUpdateTemplateHint', 176 - ["#pageLink($templateReference)"]) 177 - </span> 178 - </dd> 179 - <dt> 180 - <label for="updateClassSheet"> 181 - <input type="checkbox" id="updateClassSheet" name="updateClassSheet" 182 - #if ($sheetReference)checked="checked" #{else}disabled="disabled" #end/> 183 - $services.localization.render('platform.appwithinminutes.classEditorUpdateSheetLabel') 184 - </label> 185 - </dt> 186 - <dd> 187 - #if ($sheetReference) 188 - <span class="xHint"> 189 - $services.localization.render('platform.appwithinminutes.classEditorUpdateSheetHint', 190 - ["#pageLink($sheetReference)"]) 191 - </span> 149 + {{html wiki="true"}} 150 + ## Hide the options if neither the sheet nor the template nor the translation bundle exists. They don't have to be updated, they have to be created. 151 + (% id="options" #if(!$xwiki.exists($sheetName) && !$xwiki.exists($templateName) && !$xwiki.exists($translationsName))class="hidden" #end%) 152 + ; <label for="updateClassTemplate"><input type="checkbox" id="updateClassTemplate" name="updateClassTemplate" checked="checked" />$services.localization.render('platform.appwithinminutes.classEditorUpdateTemplateLabel')</label> 153 + : (% class="xHint" %)$services.localization.render('platform.appwithinminutes.classEditorUpdateTemplateHint', "[[$templateName]]") 154 + ; <label for="updateClassSheet"><input type="checkbox" id="updateClassSheet" name="updateClassSheet" #if($sheetName)checked="checked" #{else}disabled="disabled" #end/>$services.localization.render('platform.appwithinminutes.classEditorUpdateSheetLabel')</label> 155 + : #if($sheetName) 156 + (% class="xHint" %)$services.localization.render('platform.appwithinminutes.classEditorUpdateSheetHint', "[[$sheetName]]") 192 192 #else 193 - <span class="warningmessage"> 194 - $services.localization.render('platform.appwithinminutes.classEditorMultipleSheetsWarning') 195 - </span> 158 + (% class="warningmessage" %)$services.localization.render('platform.appwithinminutes.classEditorMultipleSheetsWarning') 196 196 #end 197 - </dd> 198 - <dt> 199 - <label for="updateClassTranslations"> 200 - <input type="checkbox" id="updateClassTranslations" name="updateClassTranslations" checked="checked" /> 201 - $services.localization.render('platform.appwithinminutes.classEditorUpdateTranslationsLabel') 202 - </label> 203 - </dt> 204 - <dd> 205 - <span class="xHint"> 206 - $services.localization.render('platform.appwithinminutes.classEditorUpdateTranslationsHint', 207 - ["#pageLink($translationsReference)"]) 208 - </span> 209 - </dd> 210 - </dl> 160 + ; <label for="updateClassTranslations"><input type="checkbox" id="updateClassTranslations" name="updateClassTranslations" checked="checked" />$services.localization.render('platform.appwithinminutes.classEditorUpdateTranslationsLabel')</label> 161 + : (% class="xHint" %)$services.localization.render('platform.appwithinminutes.classEditorUpdateTranslationsHint', "[[$translationsName]]") 162 + {{/html}} 211 211 #end 212 212 213 -#macro (pageLink $reference) 214 - #set ($class = 'wikilink') 215 - #set ($action = 'view') 216 - #set ($params = {}) 217 - #if (!$xwiki.exists($reference)) 218 - #set ($class = 'wikicreatelink') 219 - #set ($action = 'create') 220 - #set ($discard = $params.put('parent', $doc.fullName)) 221 - #end 222 - <span class="$class"><a href="$escapetool.xml($xwiki.getURL($reference, $action, $escapetool.url($params)))" 223 - >$escapetool.xml($reference.name)</a></span>## 224 -#end 225 - 226 226 #** 227 227 * Display a form field. 228 228 *# 229 -#macro 230 - #if 231 - #set 168 +#macro(displayField $field $formFieldDoc) 169 + #if($formFieldDoc.getObject('XWiki.StyleSheetExtension')) 170 + #set($discard = $xwiki.ssx.use($formFieldDoc.fullName)) 232 232 #end 233 - #if 234 - #set 172 + #if($formFieldDoc.getObject('XWiki.JavaScriptExtension')) 173 + #set($discard = $xwiki.jsx.use($formFieldDoc.fullName)) 235 235 #end 236 - <div class="hidden"> 175 + (% class="hidden" %) 176 + {{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 - <input type="hidden" id="template-$field.name" name="template-$field.name" 241 - value="$escapetool.xml($formFieldDoc.fullName)" 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)) 180 + <input type="hidden" id="template-$field.name" name="template-$field.name" value="$escapetool.xml($formFieldDoc.fullName)" /> 181 + {{/html}} 182 + 183 + #set($className = $stringtool.removeEnd($doc.name, 'Class')) 184 + #set($templateRef = $services.model.createDocumentReference($doc.wiki, $doc.space, "${className}Template")) 185 + #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 189 + (% class="field-viewer" %) 190 + #displayFieldProperty($field "${doc.fullName}_0_" $templateDoc.getObject($doc.fullName, true)) 191 + 192 + #set($propertyNames = ['name', 'prettyName', 'number', 'required', 'hint']) 193 + #set($formFieldObj = $formFieldDoc.getObject('AppWithinMinutes.FormFieldClass')) 194 + #set($customPropertyNames = $formFieldObj.getProperty('properties').value.split('\s+')) 195 + #set($discard = $customPropertyNames.removeAll($propertyNames)) 196 + #set($discard = $propertyNames.addAll($customPropertyNames.subList(0, $customPropertyNames.size()))) 197 + (% class="field-config" %) 198 + #foreach($propertyName in $propertyNames) 199 + #set($propertyDefinition = $field.xWikiClass.get($propertyName)) 200 + #if($propertyDefinition) 201 + #displayFieldProperty($propertyDefinition "field-${field.name}_" $field) 264 264 #end 265 - </dl>203 + #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 209 +#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> 216 +#macro(displayFieldProperty $property $prefix $field) 217 + #set($displayFormType = $property.getProperty('displayFormType')) 218 + #if($property.classType == 'Boolean' && (!$displayFormType || $displayFormType.value == 'checkbox')) 219 + ; {{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>221 + ; {{html}}<label for="${prefix}$property.name">$escapetool.xml($property.prettyName)</label>{{/html}} 222 + : {{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. 229 + * 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 231 +#macro(displayPropertyEditInput $property $prefix $object) 232 + #set($wrappedProperty = $property.propertyClass) 233 + #if($wrappedProperty.isCustomDisplayed($xcontext.context)) 234 + $xcontext.get('propertyCustomDisplayer').display($property, $prefix, $object) 308 308 #else 309 309 $doc.displayEdit($property, $prefix, $object) 310 310 #end ... ... @@ -313,23 +313,22 @@ 313 313 #** 314 314 * Called when a new form field is added via AJAX. 315 315 *# 316 -#macro 243 +#macro(displayNewField) 317 317 ## Output the SkinExtension hooks to allow field displayers to pull JavaScript/CSS resources. 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. 320 - <!-- com.xpn.xwiki.plugin.skinx.LinkExtensionPlugin -->246 + {{html}} 321 321 #skinExtensionHooks 322 - #set ($formFieldDoc = $xwiki.getDocument($request.field)) 323 - #set ($formFieldDocClassFields = $formFieldDoc.getxWikiClass().getXWikiClass().properties) 324 - #if ($formFieldDocClassFields.size() > 0) 248 + {{/html}} 249 + 250 + #set($formFieldDoc = $xwiki.getDocument($request.field)) 251 + #set($formFieldDocClassFields = $formFieldDoc.getxWikiClass().getXWikiClass().properties) 252 + #if($formFieldDocClassFields.size() > 0) 325 325 ## Clone the field template. 326 - #set 327 - #if 328 - #set 254 + #set($field = $formFieldDocClassFields.get(0).clone()) 255 + #if("$!field.prettyName" == '') 256 + #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)) 258 + #set($discard = $doc.getxWikiClass().getXWikiClass().addField($field.name, $field)) 333 333 #displayField($doc.getxWikiClass().get($field.name) $formFieldDoc) 334 334 #else 335 335 Unsupported form field. ... ... @@ -337,113 +337,93 @@ 337 337 #end 338 338 339 339 #** 340 - * Preview a class field (requires Programming Right).266 + * Preview a class field. 341 341 *# 342 -#macro 268 +#macro(previewField) 343 343 ## Find the request parameter that specifies the field template. 344 - #foreach 345 - #if 346 - #set 347 - #set 270 + #foreach($paramName in $request.getParameterMap().keySet()) 271 + #if($paramName.startsWith('template-')) 272 + #set($fieldName = $paramName.substring(9)) 273 + #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 279 + #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 357 - #set 282 + #set($valuesFromRequest = $xcontext.context.getForm().getObject("field-$fieldName")) 283 + #set($discard = $field.getxWikiClass().fromMap($valuesFromRequest, $field)) 358 358 ## 359 359 ## Don't rename the field (ignore the submitted name). 360 - #set 286 + #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)) 290 + #set($xclass = $doc.getxWikiClass().getXWikiClass()) 291 + #set($discard = $xclass.addField($fieldName, $field)) 367 367 ## 368 368 ## Create an object that has this field and set its value from request. 369 - #set 294 + #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 373 - #foreach 374 - #if 375 - #set 297 + #set($values = []) 298 + #foreach($value in $request.getParameterValues("${doc.fullName}_0_$fieldName")) 299 + #if($value != '') 300 + #set($discard = $values.add($value)) 376 376 #end 377 377 #end 378 - #if 379 - #set 380 - #set 303 + #if($values.size() > 0) 304 + #set($stringArray = $request.getParameterValues("template-$fieldName")) 305 + #set($discard = $xclass.fromMap({$fieldName: $values.toArray($stringArray)}, $object.getXWikiObject())) 381 381 #end 382 382 ## 383 383 ## Display the field. 384 - #set 385 - #displayPropertyEditInput($field, "${doc.fullName}_0_", $object) 309 + #set($field = $doc.getxWikiClass().get($fieldName)) 310 + {{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') 396 - #appWizardHeader('structure') 316 +#macro(displayEditForm) 317 + $xwiki.jsfx.use('js/scriptaculous/dragdrop.js')## 318 + $xwiki.jsx.use('AppWithinMinutes.ClassEditSheet')## 319 + $xwiki.ssx.use('AppWithinMinutes.ClassEditSheet')## 320 + $xwiki.ssx.use('AppWithinMinutes.ClassSheetGenerator')## 321 + #if("$!request.wizard" == 'true') 322 + #appWizardHeader(2) 323 + 397 397 #end 398 398 #displayFieldPalette() 399 399 #displayFieldCanvas() 400 400 #displayClassOptions() 401 401 #if("$!request.wizard" == 'true') 402 - #appWizardFooter('structure') 329 + 330 + #appWizardFooter(2) 403 403 #end 404 - <divclass="clearfloats"></div>332 + (% 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 411 - #if 338 +#macro(doEdit) 339 + #if("$!request.field" != '') 412 412 #displayNewField() 413 - #elseif 341 + #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> 345 + (% class="hidden" %) 346 + {{html}}<input type="hidden" name="xpage" value="plain" />{{/html}} 347 + 426 426 #displayEditForm() 427 427 #end 428 428 #end 429 429 430 430 #** 431 - * Create the home page of the application code space, if it doesn't exist already. 432 - *# 433 -#macro (maybeCreateCodeSpace) 434 - #set ($codeHomePageReference = $services.model.resolveDocument('', 'default', $doc.documentReference.parent)) 435 - #if (!$xwiki.exists($codeHomePageReference)) 436 - #set ($codeSpaceTemplate = $services.model.resolveDocument('AppWithinMinutes.CodeSpaceTemplate')) 437 - #set ($copyAsJob = $services.refactoring.copyAs($codeSpaceTemplate, $codeHomePageReference)) 438 - #try() 439 - #set ($discard = $copyAsJob.join()) 440 - #set ($copyAsJobStatus = $services.job.getJobStatus($copyAsJob.request.id)) 441 - #set ($errorMessage = $copyAsJobStatus.logTail.getFirstLogEvent('ERROR').toString()) 442 - #end 443 - #end 444 -#end 445 - 446 -#** 447 447 * Updates and saves the class definition based on the submitted data. 448 448 *# 449 449 #macro(updateAndSaveClass) ... ... @@ -500,7 +500,7 @@ 500 500 ## The field name has changed. 501 501 #if($xclass.get($field.name)) 502 502 ## There is already a field with the same name. 503 - #set($errorMessage = $services.localization.render('platform.appwithinminutes.classEditorDuplicateFieldNameError', [$field.name]))409 + #set($errorMessage = $services.localization.render('platform.appwithinminutes.classEditorDuplicateFieldNameError', $field.name)) 504 504 #break 505 505 #else 506 506 #set($discard = $xclass.removeField($fieldName)) ... ... @@ -538,12 +538,11 @@ 538 538 ## FIXME: even if it is not a good practice to have an object in the class document, it is still possible. We should handle field renames for the class document 539 539 ## as well. Note that there is a possibility that objects in the class' document are automatically updated. Needs checking. 540 540 ## 541 - ## We use HQL because XWQL doesn't allow us to escape the special characters from the class name. 542 - #set($instancesStatement = ', BaseObject as obj where doc.fullName = obj.name and obj.className = :className' 543 - + ' and doc.fullName not in (:className, :templateName)') 544 - #set($className = $stringtool.removeEnd($doc.fullName, 'Class')) 545 - #set($instancesQuery = $services.query.hql($instancesStatement).bindValue('className', $doc.fullName).bindValue( 546 - 'templateName', "${className}Template")) 447 + #set($instancesStatement = "from doc.object($doc.fullName) as obj where doc.fullName not in (:className,:templateName)") 448 + #set($className = $stringtool.removeEnd($doc.name, 'Class')) 449 + #set($templateRef = $services.model.createDocumentReference($doc.wiki, $doc.space, "${className}Template")) 450 + #set($templateFullName = $services.model.serialize($templateRef, 'local')) 451 + #set($instancesQuery = $services.query.xwql($instancesStatement).bindValue('className', $doc.fullName).bindValue('templateName', $templateFullName)) 547 547 #foreach($instanceDocName in $instancesQuery.execute()) 548 548 #set($instanceDoc = $xwiki.getDocument($instanceDocName)) 549 549 #set($discard = $instanceDoc.document.renameProperties($doc.documentReference, $fieldsToRename)) ... ... @@ -550,17 +550,21 @@ 550 550 #set($discard = $instanceDoc.save($services.localization.render('core.comment.updateClassPropertyName'), true)) 551 551 #end 552 552 #end 458 + ## 459 + ## Clear cache. 460 + ## 461 + #if(!$errorMessage) 462 + #set($discard = $xwiki.getXWiki().flushCache($xcontext.context)) 463 + #end 553 553 #end 554 554 555 555 #** 556 - * Handle Date fields that have the "Empty is today" option checked in the class edit form. 557 - * See https://jira.xwiki.org/browse/XWIKI-10296 467 + * Handle Date fields that have the "Empty is today" option checked in the class edit form. See http://jira.xwiki.org/browse/XWIKI-10296 558 558 **# 559 559 #macro(handleEmptyIsTodayDateFields $templateDoc) 560 560 #foreach($property in $doc.xWikiClass.properties) 561 - ## We check directly on the request if the user provided an empty date. We can not check from the template 562 - ## document's object that we've just parsed from the request using the updateObjectFromRequest method because it 563 - ## already applies the emtpyIsToday mechanism and that would not be good for us. 471 + ## We check directly on the request if the user provided an empty date. We can not check from the template document's object that we've just 472 + ## parsed from the request using the updateObjectFromRequest method because it already applies the emtpyIsToday mechanism and that would not be good for us. 564 564 #set($newValueRequestParameterName = "${doc.fullName}_0_${property.name}") 565 565 #set($newDateStringValue = "$!{request.getParameter($newValueRequestParameterName)}") 566 566 #if($property.classType == 'Date' && $property.getValue('emptyIsToday') == 1 && $newDateStringValue == '') ... ... @@ -574,10 +574,10 @@ 574 574 *# 575 575 #macro(updateAndSaveTemplate) 576 576 #if(!$errorMessage && $request.updateClassTemplate) 577 - #set($className = $stringtool.removeEnd($doc. fullName, 'Class'))578 - #set($templateRef = $services.model.re solveDocument("${className}Template"))486 + #set($className = $stringtool.removeEnd($doc.name, 'Class')) 487 + #set($templateRef = $services.model.createDocumentReference($doc.wiki, $doc.space, "${className}Template")) 579 579 #set($templateDoc = $xwiki.getDocument($templateRef)) 580 - #set($discard = $templateDoc.setParent($doc. documentReference.name))489 + #set($discard = $templateDoc.setParent($doc.name)) 581 581 #if ($request.templateTitle) 582 582 #set($discard = $templateDoc.setTitle($request.templateTitle)) 583 583 #end ... ... @@ -591,9 +591,7 @@ 591 591 ## 592 592 #handleEmptyIsTodayDateFields($templateDoc) 593 593 #set($discard = $templateDoc.setHidden(true)) 594 - #set($discard = $templateDoc.save( 595 - $services.localization.render('platform.appwithinminutes.classEditorTemplateSaveComment'), 596 - $minorEdit)) 503 + #set($discard = $templateDoc.save($services.localization.render('platform.appwithinminutes.classEditorTemplateSaveComment'), $minorEdit)) 597 597 #end 598 598 #end 599 599 ... ... @@ -604,11 +604,10 @@ 604 604 #if(!$errorMessage && $request.updateClassSheet) 605 605 #set($classSheets = $services.sheet.getClassSheets($doc)) 606 606 #if($classSheets.isEmpty()) 607 - #set($className = $stringtool.removeEnd($doc. fullName, 'Class'))608 - #set($sheetReference = $services.model.re solveDocument("${className}Sheet"))514 + #set($className = $stringtool.removeEnd($doc.name, 'Class')) 515 + #set($sheetReference = $services.model.createDocumentReference($doc.wiki, $doc.space, "${className}Sheet")) 609 609 #set($discard = $services.sheet.bindClassSheet($doc, $sheetReference)) 610 - #set($discard = $doc.save($services.localization.render('platform.appwithinminutes.classEditorBindSheetSaveComment'), 611 - $minorEdit)) 517 + #set($discard = $doc.save($services.localization.render('platform.appwithinminutes.classEditorBindSheetSaveComment'), $minorEdit)) 612 612 #elseif($classSheets.size() == 1) 613 613 #set($sheetReference = $classSheets.get(0)) 614 614 #end ... ... @@ -615,16 +615,10 @@ 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)) 619 - #set($discard = $sheetDoc.setContent($doc.getRenderedContent($sheetGeneratorDoc.content, 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)) 524 + #set($discard = $sheetDoc.setParent($doc.name)) 525 + #set($discard = $sheetDoc.setContent($doc.getRenderedContent($sheetGeneratorDoc.content, $sheetGeneratorDoc.syntax.toIdString(), 'plain/1.0'))) 625 625 #set($discard = $sheetDoc.setHidden(true)) 626 - #set($discard = $sheetDoc.save($services.localization.render('platform.appwithinminutes.classEditorSheetSaveComment'), 627 - $minorEdit)) 527 + #set($discard = $sheetDoc.save($services.localization.render('platform.appwithinminutes.classEditorSheetSaveComment'), $minorEdit)) 628 628 #end 629 629 #end 630 630 #end ... ... @@ -634,24 +634,19 @@ 634 634 *# 635 635 #macro(updateAndSaveTranslations) 636 636 #if(!$errorMessage && $request.updateClassTranslations) 637 - #set($className = $stringtool.removeEnd($doc. fullName, 'Class'))638 - #set($translationsRef = $services.model.re solveDocument("${className}Translations"))537 + #set($className = $stringtool.removeEnd($doc.name, 'Class')) 538 + #set($translationsRef = $services.model.createDocumentReference($doc.wiki, $doc.space, "${className}Translations")) 639 639 #set($translationsDoc = $xwiki.getDocument($translationsRef)) 640 640 #set($translationsObj = $translationsDoc.getObject('XWiki.TranslationDocumentClass', true)) 641 - #set ($scope = 'USER') 642 - #if ($services.security.authorization.hasAccess('admin', $doc.documentReference.wikiReference)) 643 - #set ($scope = 'WIKI') 644 - #end 645 - #set($discard = $translationsObj.set('scope', $scope)) 646 - #set($discard = $translationsDoc.setParent($doc.documentReference.name)) 541 + ## We use the translation bundle on demand because none of the available scopes suits our needs. Simple users can't 542 + ## register document translation bundles at WIKI level and the SPACE scope doesn't remove the need to create a 543 + ## custom live table results page in the same space as the application. 544 + #set($discard = $translationsObj.set('scope', 'ON_DEMAND')) 545 + #set($discard = $translationsDoc.setParent($doc.name)) 647 647 #set($translationsGeneratorDoc = $xwiki.getDocument('AppWithinMinutes.ClassTranslationsGenerator')) 648 - #set($discard = $translationsDoc.setContent($doc.getRenderedContent($translationsGeneratorDoc.content, 649 - $translationsGeneratorDoc.syntax.toIdString(), 'plain/1.0'))) 650 - #set($discard = $translationsDoc.setSyntaxId('plain/1.0')) 547 + #set($discard = $translationsDoc.setContent($doc.getRenderedContent($translationsGeneratorDoc.content, $translationsGeneratorDoc.syntax.toIdString(), 'plain/1.0'))) 651 651 #set($discard = $translationsDoc.setHidden(true)) 652 - #set($discard = $translationsDoc.save( 653 - $services.localization.render('platform.appwithinminutes.classEditorTranslationsSaveComment'), 654 - $minorEdit)) 549 + #set($discard = $translationsDoc.save($services.localization.render('platform.appwithinminutes.classEditorTranslationsSaveComment'), $minorEdit)) 655 655 #end 656 656 #end 657 657 ... ... @@ -658,38 +658,35 @@ 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" != '') 663 - #maybeCreateCodeSpace 664 - #updateAndSaveClass 665 - #updateAndSaveTemplate 666 - #updateAndSaveSheet 667 - #updateAndSaveTranslations 668 - #if ($action == 'save') 669 - #if ($errorMessage) 670 - <div class="box errormessage">$errorMessage</div> 671 - #elseif ("$!request.wizard" == 'true') 556 +#macro(doSave) 557 + #set($minorEdit = "$!request.minorEdit" != '') 558 + #updateAndSaveClass() 559 + #updateAndSaveTemplate() 560 + #updateAndSaveSheet() 561 + #updateAndSaveTranslations() 562 + #if($action == 'save') 563 + #if($errorMessage) 564 + {{error}}{{html}}$errorMessage{{/html}}{{/error}} 565 + #elseif("$!request.wizard" == 'true') 672 672 ## Redirect to next wizard step. 673 - #set ($className = $stringtool.removeEnd($doc.fullName, 'Class')) 674 - #set ($templateProviderReference = $services.model.resolveDocument("${className}TemplateProvider")) 675 - #set ($queryString = { 676 - 'wizard': true, 677 - 'sheet': 'AppWithinMinutes.TemplateProviderEditSheet' 678 - }) 679 - #if (!$xwiki.exists($templateProviderReference)) 680 - #set ($discard = $queryString.putAll({ 681 - 'form_token': $services.csrf.getToken(), 682 - 'template': 'XWiki.TemplateProviderTemplate', 683 - 'parent': $doc.fullName 684 - })) 567 + #set($appName = $doc.getValue('dataSpaceName')) 568 + #if("$!appName" == '') 569 + ## Backwards compatibility for apps created before 6.3M2 when the code space was not properly cleaned and the data space name was restricted as a consequence. 570 + #set($appName = $stringtool.removeEnd($doc.title, ' Class')) 685 685 #end 686 - $response.sendRedirect($xwiki.getURL($templateProviderReference, 'edit', $escapetool.url($queryString))) 572 + #set($homePageRef = $services.model.createDocumentReference($doc.wiki, $appName, 'WebHome')) 573 + #set($queryString = 'wizard=true') 574 + #if(!$xwiki.exists($homePageRef)) 575 + #set($homePageTitle = '$services.localization.render(''platform.appwithinminutes.appHomePageTitle'', [$doc.space])') 576 + #set($queryString = "$queryString&editor=inline&template=AppWithinMinutes.LiveTableTemplate&AppWithinMinutes.LiveTableClass_0_class=$escapetool.url($doc.fullName)&title=$escapetool.url($homePageTitle)&parent=AppWithinMinutes.WebHome") 577 + #end 578 + $response.sendRedirect($xwiki.getURL($homePageRef, 'edit', $queryString)); 687 687 #else 688 688 ## Redirect to view mode. 689 689 $response.sendRedirect($doc.getURL()) 690 690 #end 691 691 #else 692 - #if 584 + #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 711 -#foreach 712 - #if 713 - #set 601 +#set($action = 'edit') 602 +#foreach($paramName in $request.getParameterMap().keySet()) 603 + #if($paramName.startsWith('xaction_')) 604 + #set($action = $paramName.substring(8)) 714 714 #break 715 715 #end 716 716 #end 717 -#if 608 +#if($action == 'edit') 718 718 #doEdit() 719 -#elseif 720 - #if 610 +#elseif($action == 'save' || $action == 'saveandcontinue') 611 + #if($services.csrf.isTokenValid($request.form_token)) 721 721 #doSave() 722 722 #else 723 - $response.sendRedirect($services.csrf.getResubmissionURL()) 614 + $response.sendRedirect($services.csrf.getResubmissionURL()); 724 724 #end 725 725 #end 726 -{{/html}} 727 727 {{/velocity}}
- XWiki.JavaScriptExtension[2]
-
- Código
-
... ... @@ -367,11 +367,7 @@ 367 367 hintInput.title = 'Hint'; 368 368 } 369 369 // Move the hint input below the pretty name input, in the field viewer. 370 - var dd = hintInput.up('dd'); 371 - var dt = dd.previous('dt'); 372 372 field.getViewer().down('label').insert({after: hintInput}); 373 - dt.remove(); 374 - dd.remove(); 375 375 // Enhance the hint input. 376 376 new XWiki.InputWithTitle(hintInput); 377 377 new XWiki.AutoResizeInput(hintInput); ... ... @@ -430,7 +430,7 @@ 430 430 }); 431 431 }, 432 432 _onDrop : function(field) { 433 - var fieldContainer = new Element('li' , {'data-new': 'true'});429 + var fieldContainer = new Element('li'); 434 434 this.fields.insert(fieldContainer); 435 435 this.container.removeClassName('empty'); 436 436 new XWiki.FormField(fieldContainer).enhance(field.down('.data').value); ... ... @@ -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'); 514 + function init() { 515 + var form = $('inline'); 516 + if (!form) { 517 + return false; 518 + } 519 + // Let the sheet handle the form submit. 520 + // NOTE: The code that handles Save&Continue uses this URL to make the AJAX request and Firefox 3.6 doesn't resolve 521 + // the empty string to the current page URL so we have to explicitly specify it. 522 + form.action = window.location.href; 523 523 524 524 // Apply the vertical form layout standard. 525 525 form.addClassName('xform'); ... ... @@ -553,58 +553,8 @@ 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; 557 + return true; 566 566 } 567 - 568 568 (XWiki.domIsLoaded && init()) || document.observe('xwiki:dom:loaded', init); 569 569 }).call(); 570 - 571 -require(['jquery', 'xwiki-events-bridge'], function($) { 572 - $(document).on('xwiki:class:displayField xwiki:class:previewField', function(event, data) { 573 - var container = $(data.field.getContainer()); 574 - if (container.attr('data-new') === 'true') { 575 - // We can't suggest property values for properties that don't exist yet (have not been saved) so we provide 576 - // suggestions for the template property that was used to create them. Note that the suggested values depend on 577 - // the saved property meta data so changing the property (field) meta data may not affect the suggestions until 578 - // those changes are saved. 579 - var templateHiddenInput = container.find('#' + 'template-' + data.field.getName()); 580 - var propertyValueSuggester = container.find('.field-viewer .suggest-propertyValues').first(); 581 - propertyValueSuggester.attr({ 582 - 'data-className': templateHiddenInput.val(), 583 - 'data-propertyName': templateHiddenInput.attr('data-propertyName') 584 - }); 585 - } 586 - }).on('xwiki:document:saved', function(event) { 587 - // We need to update the property value suggesters because: 588 - // * newly saved properties should have their own suggestions instead of relying on the template property 589 - // * for renamed properties we need to fetch the suggestions from a different location 590 - $('ul#fields > li').each(function() { 591 - var container = $(this); 592 - container.removeAttr('data-new'); 593 - var propertyValueSuggester = container.find('.field-viewer .suggest-propertyValues').first(); 594 - if (propertyValueSuggester.length > 0) { 595 - // We need to preserve the selected values because they are lost when the suggester is destroyed. 596 - var selectedValues = propertyValueSuggester.children(); 597 - propertyValueSuggester[0].selectize.destroy(); 598 - // Restore the selected values. 599 - propertyValueSuggester.empty().append(selectedValues); 600 - var className = XWiki.Model.serialize(XWiki.currentDocument.documentReference.relativeTo( 601 - new XWiki.WikiReference(XWiki.currentWiki))); 602 - propertyValueSuggester.attr({ 603 - 'data-className': className, 604 - 'data-propertyName': propertyValueSuggester.attr('name').substr((className + '_0_').length) 605 - }); 606 - propertyValueSuggester.suggestPropertyValues(); 607 - } 608 - }); 609 - }); 610 -});
- XWiki.StyleSheetExtension[1]
-
- Código
-
... ... @@ -38,9 +38,7 @@ 38 38 } 39 39 40 40 #fields input.xHint { 41 - color: $theme.textSecondaryColor; 42 - font-size: smaller; 43 - font-weight: normal; 41 + border: 0 none; 44 44 } 45 45 46 46 #fields .labelLine label {