Changes for page Message Sender Macro

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

From version 6.1
edited by Ludovic Dubost
on 2018/11/30 15:24
Change comment: Migrated property [async_enabled] from class [XWiki.WikiMacroClass]
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.wiki.user && $services.wiki.user.userScope != "LOCAL_ONLY")
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,29 +3,12 @@
1 -#template('colorThemeInit.vm')
2 -
3 3  .messagestream-tools {
2 + display: flex;
4 4   position: relative;
5 5   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 24   width: auto;
25 25  }
26 -.messagestream input.targetName {
27 - margin-right: .3em;
28 - width: auto;
9 +.messagestream .message-target {
10 + flex-grow: 1;
11 + margin-left: .3em;
29 29  }
Parse content
... ... @@ -1,1 +1,1 @@
1 -Yes
1 +No
XWiki.WikiMacroClass[0]
Macro code
... ... @@ -7,8 +7,6 @@
7 7  #set ($configClass = $xwiki.getDocument($config).getxWikiClass())
8 8  #set ($isMessageStreamActive = $services.messageStream.isActive())
9 9  
10 -#set ($currentUser = $services.model.serialize($xcontext.userReference, 'default'))
11 -
12 12  #set ($activityActionsMap = {
13 13   'publicMessage': 'icons/silk/user_comment.png',
14 14   'personalMessage': 'icons/silk/user_comment.png',
... ... @@ -34,8 +34,6 @@
34 34  ##
35 35  ## Skin Extensions
36 36  ##--------------------------------------------------------------
37 -#set ($discard = $xwiki.jsfx.use('uicomponents/suggest/suggestPicker.js'))
38 -#set ($discard = $xwiki.jsfx.use('uicomponents/widgets/userpicker/userPicker.js'))
39 39  #set ($discard = $xwiki.ssx.use('Main.Activity'))
40 40  #set ($discard = $xwiki.ssx.use('Main.MessageSenderMacro'))
41 41  #set ($discard = $xwiki.jsx.use('Main.MessageSenderMacro'))
... ... @@ -141,13 +141,13 @@
141 141   #if (!$defaultTarget)
142 142   #if ($doc.getObject('XWiki.XWikiGroups'))
143 143   #set ($defaultTarget = 'group')
144 - #set ($targetName = $doc.prefixedFullName)
140 + #set ($targetName = $doc.fullName)
145 145   #elseif ($doc.getObject('XWiki.XWikiUsers'))
146 - #if ($doc.prefixedFullName == $currentUser)
142 + #if ($doc.documentReference == $xcontext.userReference)
147 147   #set ($defaultTarget = 'followers')
148 148   #else
149 149   #set ($defaultTarget = 'user')
150 - #set ($targetName = $doc.prefixedFullName)
146 + #set ($targetName = $doc.fullName)
151 151   #end
152 152   #else
153 153   #set ($defaultTarget = 'everyone')
... ... @@ -160,16 +160,31 @@
160 160   #end
161 161   </select>
162 162   </label>
163 - <label for="targetName$!{targetNameCounter}">
164 - <span class='hidden'>Name:</span>
165 - <input type="text" name="targetName" id="targetName$!targetNameCounter" class="targetName withTip useTitleAsTip" value="$!targetName" size="15"
166 - title="$services.localization.render('xe.activity.messages.visibility.targetName.tip')" #if ($inEditMode) disabled="disabled"#end/>
167 - </label>
168 - #if (!$targetNameCounter)
169 - #set ($targetNameCounter = 1)
170 - #else
171 - #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
172 172   #end
181 + <div class="message-target message-target-default">
182 + <input type="hidden" name="targetName" value="$!escapetool.xml($targetName)" class="targetName" />
183 + </div>
173 173   </div>
174 174   <div class='messagestream-buttons'>
175 175   <span class='butonwrapper'><input type='submit' value="$services.localization.render('xe.activity.messages.submit')" class='button'#if($inEditMode) disabled='disabled'#end/></span>