Changes for page Message Sender Macro

Last modified by Ludovic Dubost on 2024/07/22 15:51

From version 1.1
edited by Ludovic Dubost
on 2014/03/30 19:46
Change comment: Imported from XAR
To version 7.1
edited by Ludovic Dubost
on 2018/12/09 12:24
Change comment: Install extension [org.xwiki.platform:xwiki-platform-messagestream-ui/10.10]

Summary

Details

XWiki.JavaScriptExtension[0]
Code
... ... @@ -1,41 +5,6 @@
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();
... ... @@ -43,30 +43,30 @@
43 43   prepareTargetInput : function(event, element) {
44 44   var targetType = element.options[element.selectedIndex].value;
45 45   element.className = targetType;
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();
51 - }
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();
11 + var messageStream = element.up('.messagestream');
12 + var targetInputContainer = messageStream.down('.message-target-' + targetType);
13 + if (!targetInputContainer) {
14 + targetInputContainer = messageStream.down('.message-target-default');
61 61   }
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 + });
62 62   },
63 63   enhanceSelect: function () {
64 64   $$('.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 - }
70 70   element.observe('change', this.prepareTargetInput.bindAsEventListener(this, element));
71 71   this.prepareTargetInput(null, element);
72 72   }.bind(this));
XWiki.StyleSheetExtension[0]
Code
... ... @@ -1,30 +3,12 @@
1 -#template('colorThemeInit.vm')
2 -
3 3  .messagestream-tools {
2 + display: flex;
4 4   position: relative;
5 - margin: 2px 0;
4 + margin: .5em 0 1em;
6 6  }
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 -}
23 23  .messagestream select {
24 - padding: .2em;
25 25   width: auto;
26 26  }
27 -.messagestream input.targetName {
28 - margin-right: .3em;
29 - width: auto;
9 +.messagestream .message-target {
10 + flex-grow: 1;
11 + margin-left: .3em;
30 30  }
Content Type
... ... @@ -1,0 +1,1 @@
1 +CSS
Parse content
... ... @@ -1,1 +1,1 @@
1 -Yes
1 +No
XWiki.WikiMacroClass[0]
Macro code
... ... @@ -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($xcontext.userReference, 'default'))
12 -
13 13  #set ($activityActionsMap = {
14 14   'publicMessage': 'icons/silk/user_comment.png',
15 15   'personalMessage': 'icons/silk/user_comment.png',
... ... @@ -140,13 +140,13 @@
140 140   #if (!$defaultTarget)
141 141   #if ($doc.getObject('XWiki.XWikiGroups'))
142 142   #set ($defaultTarget = 'group')
143 - #set ($targetName = $doc.prefixedFullName)
140 + #set ($targetName = $doc.fullName)
144 144   #elseif ($doc.getObject('XWiki.XWikiUsers'))
145 - #if ($doc.prefixedFullName == $currentUser)
142 + #if ($doc.documentReference == $xcontext.userReference)
146 146   #set ($defaultTarget = 'followers')
147 147   #else
148 148   #set ($defaultTarget = 'user')
149 - #set ($targetName = $doc.prefixedFullName)
146 + #set ($targetName = $doc.fullName)
150 150   #end
151 151   #else
152 152   #set ($defaultTarget = 'everyone')
... ... @@ -159,16 +159,31 @@
159 159   #end
160 160   </select>
161 161   </label>
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)
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
171 171   #end
181 + <div class="message-target message-target-default">
182 + <input type="hidden" name="targetName" value="$!escapetool.xml($targetName)" class="targetName" />
183 + </div>
172 172   </div>
173 173   <div class='messagestream-buttons'>
174 174   <span class='butonwrapper'><input type='submit' value="$services.localization.render('xe.activity.messages.submit')" class='button'#if($inEditMode) disabled='disabled'#end/></span>