Cambios para el documento LiveTableEditSheet
Última modificación por Administrator el 2024/06/06 11:39
Desde 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]
Hasta la versión 3.1
editado por Administrator
el 2024/06/06 11:39
el 2024/06/06 11:39
Cambiar el comentario:
Install extension [org.xwiki.platform:xwiki-platform-appwithinminutes-ui/15.10.10]
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,0 @@ 1 -#if($doc.fullName=='AppWithinMinutes.LiveTableEditSheet')LiveTable Edit Sheet#{else}#evaluate($doc.title)#end - Syntax
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki 2. 01 +XWiki 2.1 - Contenido
-
... ... @@ -1,186 +1,313 @@ 1 +{{include reference="XWiki.TemplateProviderMacros" /}} 2 + 3 +{{include reference="AppWithinMinutes.VelocityMacros" /}} 4 + 1 1 {{velocity output="false"}} 2 -#macro(listAvailableColumns) 3 - {{html}} 4 - <select id="availableColumns"> 5 - #set($className = "$!liveTableObj.getProperty('class').value") 6 - #set($classFields = $xwiki.getDocument($className).getxWikiClass().properties) 7 - #set($discard = $services.localization.use('document', "$stringtool.removeEnd($className, 'Class')Translations")) 8 - #if($classFields.size() > 0) 9 - <optgroup label="$escapetool.xml($services.localization.render('platform.appwithinminutes.liveTableEditorClassFieldColumnGroupLabel'))" id="classFields"> 10 - #foreach($field in $classFields) 6 +#macro (listAvailableColumns $classReference) 7 + <select id="availableColumns" aria-describedby='availableColumnsHint'> 8 + #set ($classFields = $xwiki.getDocument($classReference).getxWikiClass().properties) 9 + #if ($classFields.size() > 0) 10 + <optgroup label="$escapetool.xml($services.localization.render( 11 + 'platform.appwithinminutes.liveTableEditorClassFieldColumnGroupLabel'))" id="classFields"> 12 + #foreach ($field in $classFields) 11 11 <option value="$field.name">$escapetool.xml($field.translatedPrettyName)</option> 12 12 #end 13 13 </optgroup> 14 14 #end 15 - <optgroup label="$escapetool.xml($services.localization.render('platform.appwithinminutes.liveTableEditorGenericColumnGroupLabel'))"> 16 - #foreach($entry in $genericColumns.entrySet()) 17 - <option value="$entry.key" title="$escapetool.xml($entry.value.get(1))">$escapetool.xml($entry.value.get(0))</option> 17 + <optgroup label="$escapetool.xml($services.localization.render( 18 + 'platform.appwithinminutes.liveTableEditorGenericColumnGroupLabel'))"> 19 + #foreach ($entry in $genericColumns.entrySet()) 20 + <option value="$entry.key" title="$escapetool.xml($entry.value.get(1))"> 21 + $escapetool.xml($entry.value.get(0)) 22 + </option> 18 18 #end 19 19 </optgroup> 20 20 </select> 21 - {{/html}} 26 + <a href="#addColumn" class="addColumn" title="$services.localization.render( 27 + 'platform.appwithinminutes.liveTableEditorAddColumnHint')">$services.icon.renderHTML('add')</a> 22 22 #end 23 23 24 -#macro(displayHelpPanel) 25 - #set($genericColumns = { 26 - 'doc.title': [$services.localization.render('platform.appwithinminutes.liveTableEditorDocTitleColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorDocTitleColumnDescription')], 27 - 'doc.name': [$services.localization.render('platform.appwithinminutes.liveTableEditorDocNameColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorDocNameColumnDescription')], 28 - 'doc.author': [$services.localization.render('platform.appwithinminutes.liveTableEditorDocAuthorColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorDocAuthorColumnDescription')], 29 - 'doc.creator': [$services.localization.render('platform.appwithinminutes.liveTableEditorDocCreatorColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorDocCreatorColumnDescription')], 30 - 'doc.date': [$services.localization.render('platform.appwithinminutes.liveTableEditorDocDateColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorDocDateColumnDescription')], 31 - 'doc.creationDate': [$services.localization.render('platform.appwithinminutes.liveTableEditorDocCreationDateColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorDocCreationDateColumnDescription')], 32 - '_actions': [$services.localization.render('platform.appwithinminutes.liveTableEditorActionsColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorActionsColumnDescription')], 33 - '_attachments': [$services.localization.render('platform.appwithinminutes.liveTableEditorAttachmentsColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorAttachmentsColumnDescription')], 34 - '_images': [$services.localization.render('platform.appwithinminutes.liveTableEditorImagesColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorImagesColumnDescription')] 30 +#macro (displayHelpPanel) 31 + #set ($genericColumns = { 32 + 'doc.title': [ 33 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocTitleColumnName'), 34 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocTitleColumnDescription') 35 + ], 36 + 'doc.name': [ 37 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocNameColumnName'), 38 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocNameColumnDescription') 39 + ], 40 + 'doc.location': [ 41 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocLocationColumnName'), 42 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocLocationColumnDescription') 43 + ], 44 + 'doc.author': [ 45 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocAuthorColumnName'), 46 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocAuthorColumnDescription') 47 + ], 48 + 'doc.creator': [ 49 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocCreatorColumnName'), 50 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocCreatorColumnDescription') 51 + ], 52 + 'doc.date': [ 53 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocDateColumnName'), 54 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocDateColumnDescription') 55 + ], 56 + 'doc.creationDate': [ 57 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocCreationDateColumnName'), 58 + $services.localization.render('platform.appwithinminutes.liveTableEditorDocCreationDateColumnDescription') 59 + ], 60 + '_actions': [ 61 + $services.localization.render('platform.appwithinminutes.liveTableEditorActionsColumnName'), 62 + $services.localization.render('platform.appwithinminutes.liveTableEditorActionsColumnDescription') 63 + ], 64 + '_attachments': [ 65 + $services.localization.render('platform.appwithinminutes.liveTableEditorAttachmentsColumnName'), 66 + $services.localization.render('platform.appwithinminutes.liveTableEditorAttachmentsColumnDescription') 67 + ], 68 + '_images': [ 69 + $services.localization.render('platform.appwithinminutes.liveTableEditorImagesColumnName'), 70 + $services.localization.render('platform.appwithinminutes.liveTableEditorImagesColumnDescription') 71 + ] 35 35 }) 36 - (% class="wizard-help" %) 37 - ((( 38 - **$services.localization.render('platform.appwithinminutes.liveTableEditorHelpTitle')** $services.localization.render('platform.appwithinminutes.liveTableEditorHelpDescription') 39 - 40 - #foreach($columnId in ['doc.name', 'doc.date', 'doc.author', '_actions']) 41 - ; {{{$genericColumns.get($columnId).get(0)}}} 42 - : {{{$genericColumns.get($columnId).get(1)}}} 43 - #end 44 - ))) 73 + <div class="wizard-help"> 74 + <p> 75 + <strong>$services.localization.render('platform.appwithinminutes.liveTableEditorHelpTitle')</strong> 76 + $services.localization.render('platform.appwithinminutes.liveTableEditorHelpDescription') 77 + </p> 78 + <dl> 79 + #foreach ($columnId in ['doc.title', 'doc.location', 'doc.date', 'doc.author', '_actions']) 80 + <dt>$genericColumns.get($columnId).get(0)</dt> 81 + <dd>$genericColumns.get($columnId).get(1)</dd> 82 + #end 83 + </dl> 84 + </div> 45 45 #end 46 46 47 -#macro(displayFormFields) 48 - {{html wiki="true"}} 49 - (% class="hidden" %) 50 - ((( 87 +#macro (displayFormFields) 88 + <div class="hidden"> 51 51 ## Make sure that only the sheet content is rendered when the class is saved using AJAX. 52 52 <input type="hidden" name="xpage" value="plain" /> 53 - ## We prevent the class name from being edited directly. The class name can be specified in the URL. 54 - $doc.display('class', 'hidden') 91 + ## We prevent the class name and the data space from being edited directly. They can be specified in the URL. 92 + #getAppClassReference($doc) 93 + <input type="hidden" name="AppWithinMinutes.LiveTableClass_0_class" 94 + value="$escapetool.xml($services.model.serialize($classReference, 'local'))" /> 95 + #displayPropertyValue('dataSpace', 'hidden') 55 55 ## We have to pass the list of available columns to the JavaScript code. 56 - #listAvailableColumns() 57 - ))) 58 - ; <label for="AppWithinMinutes.LiveTableClass_0_description">$doc.displayPrettyName('description', false, false)</label>## 59 - (% class="xHint" %)$services.localization.render('platform.appwithinminutes.liveTableEditorDescriptionHint') 60 - : $doc.display('description') 61 - ; <label for="AppWithinMinutes.LiveTableClass_0_columns">$doc.displayPrettyName('columns', false, false)</label>## 62 - (% class="xHint" %)$services.localization.render('platform.appwithinminutes.liveTableEditorColumnsHint') 63 - : $doc.display('columns') 64 - {{/html}} 97 + #listAvailableColumns($classReference) 98 + </div> 99 + <dl> 100 + <dt> 101 + <label for="xwikidoctitleinput">$services.localization.render('core.editors.content.titleField.label')</label> 102 + <span class="xHint">$services.localization.render('platform.appwithinminutes.liveTableEditorTitleHint')</span> 103 + </dt> 104 + <dd><input id="xwikidoctitleinput" type="text" name="title" value="$escapetool.xml($doc.title)"/></dd> 105 + <dt> 106 + <label for="AppWithinMinutes.LiveTableClass_0_description"> 107 + $doc.displayPrettyName('description', false, false) 108 + </label> 109 + <span class="xHint"> 110 + $services.localization.render('platform.appwithinminutes.liveTableEditorDescriptionHint') 111 + </span> 112 + </dt> 113 + <dd>#displayPropertyValue('description')</dd> 114 + <dt> 115 + <label id='availableColumnsLabel' for="AppWithinMinutes.LiveTableClass_0_columns">$doc.displayPrettyName('columns', false, false)</label> 116 + <span id='availableColumnsHint' class="xHint">$services.localization.render('platform.appwithinminutes.liveTableEditorColumnsHint')</span> 117 + </dt> 118 + <dd>#displayPropertyValue('columns')</dd> 119 + </dl> 65 65 #end 66 66 67 -#macro(displayIcon) 68 - #if($services.uix) 69 - #set($icon = 'icon:application') 70 - #foreach($uix in $services.uix.getExtensions('org.xwiki.platform.panels.Applications')) 71 - #if($uix.getId() == "platform.panels.${doc.space}Application" && "$!uix.getParameters().get('icon')" != '') 72 - #set($icon = $uix.getParameters().get('icon')) 73 - #end 122 +#macro (getApplicationIcon $classReference) 123 + #set ($applicationIcon = '') 124 + ## Look for the corresponding UI extension. 125 + #set ($uixPointId = 'org.xwiki.platform.panels.Applications') 126 + #set ($uixObject = $doc.getObject('XWiki.UIExtensionClass', 'extensionPointId', $uixPointId)) 127 + #set ($uixId = $uixObject.getValue('name')) 128 + #foreach ($uix in $services.uix.getExtensions($uixPointId)) 129 + #if ($uix.id == $uixId) 130 + #set ($applicationIcon = $uix.parameters.icon) 74 74 #end 75 - {{html wiki="true"}} 76 - ; <label for="applicationIcon">$services.localization.render('platform.appwithinminutes.liveTableEditorIcon')</label> 77 - (% class="xHint" %)$services.localization.render('platform.appwithinminutes.liveTableEditorIconHint', 78 - [$xwiki.getSkinFile('icons/silk/index_abc.png')]) 79 - : <input id="applicationIcon" name="applicationIcon" type="text" size="10" value="$!escapetool.xml($icon)" /> 80 - {{/html}} 81 81 #end 133 + #if ("$!applicationIcon" == '') 134 + ## Fallback on the entry icon. 135 + #set ($templateProviderReference = $services.model.createDocumentReference( 136 + "$stringtool.removeEnd($classReference.name, 'Class')TemplateProvider", 137 + $classReference.parent 138 + )) 139 + #set ($entryIcon = $xwiki.getDocument($templateProviderReference).getValue('icon')) 140 + #if ("$!entryIcon" != '') 141 + #set ($applicationIcon = "icon:$entryIcon") 142 + #else 143 + #set ($applicationIcon = 'icon:application') 144 + #end 145 + #end 82 82 #end 83 83 84 -#macro(doEdit) 85 - #set($liveTableObj = $doc.getObject('AppWithinMinutes.LiveTableClass', true)) 86 - #set($discard = $doc.use($liveTableObj)) 87 - #set($discard = $xwiki.jsfx.use('js/scriptaculous/dragdrop.js')) 88 - #set($discard = $xwiki.ssx.use('AppWithinMinutes.LiveTableEditSheet')) 89 - #set($discard = $xwiki.jsx.use('AppWithinMinutes.LiveTableEditSheet')) 90 - #if("$!request.wizard" == 'true') 91 - #appWizardHeader(3) 148 +#macro (displayIcon) 149 + #if ($services.uix) 150 + #getApplicationIcon($classReference) 151 + <dl> 152 + <dt> 153 + <label for="applicationIcon"> 154 + $services.localization.render('platform.appwithinminutes.liveTableEditorIcon') 155 + </label> 156 + <span class="xHint"> 157 + $services.localization.render('platform.appwithinminutes.liveTableEditorIconHintWithPicker', 158 + [$xwiki.getSkinFile('icons/silk/index_abc.png')]) 159 + </span> 160 + </dt> 161 + <dd> 162 + <input id="applicationIcon" name="applicationIcon" type="text" size="10" 163 + value="$!escapetool.xml($applicationIcon)" /> 164 + </dd> 165 + </dl> 166 + #end 167 +#end 92 92 169 +#macro (doEdit) 170 + {{html clean="false"}} 171 + #set ($liveTableObj = $doc.getObject('AppWithinMinutes.LiveTableClass', true)) 172 + #set ($discard = $doc.use($liveTableObj)) 173 + #set ($discard = $xwiki.ssx.use('AppWithinMinutes.LiveTableEditSheet')) 174 + #set ($discard = $xwiki.jsx.use('AppWithinMinutes.LiveTableEditSheet')) 175 + #if ("$!request.wizard" == 'true') 176 + #appWizardHeader('presentation') 93 93 #end 94 94 #displayHelpPanel() 95 - (% class="form-body" %) 96 - ((( 179 + <div class="form-body"> 97 97 #displayFormFields() 98 - 99 99 #displayIcon() 100 - 101 - #if("$!request.wizard" == 'true') 102 - 103 - #appWizardFooter(3) 182 + #if ("$!request.wizard" == 'true') 183 + #appWizardFooter('presentation') 104 104 #end 105 - ))) 106 - {{html}}<div class="clearfloats"></div>{{/html}} 185 + </div> 186 + <div class="clearfloats"></div> 187 + {{/html}} 188 + 189 + {{iconPicker id="applicationIcon" prefix="icon:" /}} 107 107 #end 108 108 109 -#macro(maybeGrantSpaceAdminRight $spaceHomeRef) 110 - ## Grant space administration rights only if the space is new. 111 - #if(!$xwiki.exists($spaceHomeRef)) 112 - #set($spacePrefsRef = $services.model.createDocumentReference($spaceHomeRef.wikiReference.name, $spaceHomeRef.lastSpaceReference.name, 'WebPreferences')) 113 - #set($spacePrefsDoc = $xwiki.getDocument($spacePrefsRef)) 114 - ## Don't overwrite existing space preferences. 115 - #if($spacePrefsDoc.isNew()) 116 - #set($discard = $spacePrefsDoc.use($spacePrefsDoc.getObject('XWiki.XWikiGlobalRights', true))) 117 - #set($discard = $spacePrefsDoc.set('allow', 1)) 118 - #set($discard = $spacePrefsDoc.set('levels', 'admin')) 119 - #set($discard = $spacePrefsDoc.set('users', $services.model.serialize($xcontext.userReference, 'default'))) 120 - #set($discard = $spacePrefsDoc.setParent($services.model.serialize($spaceHomeRef, 'default'))) 121 - #set($discard = $spacePrefsDoc.setHidden(true)) 122 - #set($discard = $spacePrefsDoc.saveWithProgrammingRights($services.localization.render('platform.appwithinminutes.grantSpaceAdminRightsSaveComment'))) 123 - #end 192 +#macro (maybeGrantSpaceAdminRight $spaceRef) 193 + ## Grant space administration rights only if the space is new. Don't overwrite existing space preferences. 194 + #set ($spaceHomeRef = $services.model.resolveDocument('', 'default', $spaceRef)) 195 + #set ($spacePrefsRef = $services.model.resolveDocument('WebPreferences', 'explicit', $spaceRef)) 196 + ## Verify that the current user has script right on the current space home. 197 + #set ($hasScript = $services.security.authorization.hasAccess('script', $xcontext.userReference, $spaceHomeRef)) 198 + #if ($hasScript && !$xwiki.exists($spaceHomeRef) && !$xwiki.exists($spacePrefsRef)) 199 + #set ($spacePrefsDoc = $xwiki.getDocument($spacePrefsRef)) 200 + #set ($discard = $spacePrefsDoc.use($spacePrefsDoc.getObject('XWiki.XWikiGlobalRights', true))) 201 + #set ($discard = $spacePrefsDoc.set('allow', 1)) 202 + #set ($discard = $spacePrefsDoc.set('levels', 'admin')) 203 + #set ($discard = $spacePrefsDoc.set('users', $services.model.serialize($xcontext.userReference, 'default'))) 204 + #set ($discard = $spacePrefsDoc.setTitle('$services.localization.render(''admin.preferences.title'')')) 205 + #set ($discard = $spacePrefsDoc.setParent($services.model.serialize($spaceHomeRef, 'default'))) 206 + #set ($discard = $spacePrefsDoc.setHidden(true)) 207 + #set ($discard = $spacePrefsDoc.saveWithProgrammingRights($services.localization.render( 208 + 'platform.appwithinminutes.grantSpaceAdminRightsSaveComment'))) 124 124 #end 125 125 #end 126 126 127 -#macro(maybeGrantSpaceAdminRights) 128 - ## Data space 129 - #set($dataSpaceHomeRef = $services.model.createDocumentReference($doc.wiki, $doc.space, 'WebHome')) 130 - #maybeGrantSpaceAdminRight($dataSpaceHomeRef) 131 - ## Code space 132 - #set($className = $request.get('AppWithinMinutes.LiveTableClass_0_class')) 133 - #set($classRef = $services.model.resolveDocument($className)) 134 - #set($codeSpaceHomeRef = $services.model.createDocumentReference($classRef.wikiReference.name, $classRef.lastSpaceReference.name, 'WebHome')) 135 - #maybeGrantSpaceAdminRight($codeSpaceHomeRef) 212 +#macro (maybeGrantSpaceAdminRights) 213 + ## Application space 214 + #set ($appReference = $doc.documentReference.parent) 215 + #maybeGrantSpaceAdminRight($appReference) 216 + ## Code space (if it's not nested inside the application space) 217 + #set ($className = $request.get('AppWithinMinutes.LiveTableClass_0_class')) 218 + #set ($classReference = $services.model.resolveDocument($className)) 219 + #if (!$classReference.hasParent($appReference)) 220 + #maybeGrantSpaceAdminRight($classReference.parent) 221 + #end 136 136 #end 137 137 138 -#macro(updateAndSaveLiveTable) 139 - #set($discard = $doc.updateObjectFromRequest('AppWithinMinutes.LiveTableClass')) 140 - #set($liveTableGeneratorDoc = $xwiki.getDocument('AppWithinMinutes.LiveTableGenerator')) 141 - #set($discard = $doc.setContent($doc.getRenderedContent($liveTableGeneratorDoc.content, $liveTableGeneratorDoc.syntax.toIdString(), 'plain/1.0'))) 142 - #set($minorEdit = "$!request.minorEdit" != '') 143 - #set($comment = $request.comment) 144 - #if("$!comment" == '') 145 - #set($comment = $services.localization.render('platform.appwithinminutes.liveTableEditorSaveComment')) 224 +#macro (updateAndSaveLiveTable) 225 + #set ($discard = $doc.updateObjectFromRequest('AppWithinMinutes.LiveTableClass')) 226 + #set ($liveTableGeneratorDoc = $xwiki.getDocument('AppWithinMinutes.LiveTableGenerator')) 227 + 228 + ## Generate the LiveTable by displaying the LiveTableGenerator document in the context of the current document. 229 + #set ($displayParameters = $services.display.createDocumentDisplayerParameters()) 230 + #set ($discard = $displayParameters.setExecutionContextIsolated(false)) 231 + #set ($discard = $displayParameters.setContentTranslated(true)) 232 + #set ($generatedLiveTableContent = $services.display.content($liveTableGeneratorDoc, { 233 + 'outputSyntaxId': 'plain/1.0', 234 + 'displayerParameters': $displayParameters 235 + })) 236 + 237 + ## Use the generated LiveTable content for the data home page. 238 + #set ($dataSpaceReference = $services.model.resolveSpace($doc.getValue('dataSpace'))) 239 + #set ($dataSpaceHomeReference = $services.model.resolveDocument('', 'default', $dataSpaceReference)) 240 + #if ($dataSpaceHomeReference.equals($doc.documentReference) || !$xwiki.exists($dataSpaceHomeReference)) 241 + ## Either the application space and the data space are one and the same or this is a new application and we don't 242 + ## want to promote the data space anymore. 243 + #set ($dataHomePage = $doc) 244 + #else 245 + ## The application data is stored in a different space. 246 + #set ($dataHomePage = $xwiki.getDocument($dataSpaceHomeReference)) 247 + #set ($discard = $dataHomePage.setHidden(true)) 248 + #set ($escapedAppName = $doc.documentReference.parent.name.toLowerCase().replace("'", "''")) 249 + #set ($discard = $dataHomePage.setTitle("${escapetool.d}services.localization.render('${escapedAppName}.dataSpace.title')")) 250 + 251 + ## Update the home page content. 252 + #set ($homePageContent = '') 253 + #if ("$!generatedLiveTableContent" != '') 254 + ## Include the entries live table in the application home page. 255 + #set ($escapedReference = $services.model.serialize($dataSpaceHomeReference).replaceAll('([~"])', '~$1')) 256 + #set ($homePageContent = "{{include reference=""$escapedReference"" /}}") 257 + #end 258 + #set ($discard = $doc.setContent($homePageContent)) 146 146 #end 147 - #set($discard = $doc.save($comment, $minorEdit)) 148 -#end 260 + #set ($discard = $dataHomePage.setContent($generatedLiveTableContent)) 261 + ## We assume for now that the output produced by the live table generator uses the same syntax as the code of the live 262 + ## table generator. We have to set the syntax because the default wiki syntax (used when creating new wiki pages) 263 + ## could be different than the one used by the live table generator. 264 + #set ($discard = $dataHomePage.setSyntax($liveTableGeneratorDoc.syntax)) 149 149 150 -#macro(maybeCreateLiveTableResultsPage) 151 - #set ($className = "$!doc.getObject('AppWithinMinutes.LiveTableClass').getProperty('class').value") 152 - #set ($liveTableResultsDoc = $xwiki.getDocument("$!stringtool.removeEnd($className, 'Class')LiveTableResults")) 153 - #set ($liveTableResultsGeneratorDoc = $xwiki.getDocument('AppWithinMinutes.LiveTableResultsGenerator')) 154 - #if ($liveTableResultsDoc.isNew()) 155 - #set ($discard = $liveTableResultsDoc.setParent($doc.name)) 156 - #set ($discard = $liveTableResultsDoc.setHidden(true)) 157 - #set ($discard = $liveTableResultsDoc.setContent($doc.getRenderedContent($liveTableResultsGeneratorDoc.content, $liveTableResultsGeneratorDoc.syntax.toIdString(), 'plain/1.0'))) 158 - #set ($discard = $liveTableResultsDoc.save($services.localization.render('platform.appwithinminutes.liveTableEditorCreateLiveTableResultsComment'))) 266 + #set ($minorEdit = "$!request.minorEdit" != '') 267 + #set ($comment = $request.comment) 268 + #if ("$!comment" == '') 269 + #set ($comment = $services.localization.render('platform.appwithinminutes.liveTableEditorSaveComment')) 159 159 #end 271 + 272 + #if ($dataHomePage != $doc) 273 + ## Save the data home page. 274 + #set ($discard = $dataHomePage.save($comment, $minorEdit)) 275 + #end 276 + 277 + ## Save the application home page. 278 + #set ($discard = $doc.save($comment, $minorEdit)) 160 160 #end 161 161 162 -#macro(updateAndSaveIcon) 163 - #set($uix = $doc.getObject('XWiki.UIExtensionClass', true)) 164 - #set($discard = $uix.set('name', "platform.panels.${doc.space}Application")) 165 - #set($discard = $uix.set('extensionPointId', "org.xwiki.platform.panels.Applications")) 166 - #set($discard = $uix.set('parameters', "label=${doc.space}${util.newline}target=${doc.fullName}${util.newline}icon=${request.applicationIcon}")) 167 - #set($discard = $doc.save('Updated application icon', true)) 281 +#macro (updateAndSaveIcon) 282 + #set ($uix = $doc.getObject('XWiki.UIExtensionClass', true)) 283 + #set ($discard = $uix.set('name', "platform.panels.${doc.space}Application")) 284 + #set ($discard = $uix.set('extensionPointId', 'org.xwiki.platform.panels.Applications')) 285 + #set ($uixParams = [ 286 + "label=$doc.plainTitle", 287 + "target=$doc.fullName", 288 + "icon=$request.applicationIcon" 289 + ]) 290 + #set ($discard = $uix.set('parameters', $stringtool.join($uixParams, $util.newline))) 291 + #set ($hasWikiAdminRights = $services.security.authorization.hasAccess('admin', $doc.documentReference.wikiReference)) 292 + #set ($discard = $uix.set('scope', "#if ($hasWikiAdminRights)wiki#{else}user#end")) 293 + #set ($discard = $doc.save('Updated application icon', true)) 168 168 #end 169 169 170 -#macro(doSave) 296 +#macro (doSave) 171 171 #maybeGrantSpaceAdminRights() 172 172 #updateAndSaveLiveTable() 173 - #maybeCreateLiveTableResultsPage() 174 174 #updateAndSaveIcon() 175 - #if($action == 'save') 176 - #if($errorMessage) 177 - {{error}}{{html}}$errorMessage{{/html}}{{/error}} 300 + #if ($action == 'save') 301 + #if ($errorMessage) 302 + {{html clean="false"}} 303 + <div class="box errormessage">$errorMessage</div> 304 + {{/html}} 178 178 #else 179 179 ## Redirect to view mode. 180 180 $response.sendRedirect($doc.getURL()) 181 181 #end 182 182 #else 183 - #if($errorMessage) 310 + #if ($errorMessage) 184 184 $response.sendError(400, $errorMessage) 185 185 #else 186 186 $response.setStatus(204) ... ... @@ -190,7 +190,11 @@ 190 190 {{/velocity}} 191 191 192 192 {{velocity}} 193 -#if("$!request.wizard" == 'true') 320 +#if (!$services.security.authorization.hasAccess('script', $xcontext.userReference, $doc.documentReference)) 321 + {{error}}{{translation key="platform.appwithinminutes.appHomePageNoScriptRight" /}}{{/error}} 322 + 323 +#end 324 +#if ("$!request.wizard" == 'true') 194 194 {{include reference="AppWithinMinutes.WizardStep" /}} 195 195 #end 196 196 {{/velocity}} ... ... @@ -197,20 +197,20 @@ 197 197 198 198 {{velocity}} 199 199 ## Determine the action button that triggered the request 200 -#set($action = $xcontext.action) 201 -#foreach($paramName in $request.getParameterMap().keySet()) 202 - #if($paramName.startsWith('xaction_')) 203 - #set($action = $paramName.substring(8)) 331 +#set ($action = $xcontext.action) 332 +#foreach ($paramName in $request.getParameterMap().keySet()) 333 + #if ($paramName.startsWith('xaction_')) 334 + #set ($action = $paramName.substring(8)) 204 204 #break 205 205 #end 206 206 #end 207 -#if($action == 'edit') 338 +#if ($action == 'edit') 208 208 #doEdit() 209 -#elseif($action == 'save' || $action == 'saveandcontinue') 210 - #if($services.csrf.isTokenValid($request.form_token)) 340 +#elseif ($action == 'save' || $action == 'saveandcontinue') 341 + #if ($services.csrf.isTokenValid($request.form_token)) 211 211 #doSave() 212 212 #else 213 - $response.sendRedirect($services.csrf.getResubmissionURL()) ;344 + $response.sendRedirect($services.csrf.getResubmissionURL()) 214 214 #end 215 215 #end 216 216 {{/velocity}}
- XWiki.JavaScriptExtension[0]
-
- Código
-
... ... @@ -61,11 +61,12 @@ 61 61 this.columnsSelect = $('availableColumns'); 62 62 this.columnsSelect.selectedIndex = -1; 63 63 64 - var addButton = new Element('input', {type: 'image',src: '$xwiki.getSkinFile('icons/silk/add.png')', alt: '$escapetool.javascript($services.localization.render('platform.appwithinminutes.liveTableEditorAddColumnHint'))'});64 + var addButton = this.columnsSelect.next('a.addColumn'); 65 65 addButton.observe('click', this._onAddColumn.bindAsEventListener(this)); 66 66 67 67 var picker = new Element('div', {'class': 'columnPicker'}).insert(this.columnsSelect).insert(addButton); 68 68 this.columnsInput.up().insert(picker); 69 + $('availableColumnsLabel').setAttribute('for', 'availableColumns'); 69 69 }, 70 70 _onAddColumn : function(event) { 71 71 event.stop(); ... ... @@ -121,15 +121,11 @@ 121 121 } 122 122 }); 123 123 124 -function init() { 125 - var form = $('inline'); 126 - if (!form) { 127 - return false; 128 - } 129 - // Let the sheet handle the form submit. 130 - // NOTE: The code that handles Save&Continue uses this URL to make the AJAX request and Firefox 3.6 doesn't resolve 131 - // the empty string to the current page URL so we have to explicitly specify it. 132 - form.action = window.location.href; 125 +function initForm(form) { 126 + // Let the sheet handle the form submit. The form is submitted by default to the preview action which dispatches the 127 + // request to the save action if the save button is detected on the request parameters. By submitting to the edit 128 + // action the edit sheet is evaluated and thus it can handle the save by itself. 129 + form.action = XWiki.currentDocument.getURL('edit'); 133 133 134 134 // Apply the vertical form layout standard. 135 135 form.addClassName('xform'); ... ... @@ -154,9 +154,18 @@ 154 154 }.bindAsEventListener(window)); 155 155 156 156 new XWiki.LiveTableEditor(); 154 +} 157 157 158 - return true; 156 +function init() { 157 + var form = $('inline'); 158 + if (form) { 159 + require(['scriptaculous/dragdrop'], function() { 160 + initForm(form); 161 + }); 162 + } 163 + return form; 159 159 } 165 + 160 160 (XWiki.domIsLoaded && init()) || document.observe('xwiki:dom:loaded', init); 161 161 162 162 // Allow widgets to catch the save event before the form is submitted when the 'Save & Continue' button is clicked. We
- XWiki.StyleSheetExtension[0]
-
- Código
-
... ... @@ -52,10 +52,9 @@ 52 52 width: auto; 53 53 } 54 54 55 -.columnPicker input[type=image]{55 +.columnPicker a.addColumn { 56 56 margin: 0 .5em; 57 57 padding: 0; 58 - vertical-align: text-bottom; 59 59 } 60 60 61 61 .form-body {