Modifications pour le document Message Sender Macro
Modifié par superadmin le 2021/12/12 21:56
modifié par Administrator
sur 2013/06/04 10:06
sur 2013/06/04 10:06
Commentaire de modification :
Install extension [org.xwiki.platform:xwiki-platform-messagestream-ui/11.8.1]
Résumé
Détails
- Propriétés de la Page
-
- Auteur du document
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. Admin1 +XWiki.superadmin - Masqué
-
... ... @@ -1,1 +1,1 @@ 1 - false1 +true
- XWiki.JavaScriptExtension[0]
-
- Code
-
... ... @@ -1,74 +5,37 @@ 1 -#set ($userSuggestScope = 'local') 2 -#if ($services.workspace && $services.workspace.isWorkspace($xcontext.database)) 3 - #set ($userSuggestScope = 'global') 4 -#end 5 5 var XWiki = (function (XWiki) { 6 6 // Start XWiki augmentation. 7 -/** 8 - * Extends the UserPicker in order to display the selected user/group inline after the target text input. 9 - */ 10 -var CustomUserPicker = Class.create(XWiki.widgets.UserPicker, { 11 - // @Override 12 - _createSelectionManager: function($super, options) { 13 - var selectionManager = $super(Object.extend(options, { 14 - listInsertionPosition : 'after', 15 - acceptFreeText : false 16 - })); 17 - // Overwrite the way the selected item is displayed. 18 - selectionManager.displayItem = function(suggestion) { 19 - var targetInfo = new Element('span').update(suggestion.info).insert(this.createDeleteTool()); 20 - var targetClass = this.suggest.sources[0].script.indexOf('uorg=group') > 0 ? 'target-group' : 'target-user'; 21 - return new Element('li', {'class': targetClass}).insert(targetInfo).insert(this.createItemInput(suggestion)); 22 - }.bind(selectionManager); 23 - return selectionManager; 24 - } 25 -}); 26 - 27 27 XWiki.MessageStream = Class.create({ 28 - targetsWithName : ['user', 'group'], 29 - suggestParameters : { 30 - user : { 31 - script: '$doc.getURL("get", "xpage=uorgsuggest&uorg=user&wiki=${userSuggestScope}")&', 32 - noresults: "$escapetool.javascript($services.localization.render('core.widgets.userPicker.noResults'))" 33 - }, 34 - group : { 35 - script: "$doc.getURL('get', 'xpage=uorgsuggest&uorg=group')&", 36 - noresults: "$escapetool.javascript($services.localization.render('core.widgets.groupPicker.noResults'))" 37 - } 38 - }, 39 39 initialize : function() { 40 40 this.prepareForms(); 41 41 this.enhanceSelect(); 42 42 }, 43 43 prepareTargetInput : function(event, element) { 44 - if (event) { 45 - element.blur(); 46 - } 47 - $w(element.className).each(function(classname) { 48 - element.removeClassName(classname) 49 - }); 50 50 var targetType = element.options[element.selectedIndex].value; 51 - element.addClassName(targetType); 52 - if (!element.__targetNameInput) {return;} 53 - if (this.targetsWithName.indexOf(targetType) < 0) { 54 - element.__targetNameInput.addClassName('hidden'); 55 - if (element.__targetNameInput.__x_suggest) { 56 - element.__targetNameInput.__x_suggest.detach(); 57 - } 58 - } else { 59 - element.__targetNameInput.removeClassName('hidden'); 60 - if (this.suggestParameters[targetType]) { 61 - new CustomUserPicker(element.__targetNameInput, this.suggestParameters[targetType]); 62 - } 10 + element.className = targetType; 11 + var messageStream = element.up('.messagestream'); 12 + var targetInputContainer = messageStream.down('.message-target-' + targetType); 13 + if (!targetInputContainer) { 14 + targetInputContainer = messageStream.down('.message-target-default'); 63 63 } 16 + messageStream.select('.message-target').forEach(function(messageTargetContainer) { 17 + var fields = messageTargetContainer.select('input, select, textarea'); 18 + if (messageTargetContainer === targetInputContainer) { 19 + messageTargetContainer.removeClassName('hidden'); 20 + fields.forEach(function(field) { 21 + field.enable(); 22 + field.hasClassName('selectized') && field.selectize.enable(); 23 + }); 24 + } else { 25 + messageTargetContainer.addClassName('hidden'); 26 + fields.forEach(function(field) { 27 + field.disable(); 28 + field.hasClassName('selectized') && field.selectize.disable(); 29 + }); 30 + } 31 + }); 64 64 }, 65 65 enhanceSelect: function () { 66 66 $$('.messagestream select[name="visibilityLevel"]').each(function(element) { 67 - element.addClassName(element.options[element.selectedIndex].value); 68 - element.__targetNameInput = element.up('.messagestream').down('input[name="targetName"]'); 69 - if (element.__targetNameInput && this.targetsWithName.indexOf(element.options[element.selectedIndex].value) < 0) { 70 - element.__targetNameInput.addClassName('hidden'); 71 - } 72 72 element.observe('change', this.prepareTargetInput.bindAsEventListener(this, element)); 73 73 this.prepareTargetInput(null, element); 74 74 }.bind(this));
- XWiki.StyleSheetExtension[0]
-
- Code
-
... ... @@ -1,30 +1,48 @@ 1 1 #template('colorThemeInit.vm') 2 2 3 3 .messagestream-tools { 4 + display: flex; 4 4 position: relative; 5 - margin: 2px0;6 + margin: .5em 0 1em; 6 6 } 7 -.messagestream -tools.accepted-suggestions{8 - display:inline;8 +.messagestream select { 9 + width: auto; 9 9 } 10 -.messagestream-tools .accepted-suggestions .target-user, 11 -.messagestream-tools .accepted-suggestions .target-group { 12 - background: none no-repeat scroll left center transparent; 13 - display: inline-block; 14 - margin-right: 1em; 15 - padding: 0 1px 0 18px; 11 +.messagestream .message-target { 12 + flex-grow: 1; 13 + margin-left: .3em; 16 16 } 17 -.messagestream-tools .accepted-suggestions .target-user { 18 - background-image: url("$xwiki.getSkinFile('icons/silk/user.png')"); 15 + 16 +.messagestream .message-content { 17 + padding: .5em 0 .5em 75px; 19 19 } 20 -.messagestream-tools .accepted-suggestions .target-group { 21 - background-image: url("$xwiki.getSkinFile('icons/silk/group.png')"); 19 + 20 +.messagestream .activitySnapshot { 21 + height: 30px; 22 + margin: 5px 0 0 -50px; 23 + position: absolute; 22 22 } 23 -.messagestream select { 24 - padding: .2em; 25 - width: auto; 25 + 26 +.messagestream .activitySnapshot img { 27 + border-radius: 10px 10px 0 10px; 28 + box-shadow: -1px 1px 1px rgba(128,128,128,0.6); 26 26 } 27 -.messagestream input.targetName { 28 - margin-right: .3em; 29 - width: auto; 30 + 31 +/* User's avatar */ 32 +.messagestream .activitySnapshot .avatar { 33 + border-radius: 4px; 34 + box-shadow: 0 0 2px 1px rgba(128,128,128,0.6); 30 30 } 36 + 37 +.messagestream .activitySnapshot .activityActionAvatar { 38 + background: $theme.pageContentBackgroundColor; 39 + border-color: $theme.pageContentBackgroundColor; 40 + border-style: solid; 41 + border-width: 4px 1px 1px 3px; 42 + box-sizing: content-box; 43 + bottom: -5px; 44 + height: 16px; 45 + position: absolute; 46 + right: -10px; 47 + width: 16px; 48 +} - Content Type
-
... ... @@ -1,0 +1,1 @@ 1 +CSS
- XWiki.WikiMacroClass[0]
-
- Code de la macro
-
... ... @@ -5,11 +5,8 @@ 5 5 ## ------------------------------------------------------------- 6 6 #set ($config = 'XWiki.MessageStreamConfig') 7 7 #set ($configClass = $xwiki.getDocument($config).getxWikiClass()) 8 -#set ($configObj = $xwiki.getDocument($config).getObject($config)) 9 -#set ($isMessageStreamActive = ("$configObj.getProperty('active').value" == '1')) 8 +#set ($isMessageStreamActive = $services.messageStream.isActive()) 10 10 11 -#set ($currentUser = $services.model.serialize($context.userReference, 'default')) 12 - 13 13 #set ($activityActionsMap = { 14 14 'publicMessage': 'icons/silk/user_comment.png', 15 15 'personalMessage': 'icons/silk/user_comment.png', ... ... @@ -35,7 +35,6 @@ 35 35 ## 36 36 ## Skin Extensions 37 37 ##-------------------------------------------------------------- 38 -#set ($discard = $xwiki.ssx.use('Main.Activity')) 39 39 #set ($discard = $xwiki.ssx.use('Main.MessageSenderMacro')) 40 40 #set ($discard = $xwiki.jsx.use('Main.MessageSenderMacro')) 41 41 {{/velocity}} ... ... @@ -42,7 +42,7 @@ 42 42 43 43 {{velocity}} 44 44 #if ($isMessageStreamActive) 45 - #set ($xredirect = $doc.getURL($context.action, $!{request.queryString})) 41 + #set ($xredirect = $doc.getURL($xcontext.action, $!{request.queryString})) 46 46 #set ($errorMessageKeyPrefix = "messageSender.post.error.") 47 47 #set ($errorMessage = $request.session.getAttribute("${errorMessageKeyPrefix}${xredirect}")) 48 48 #if ("$!errorMessage" != '') ... ... @@ -55,47 +55,52 @@ 55 55 ## 56 56 #elseif ("$!{request.xaction}" != '') 57 57 #if ("$!{request.xaction}" == 'postMessage') 58 - #set ($message = "$!{request.messagestream_message.trim()}") 59 - #if ($message == '') 60 - ## Do nothing with empty messages 61 - #if ("$!{request.xredirect}" != '') 62 - $response.sendRedirect(${request.xredirect}) 63 - #end 54 + #if(!$services.csrf.isTokenValid(${request.form_token})) 55 + #set($redirectURL = $services.csrf.getResubmissionURL()) 56 + $response.sendRedirect($redirectURL) 64 64 #else 65 - #set ($success = false) 66 - #if (!$isGuest) 67 - #set ($messageType = "$!{request.visibilityLevel}") 68 - #if ($messageType == 'everyone') 69 - #set ($success = $services.messageStream.postPublicMessage($message)) 70 - #elseif ($messageType == 'followers') 71 - #set ($success = $services.messageStream.postPersonalMessage($message)) 72 - #elseif ($messageType == 'group') 73 - #set ($success = $services.messageStream.postMessageToGroup($message, $services.model.resolveDocument("$!{request.targetName}"))) 74 - #elseif ($messageType == 'user') 75 - #set ($success = $services.messageStream.postDirectMessageToUser($message, $services.model.resolveDocument("$!{request.targetName}"))) 58 + #set ($message = "$!{request.messagestream_message.trim()}") 59 + #if ($message == '') 60 + ## Do nothing with empty messages 61 + #if ("$!{request.xredirect}" != '') 62 + $response.sendRedirect(${request.xredirect}) 76 76 #end 77 - #end 78 - #if (!$success) 79 - #if ($request.xpage == 'plain') 80 - #if ($isGuest) 81 - $response.setStatus(401)## Unauthorized 64 + #else 65 + #set ($success = false) 66 + #if (!$isGuest) 67 + #set ($messageType = "$!{request.visibilityLevel}") 68 + #if ($messageType == 'everyone') 69 + #set ($success = $services.messageStream.postPublicMessage($message)) 70 + #elseif ($messageType == 'followers') 71 + #set ($success = $services.messageStream.postPersonalMessage($message)) 72 + #elseif ($messageType == 'group') 73 + #set ($success = $services.messageStream.postMessageToGroup($message, $services.model.resolveDocument("$!{request.targetName}"))) 74 + #elseif ($messageType == 'user') 75 + #set ($success = $services.messageStream.postDirectMessageToUser($message, $services.model.resolveDocument("$!{request.targetName}"))) 76 + #end 77 + #end 78 + #if (!$success) 79 + #if ($request.xpage == 'plain') 80 + #if ($isGuest) 81 + $response.setStatus(401)## Unauthorized 82 + #else 83 + $response.setStatus(403)## Forbidden 84 + #end 85 + $services.localization.render('xe.activity.messages.submit.failed') 86 + #elseif ("$!{request.xredirect}" != '') 87 + ## Pass the error message in the xredirect so that we display it in the calling page and not in the macro page. 88 + $request.session.setAttribute("${errorMessageKeyPrefix}${request.xredirect}", $services.localization.render('xe.activity.messages.submit.failed')) 89 + $response.sendRedirect($request.xredirect) 82 82 #else 83 - $response.setStatus(403)## Forbidden 91 + {{error}}$services.localization.render('xe.activity.messages.submit.failed'){{/error}} 92 + 84 84 #end 85 - $services.localization.render('xe.activity.messages.submit.failed') 86 86 #elseif ("$!{request.xredirect}" != '') 87 - ## Pass the error message in the xredirect so that we display it in the calling page and not in the macro page. 88 - $request.session.setAttribute("${errorMessageKeyPrefix}${request.xredirect}", $services.localization.render('xe.activity.messages.submit.failed')) 89 - $response.sendRedirect($request.xredirect) 90 - #else 91 - {{error}}$services.localization.render('xe.activity.messages.submit.failed'){{/error}} 92 - 95 + $response.sendRedirect(${request.xredirect}) 96 + #elseif ($request.xpage == 'plain') 97 + ## Just print something for confirmation. 98 + $services.localization.render('xe.activity.messages.submit.success') 93 93 #end 94 - #elseif ("$!{request.xredirect}" != '') 95 - $response.sendRedirect(${request.xredirect}) 96 - #elseif ($request.xpage == 'plain') 97 - ## Just print something for confirmation. 98 - $services.localization.render('xe.activity.messages.submit.success') 99 99 #end 100 100 #end 101 101 #end ... ... @@ -109,48 +109,44 @@ 109 109 #set ($actionQueryString = "xredirect=$escapetool.url($xredirect)") 110 110 {{html}} 111 111 ## Wrap the form in a div so that the layout is preserved in inline mode (where the form is stripped by the rendering). 112 - <div class='messagestream activityUserxform'>113 + <div class='messagestream xform'> 113 113 #if (!$inEditMode) 114 114 <form action="${xwiki.getURL('Main.MessageSenderMacro', 'view', $!{actionQueryString})}" method='post'> 115 115 #end 116 - <div class='ac tivityContent'>117 + <div class='message-content'> 117 117 #if(!$inEditMode) 118 - <input type='hidden' name='xaction' value='postMessage' /> 119 + ## CSRF prevention 120 + <input type="hidden" name="form_token" value="$!{services.csrf.getToken()}" /> 121 + <input type='hidden' name='xaction' value='postMessage' /> 119 119 #end 120 - #activitySnapshot($context.user, 'personalMessage') 123 + #activitySnapshot($xcontext.user, 'personalMessage') 121 121 <div class='messagestream-data'> 122 122 <textarea name='messagestream_message' rows='3' cols='40'#if($inEditMode) disabled='disabled'#end></textarea> 123 123 </div> 124 124 <div class='messagestream-tools'> 125 - #set ($targetClassName = '') 126 - ## 127 - #set ($possibleTargets = $context.macro.params.get('visibilityOptions').split('\s*,\s*')) 128 + #set ($possibleTargets = $xcontext.macro.params.get('visibilityOptions').split('\s*,\s*')) 128 128 #if (!$possibleTargets) 129 129 #set ($possibleTargets = $configClass.get('visibilityLevel').getListValues()) 130 130 #end 131 131 ## 132 - #set ($targetName = $context.macro.params.get('visibilityParameter')) 133 + #set ($targetName = $xcontext.macro.params.get('visibilityParameter')) 133 133 ## 134 - #set ($defaultTarget = $context.macro.params.get('visibility')) 135 + #set ($defaultTarget = $xcontext.macro.params.get('visibility')) 135 135 #if (!$defaultTarget) 136 136 #if ($doc.getObject('XWiki.XWikiGroups')) 137 137 #set ($defaultTarget = 'group') 138 - #set ($targetName = $doc. prefixedFullName)139 + #set ($targetName = $doc.fullName) 139 139 #elseif ($doc.getObject('XWiki.XWikiUsers')) 140 - #if ($doc. prefixedFullName == $currentUser)141 + #if ($doc.documentReference == $xcontext.userReference) 141 141 #set ($defaultTarget = 'followers') 142 142 #else 143 143 #set ($defaultTarget = 'user') 144 - #set ($targetName = $doc. prefixedFullName)145 + #set ($targetName = $doc.fullName) 145 145 #end 146 146 #else 147 147 #set ($defaultTarget = 'everyone') 148 148 #end 149 149 #end 150 - #if (!$targetName) 151 - #set ($targetName = ${services.localization.render('xe.activity.messages.visibility.targetName.tip')}) 152 - #set ($targetClassName = 'withTip') 153 - #end 154 154 <label>$services.localization.render('xe.activity.messages.visibility') 155 155 <select name='visibilityLevel'#if($inEditMode) disabled='disabled'#end> 156 156 #foreach ($target in $possibleTargets) ... ... @@ -158,15 +158,31 @@ 158 158 #end 159 159 </select> 160 160 </label> 161 - <label for="targetName$!{targetNameCounter}"> 162 - <span class='hidden'>Name:</span> 163 - <input type='text' name='targetName' id="targetName$!{targetNameCounter}" class="targetName $!{targetClassName}" value="$!{targetName}" size='15'#if($inEditMode) disabled='disabled'#end/> 164 - </label> 165 - #if (!$targetNameCounter) 166 - #set ($targetNameCounter = 1) 167 - #else 168 - #set ($targetNameCounter = $targetNameCounter + 1) 158 + #set ($suggestPickerParams = { 159 + 'name': 'targetName', 160 + 'title': $services.localization.render('xe.activity.messages.visibility.targetName.tip') 161 + }) 162 + #foreach ($target in ['user', 'group']) 163 + #if ($possibleTargets.contains($target)) 164 + #set ($notDefaultTarget = $target != $defaultTarget) 165 + <div class="message-target message-target-$target#if ($notDefaultTarget) hidden#end"> 166 + #set ($discard = $suggestPickerParams.put('class', 'targetName')) 167 + #set ($suggestPickerParams.disabled = $inEditMode || $notDefaultTarget) 168 + #set ($suggestPickerParams.value = $targetName) 169 + #if ($notDefaultTarget) 170 + #set ($suggestPickerParams.value = '') 171 + #end 172 + #if ($target == 'user') 173 + #userPicker(false, $suggestPickerParams) 174 + #else 175 + #groupPicker(false, $suggestPickerParams) 176 + #end 177 + </div> 178 + #end 169 169 #end 180 + <div class="message-target message-target-default"> 181 + <input type="hidden" name="targetName" value="$!escapetool.xml($targetName)" class="targetName" /> 182 + </div> 170 170 </div> 171 171 <div class='messagestream-buttons'> 172 172 <span class='butonwrapper'><input type='submit' value="$services.localization.render('xe.activity.messages.submit')" class='button'#if($inEditMode) disabled='disabled'#end/></span>