Changes for page Message Sender Macro
Last modified by Ludovic Dubost on 2024/07/22 15:51
From version 7.1
edited by Ludovic Dubost
on 2018/12/09 12:24
on 2018/12/09 12:24
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-messagestream-ui/10.10]
Summary
-
Objects (3 modified, 0 added, 0 removed)
Details
- XWiki.JavaScriptExtension[0]
-
- Code
-
... ... @@ -1,6 +1,41 @@ 1 +#set ($userSuggestScope = 'local') 2 +#if ($services.workspace && $services.workspace.isWorkspace($xcontext.database)) 3 + #set ($userSuggestScope = 'global') 4 +#end 1 1 var XWiki = (function (XWiki) { 2 2 // 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 + 3 3 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 + }, 4 4 initialize : function() { 5 5 this.prepareForms(); 6 6 this.enhanceSelect(); ... ... @@ -8,30 +8,30 @@ 8 8 prepareTargetInput : function(event, element) { 9 9 var targetType = element.options[element.selectedIndex].value; 10 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'); 15 - } 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 - }); 46 + if (!element.__targetNameInput) {return;} 47 + if (this.targetsWithName.indexOf(targetType) < 0) { 48 + element.__targetNameInput.addClassName('hidden'); 49 + if (element.__targetNameInput.__x_suggest) { 50 + element.__targetNameInput.__x_suggest.detach(); 30 30 } 31 - }); 52 + } else { 53 + // Focus the text input so that the place-holder value is cleared if present. Otherwise the user picker will treat 54 + // the place-holder value as if it was typed by the user and will automatically select the corresponding suggestion. 55 + element.__targetNameInput.removeClassName('hidden').activate(); 56 + // Defer the creation of the user picker to allow the focus listeners to be called first (in order to clear the 57 + // place-holder value). 58 + this.suggestParameters[targetType] && function() { 59 + new CustomUserPicker(element.__targetNameInput, this.suggestParameters[targetType]); 60 + }.bind(this).defer(); 61 + } 32 32 }, 33 33 enhanceSelect: function () { 34 34 $$('.messagestream select[name="visibilityLevel"]').each(function(element) { 65 + element.addClassName(element.options[element.selectedIndex].value); 66 + element.__targetNameInput = element.up('.messagestream').down('input[name="targetName"]'); 67 + if (element.__targetNameInput && this.targetsWithName.indexOf(element.options[element.selectedIndex].value) < 0) { 68 + element.__targetNameInput.addClassName('hidden'); 69 + } 35 35 element.observe('change', this.prepareTargetInput.bindAsEventListener(this, element)); 36 36 this.prepareTargetInput(null, element); 37 37 }.bind(this));
- XWiki.StyleSheetExtension[0]
-
- Code
-
... ... @@ -1,12 +1,30 @@ 1 +#template('colorThemeInit.vm') 2 + 1 1 .messagestream-tools { 2 - display: flex; 3 3 position: relative; 4 - margin: .5em01em;5 + margin: 2px 0; 5 5 } 7 +.messagestream-tools .accepted-suggestions { 8 + display: inline; 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; 16 +} 17 +.messagestream-tools .accepted-suggestions .target-user { 18 + background-image: url("$xwiki.getSkinFile('icons/silk/user.png')"); 19 +} 20 +.messagestream-tools .accepted-suggestions .target-group { 21 + background-image: url("$xwiki.getSkinFile('icons/silk/group.png')"); 22 +} 6 6 .messagestream select { 24 + padding: .2em; 7 7 width: auto; 8 8 } 9 -.messagestream . message-target {10 - flex-grow:1;11 - margin-left:.3em;27 +.messagestream input.targetName { 28 + margin-right: .3em; 29 + width: auto; 12 12 } - Parse content
-
... ... @@ -1,1 +1,1 @@ 1 - No1 +Yes - Content Type
-
... ... @@ -1,1 +1,0 @@ 1 -CSS
- XWiki.WikiMacroClass[0]
-
- Macro code
-
... ... @@ -5,8 +5,11 @@ 5 5 ## ------------------------------------------------------------- 6 6 #set ($config = 'XWiki.MessageStreamConfig') 7 7 #set ($configClass = $xwiki.getDocument($config).getxWikiClass()) 8 -#set ($isMessageStreamActive = $services.messageStream.isActive()) 8 +#set ($configObj = $xwiki.getDocument($config).getObject($config)) 9 +#set ($isMessageStreamActive = ("$configObj.getProperty('active').value" == '1')) 9 9 11 +#set ($currentUser = $services.model.serialize($xcontext.userReference, 'default')) 12 + 10 10 #set ($activityActionsMap = { 11 11 'publicMessage': 'icons/silk/user_comment.png', 12 12 'personalMessage': 'icons/silk/user_comment.png', ... ... @@ -137,13 +137,13 @@ 137 137 #if (!$defaultTarget) 138 138 #if ($doc.getObject('XWiki.XWikiGroups')) 139 139 #set ($defaultTarget = 'group') 140 - #set ($targetName = $doc.fullName) 143 + #set ($targetName = $doc.prefixedFullName) 141 141 #elseif ($doc.getObject('XWiki.XWikiUsers')) 142 - #if ($doc.d ocumentReference== $xcontext.userReference)145 + #if ($doc.prefixedFullName == $currentUser) 143 143 #set ($defaultTarget = 'followers') 144 144 #else 145 145 #set ($defaultTarget = 'user') 146 - #set ($targetName = $doc.fullName) 149 + #set ($targetName = $doc.prefixedFullName) 147 147 #end 148 148 #else 149 149 #set ($defaultTarget = 'everyone') ... ... @@ -156,31 +156,16 @@ 156 156 #end 157 157 </select> 158 158 </label> 159 - #set ($suggestPickerParams = { 160 - 'name': 'targetName', 161 - 'title': $services.localization.render('xe.activity.messages.visibility.targetName.tip') 162 - }) 163 - #foreach ($target in ['user', 'group']) 164 - #if ($possibleTargets.contains($target)) 165 - #set ($notDefaultTarget = $target != $defaultTarget) 166 - <div class="message-target message-target-$target#if ($notDefaultTarget) hidden#end"> 167 - #set ($discard = $suggestPickerParams.put('class', 'targetName')) 168 - #set ($suggestPickerParams.disabled = $inEditMode || $notDefaultTarget) 169 - #set ($suggestPickerParams.value = $targetName) 170 - #if ($notDefaultTarget) 171 - #set ($suggestPickerParams.value = '') 172 - #end 173 - #if ($target == 'user') 174 - #userPicker(false, $suggestPickerParams) 175 - #else 176 - #groupPicker(false, $suggestPickerParams) 177 - #end 178 - </div> 179 - #end 162 + <label for="targetName$!{targetNameCounter}"> 163 + <span class='hidden'>Name:</span> 164 + <input type="text" name="targetName" id="targetName$!targetNameCounter" class="targetName withTip useTitleAsTip" value="$!targetName" size="15" 165 + title="$services.localization.render('xe.activity.messages.visibility.targetName.tip')" #if ($inEditMode) disabled="disabled"#end/> 166 + </label> 167 + #if (!$targetNameCounter) 168 + #set ($targetNameCounter = 1) 169 + #else 170 + #set ($targetNameCounter = $targetNameCounter + 1) 180 180 #end 181 - <div class="message-target message-target-default"> 182 - <input type="hidden" name="targetName" value="$!escapetool.xml($targetName)" class="targetName" /> 183 - </div> 184 184 </div> 185 185 <div class='messagestream-buttons'> 186 186 <span class='butonwrapper'><input type='submit' value="$services.localization.render('xe.activity.messages.submit')" class='button'#if($inEditMode) disabled='disabled'#end/></span>