Depuis la version 1.1 >
modifié par Administrator
sur 2013/06/04 10:06
À la version < 5.1 >
modifié par superadmin
sur 2019/10/13 21:35
>
Commentaire de modification : Install extension [org.xwiki.platform:xwiki-platform-messagestream-ui/11.8.1]

Résumé

Détails

Icon Propriétés de la Page
Auteur du document
... ... @@ -1,1 +1,1 @@
1 -XWiki.Admin
1 +XWiki.superadmin
Masqué
... ... @@ -1,1 +1,1 @@
1 -false
1 +true
Icon 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));
Icon 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: 2px 0;
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
Icon 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 activityUser xform'>
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='activityContent'>
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>

Actualités

Annonce

Journal

Branches

Maîtrise
Compas
PioCas
Scouts
LouJa
Farfadet

photos

Groupe

Branches

Portrait

Admin

Pédagogie

Cahier de Chant

















contact

This wiki is licensed under a Creative Commons 2.0 license
XWiki 13.10 - Documentation - Conditions