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
Change comment: Install extension [org.xwiki.platform:xwiki-platform-messagestream-ui/10.10]
To version 6.1
edited by Ludovic Dubost
on 2018/11/30 15:24
Change comment: Migrated property [async_enabled] from class [XWiki.WikiMacroClass]

Summary

Details

XWiki.JavaScriptExtension[0]
Code
... ... @@ -1,6 +1,41 @@
1 +#set ($userSuggestScope = 'local')
2 +#if ($services.wiki.user && $services.wiki.user.userScope != "LOCAL_ONLY")
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,29 @@
1 +#template('colorThemeInit.vm')
2 +
1 1  .messagestream-tools {
2 - display: flex;
3 3   position: relative;
4 4   margin: .5em 0 1em;
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 {
7 7   width: auto;
8 8  }
9 -.messagestream .message-target {
10 - flex-grow: 1;
11 - margin-left: .3em;
26 +.messagestream input.targetName {
27 + margin-right: .3em;
28 + width: auto;
12 12  }
Parse content
... ... @@ -1,1 +1,1 @@
1 -No
1 +Yes
XWiki.WikiMacroClass[0]
Macro code
... ... @@ -7,6 +7,8 @@
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 +
10 10  #set ($activityActionsMap = {
11 11   'publicMessage': 'icons/silk/user_comment.png',
12 12   'personalMessage': 'icons/silk/user_comment.png',
... ... @@ -32,6 +32,8 @@
32 32  ##
33 33  ## Skin Extensions
34 34  ##--------------------------------------------------------------
37 +#set ($discard = $xwiki.jsfx.use('uicomponents/suggest/suggestPicker.js'))
38 +#set ($discard = $xwiki.jsfx.use('uicomponents/widgets/userpicker/userPicker.js'))
35 35  #set ($discard = $xwiki.ssx.use('Main.Activity'))
36 36  #set ($discard = $xwiki.ssx.use('Main.MessageSenderMacro'))
37 37  #set ($discard = $xwiki.jsx.use('Main.MessageSenderMacro'))
... ... @@ -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)
144 + #set ($targetName = $doc.prefixedFullName)
141 141   #elseif ($doc.getObject('XWiki.XWikiUsers'))
142 - #if ($doc.documentReference == $xcontext.userReference)
146 + #if ($doc.prefixedFullName == $currentUser)
143 143   #set ($defaultTarget = 'followers')
144 144   #else
145 145   #set ($defaultTarget = 'user')
146 - #set ($targetName = $doc.fullName)
150 + #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
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)
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>