Changes for page LiveTableEditSheet
Last modified by Richard Johnson on 2021/05/08 19:21
edited by Richard Johnson
on 2019/03/30 13:46
on 2019/03/30 13:46
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-appwithinminutes-ui/11.2]
Summary
-
Page properties (3 modified, 0 added, 0 removed)
-
Objects (2 modified, 0 added, 0 removed)
Details
- Page properties
-
- Author
-
... ... @@ -1,1 +1,1 @@ 1 -xwiki:XWiki. superadmin1 +xwiki:XWiki.raj - Syntax
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki 2. 01 +XWiki 2.1 - Content
-
... ... @@ -1,117 +1,193 @@ 1 +{{include reference="XWiki.TemplateProviderMacros" /}} 2 + 3 +{{include reference="AppWithinMinutes.VelocityMacros" /}} 4 + 1 1 {{velocity output="false"}} 2 -#macro(listAvailableColumns) 3 - {{html}} 6 +#macro (listAvailableColumns $classReference) 4 4 <select id="availableColumns"> 5 - #set($class Name ="$!liveTableObj.getValue('class')")6 - # set($classFields= $xwiki.getDocument($className).getxWikiClass().properties)7 - #if($classFields.size() > 0)8 - <optgrouplabel="$escapetool.xml($services.localization.render('platform.appwithinminutes.liveTableEditorClassFieldColumnGroupLabel'))" id="classFields">9 - #foreach($field in $classFields) 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) 10 10 <option value="$field.name">$escapetool.xml($field.translatedPrettyName)</option> 11 11 #end 12 12 </optgroup> 13 13 #end 14 - <optgroup label="$escapetool.xml($services.localization.render('platform.appwithinminutes.liveTableEditorGenericColumnGroupLabel'))"> 15 - #foreach($entry in $genericColumns.entrySet()) 16 - <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> 17 17 #end 18 18 </optgroup> 19 19 </select> 20 - {{/html}} 26 + <a href="#addColumn" class="addColumn" title="$services.localization.render( 27 + 'platform.appwithinminutes.liveTableEditorAddColumnHint')">$services.icon.renderHTML('add')</a> 21 21 #end 22 22 23 -#macro(displayHelpPanel) 24 - #set($genericColumns = { 25 - 'doc.title': [$services.localization.render('platform.appwithinminutes.liveTableEditorDocTitleColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorDocTitleColumnDescription')], 26 - 'doc.name': [$services.localization.render('platform.appwithinminutes.liveTableEditorDocNameColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorDocNameColumnDescription')], 27 - 'doc.location': [$services.localization.render('platform.appwithinminutes.liveTableEditorDocLocationColumnName'), $services.localization.render('platform.appwithinminutes.liveTableEditorDocLocationColumnDescription')], 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.title', 'doc.location', '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 53 ## We prevent the class name and the data space from being edited directly. They can be specified in the URL. 54 - $doc.display('class', 'hidden') 55 - $doc.display('dataSpace', 'hidden') 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') 56 56 ## We have to pass the list of available columns to the JavaScript code. 57 - #listAvailableColumns() 58 - ))) 59 - ; <label for="AppWithinMinutes.LiveTableClass_0_description">$doc.displayPrettyName('description', false, false)</label>## 60 - (% class="xHint" %)$services.localization.render('platform.appwithinminutes.liveTableEditorDescriptionHint') 61 - : $doc.display('description') 62 - ; <label for="AppWithinMinutes.LiveTableClass_0_columns">$doc.displayPrettyName('columns', false, false)</label>## 63 - (% class="xHint" %)$services.localization.render('platform.appwithinminutes.liveTableEditorColumnsHint') 64 - : $doc.display('columns') 65 - {{/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 for="AppWithinMinutes.LiveTableClass_0_columns">$doc.displayPrettyName('columns', false, false)</label> 116 + <span class="xHint">$services.localization.render('platform.appwithinminutes.liveTableEditorColumnsHint')</span> 117 + </dt> 118 + <dd>#displayPropertyValue('columns')</dd> 119 + </dl> 66 66 #end 67 67 68 -#macro(displayIcon) 69 - #if($services.uix) 70 - #set ($icon = 'icon:application') 71 - #set ($templateProviderReference = "$stringtool.removeEnd($className, 'Class')TemplateProvider") 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) 131 + #end 132 + #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 + )) 72 72 #set ($entryIcon = $xwiki.getDocument($templateProviderReference).getValue('icon')) 73 73 #if ("$!entryIcon" != '') 74 - ## Use the entry icon by default, if set. 75 - #set ($icon = "icon:$entryIcon") 141 + #set ($applicationIcon = "icon:$entryIcon") 142 + #else 143 + #set ($applicationIcon = 'icon:application') 76 76 #end 77 - #foreach ($uix in $services.uix.getExtensions('org.xwiki.platform.panels.Applications')) 78 - #if ($uix.id == "platform.panels.${doc.space}Application" && "$!uix.parameters.icon" != '') 79 - #set ($icon = $uix.parameters.icon) 80 - #end 81 - #end 82 - {{html wiki="true"}} 83 - ; <label for="applicationIcon">$services.localization.render('platform.appwithinminutes.liveTableEditorIcon')</label> 84 - (% class="xHint" %)$services.localization.render('platform.appwithinminutes.liveTableEditorIconHintWithPicker', 85 - [$xwiki.getSkinFile('icons/silk/index_abc.png')]) 86 - : <input id="applicationIcon" name="applicationIcon" type="text" size="10" value="$!escapetool.xml($icon)" /> 87 - {{/html}} 145 + #end 146 +#end 88 88 89 - {{iconPicker id="applicationIcon" prefix="icon:" /}} 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> 90 90 #end 91 91 #end 92 92 93 -#macro(doEdit) 94 - #set($liveTableObj = $doc.getObject('AppWithinMinutes.LiveTableClass', true)) 95 - #set($discard = $doc.use($liveTableObj)) 96 - #set($discard = $xwiki.jsfx.use('js/scriptaculous/dragdrop.js')) 97 - #set($discard = $xwiki.ssx.use('AppWithinMinutes.LiveTableEditSheet')) 98 - #set($discard = $xwiki.jsx.use('AppWithinMinutes.LiveTableEditSheet')) 99 - #if("$!request.wizard" == 'true') 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.jsfx.use('js/scriptaculous/dragdrop.js')) 174 + #set ($discard = $xwiki.ssx.use('AppWithinMinutes.LiveTableEditSheet')) 175 + #set ($discard = $xwiki.jsx.use('AppWithinMinutes.LiveTableEditSheet')) 176 + #if ("$!request.wizard" == 'true') 100 100 #appWizardHeader('presentation') 101 - 102 102 #end 103 103 #displayHelpPanel() 104 - (% class="form-body" %) 105 - ((( 180 + <div class="form-body"> 106 106 #displayFormFields() 107 - 108 108 #displayIcon() 109 - #if("$!request.wizard" == 'true') 110 - 183 + #if ("$!request.wizard" == 'true') 111 111 #appWizardFooter('presentation') 112 112 #end 113 - ))) 114 - {{html}}<div class="clearfloats"></div>{{/html}} 186 + </div> 187 + <div class="clearfloats"></div> 188 + {{/html}} 189 + 190 + {{iconPicker id="applicationIcon" prefix="icon:" /}} 115 115 #end 116 116 117 117 #macro (maybeGrantSpaceAdminRight $spaceRef) ... ... @@ -144,9 +144,9 @@ 144 144 #end 145 145 #end 146 146 147 -#macro(updateAndSaveLiveTable) 148 - #set($discard = $doc.updateObjectFromRequest('AppWithinMinutes.LiveTableClass')) 149 - #set($liveTableGeneratorDoc = $xwiki.getDocument('AppWithinMinutes.LiveTableGenerator')) 223 +#macro (updateAndSaveLiveTable) 224 + #set ($discard = $doc.updateObjectFromRequest('AppWithinMinutes.LiveTableClass')) 225 + #set ($liveTableGeneratorDoc = $xwiki.getDocument('AppWithinMinutes.LiveTableGenerator')) 150 150 151 151 ## Generate the LiveTable by displaying the LiveTableGenerator document in the context of the current document. 152 152 #set ($displayParameters = $services.display.createDocumentDisplayerParameters()) ... ... @@ -179,10 +179,10 @@ 179 179 #end 180 180 #set ($discard = $dataHomePage.setContent($generatedLiveTableContent)) 181 181 182 - #set($minorEdit = "$!request.minorEdit" != '') 183 - #set($comment = $request.comment) 184 - #if("$!comment" == '') 185 - #set($comment = $services.localization.render('platform.appwithinminutes.liveTableEditorSaveComment')) 258 + #set ($minorEdit = "$!request.minorEdit" != '') 259 + #set ($comment = $request.comment) 260 + #if ("$!comment" == '') 261 + #set ($comment = $services.localization.render('platform.appwithinminutes.liveTableEditorSaveComment')) 186 186 #end 187 187 188 188 #if ($dataHomePage != $doc) ... ... @@ -191,33 +191,39 @@ 191 191 #end 192 192 193 193 ## Save the application home page. 194 - #set($discard = $doc.save($comment, $minorEdit)) 270 + #set ($discard = $doc.save($comment, $minorEdit)) 195 195 #end 196 196 197 -#macro(updateAndSaveIcon) 198 - #set($uix = $doc.getObject('XWiki.UIExtensionClass', true)) 199 - #set($appName = $doc.documentReference.parent.name) 200 - #set($discard = $uix.set('name', "platform.panels.${appName}Application")) 201 - #set($discard = $uix.set('extensionPointId', 'org.xwiki.platform.panels.Applications')) 202 - #set($discard = $uix.set('parameters', "label=${appName}${util.newline}target=${doc.fullName}${util.newline}icon=${request.applicationIcon}")) 273 +#macro (updateAndSaveIcon) 274 + #set ($uix = $doc.getObject('XWiki.UIExtensionClass', true)) 275 + #set ($discard = $uix.set('name', "platform.panels.${doc.space}Application")) 276 + #set ($discard = $uix.set('extensionPointId', 'org.xwiki.platform.panels.Applications')) 277 + #set ($uixParams = [ 278 + "label=$doc.plainTitle", 279 + "target=$doc.fullName", 280 + "icon=$request.applicationIcon" 281 + ]) 282 + #set ($discard = $uix.set('parameters', $stringtool.join($uixParams, $util.newline))) 203 203 #set ($hasWikiAdminRights = $services.security.authorization.hasAccess('admin', $doc.documentReference.wikiReference)) 204 - #set($discard = $uix.set('scope', "#if ($hasWikiAdminRights)wiki#{else}user#end")) 205 - #set($discard = $doc.save('Updated application icon', true)) 284 + #set ($discard = $uix.set('scope', "#if ($hasWikiAdminRights)wiki#{else}user#end")) 285 + #set ($discard = $doc.save('Updated application icon', true)) 206 206 #end 207 207 208 -#macro(doSave) 288 +#macro (doSave) 209 209 #maybeGrantSpaceAdminRights() 210 210 #updateAndSaveLiveTable() 211 211 #updateAndSaveIcon() 212 - #if($action == 'save') 213 - #if($errorMessage) 214 - {{error}}{{html}}$errorMessage{{/html}}{{/error}} 292 + #if ($action == 'save') 293 + #if ($errorMessage) 294 + {{html clean="false"}} 295 + <div class="box errormessage">$errorMessage</div> 296 + {{/html}} 215 215 #else 216 216 ## Redirect to view mode. 217 217 $response.sendRedirect($doc.getURL()) 218 218 #end 219 219 #else 220 - #if($errorMessage) 302 + #if ($errorMessage) 221 221 $response.sendError(400, $errorMessage) 222 222 #else 223 223 $response.setStatus(204) ... ... @@ -227,7 +227,7 @@ 227 227 {{/velocity}} 228 228 229 229 {{velocity}} 230 -#if("$!request.wizard" == 'true') 312 +#if ("$!request.wizard" == 'true') 231 231 {{include reference="AppWithinMinutes.WizardStep" /}} 232 232 #end 233 233 {{/velocity}} ... ... @@ -234,20 +234,20 @@ 234 234 235 235 {{velocity}} 236 236 ## Determine the action button that triggered the request 237 -#set($action = $xcontext.action) 238 -#foreach($paramName in $request.getParameterMap().keySet()) 239 - #if($paramName.startsWith('xaction_')) 240 - #set($action = $paramName.substring(8)) 319 +#set ($action = $xcontext.action) 320 +#foreach ($paramName in $request.getParameterMap().keySet()) 321 + #if ($paramName.startsWith('xaction_')) 322 + #set ($action = $paramName.substring(8)) 241 241 #break 242 242 #end 243 243 #end 244 -#if($action == 'edit') 326 +#if ($action == 'edit') 245 245 #doEdit() 246 -#elseif($action == 'save' || $action == 'saveandcontinue') 247 - #if($services.csrf.isTokenValid($request.form_token)) 328 +#elseif ($action == 'save' || $action == 'saveandcontinue') 329 + #if ($services.csrf.isTokenValid($request.form_token)) 248 248 #doSave() 249 249 #else 250 - $response.sendRedirect($services.csrf.getResubmissionURL()) ;332 + $response.sendRedirect($services.csrf.getResubmissionURL()) 251 251 #end 252 252 #end 253 253 {{/velocity}}
- XWiki.JavaScriptExtension[0]
-
- Code
-
... ... @@ -61,7 +61,7 @@ 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); ... ... @@ -126,10 +126,10 @@ 126 126 if (!form) { 127 127 return false; 128 128 } 129 - // Let the sheet handle the form submit. 130 - // NOTE: Thecodethat handlesSave&ContinueusesthisURLto make theAJAXrequest and Firefox 3.6doesn'tresolve131 - // the e mptystringtothecurrentpageURL so wehavetoexplicitlyspecify it.132 - form.action = window.location.href;129 + // Let the sheet handle the form submit. The form is submitted by default to the preview action which dispatches the 130 + // request to the save action if the save button is detected on the request parameters. By submitting to the edit 131 + // action the edit sheet is evaluated and thus it can handle the save by itself. 132 + form.action = XWiki.currentDocument.getURL('edit'); 133 133 134 134 // Apply the vertical form layout standard. 135 135 form.addClassName('xform');
- XWiki.StyleSheetExtension[0]
-
- Code
-
... ... @@ -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 {