Changes for page Office Importer

From version 2.1
edited by Nazzareno Pompei
on 28/10/2022 08:43
Change comment: Install extension [org.xwiki.platform:xwiki-platform-office-ui/14.9]
To version 3.1
edited by Nazzareno Pompei
on 30/01/2023 10:31
Change comment: Install extension [org.xwiki.platform:xwiki-platform-office-ui/14.10.3]

Summary

Details

Page properties
Content
... ... @@ -1,144 +1,294 @@
1 -{{velocity}}
2 -#set($displayDocExtra = false)
3 -#if ($isguest)
4 - {{error}}$services.localization.render('xe.officeimporter.notallowed'){{/error}}
5 -#elseif (!$services.officemanager.isConnected())
6 - #if ($hasAdmin)
7 - {{error}}$services.localization.render('xe.officeimporter.error.adminuser', ['[[', '>>http://extensions.xwiki.org/xwiki/bin/Extension/Office%20Importer%20Application]]']){{/error}}
8 - #else
9 - {{error}}$services.localization.render('xe.officeimporter.error.normaluser'){{/error}}
10 - #end
11 -#elseif("$!request.page" == '')
12 - ## This page does not propose to select the target page anymore. We redirect to the create action instead
13 - ## Note: we make the URL from the main page and not from the current one. Because the user have probably not the
14 - ## create right on the "XWiki" space, and this space should be reserved for technical usage.
15 -  {{error}}$services.localization.render('office.form.error.noDocument', ['[[', ">>path:$xwiki.getURL($services.wiki.currentWikiDescriptor.mainPageReference, 'create', 'type=office')]]"]){{/error}}
16 -#else
1 +{{velocity output="false"}}
2 +#macro (officeImporterForm)
17 17   #set ($targetReference = $services.model.resolveDocument($request.page))
18 - #set ($targetDoc = $xwiki.getDocument($targetReference))
4 + #set ($targetPageIsNested = $targetReference.name == $services.model.getEntityReference('DOCUMENT', 'default').name)
5 + #set ($discard = $xwiki.ssx.use('XWiki.OfficeImporter'))
19 19   #set ($discard = $xwiki.jsx.use('XWiki.OfficeImporter'))
20 - #set ($discard = $xwiki.jsfx.use('uicomponents/widgets/validation/livevalidation_prototype.js'))
21 - #set ($discard = $xwiki.ssfx.use('uicomponents/widgets/validation/livevalidation.css', true))
22 -
23 -{{html}}
24 -<form action="$xwiki.getURL('XWiki.OfficeImporterResults','view')" enctype="multipart/form-data" method="post" class="xform" id="officeImportForm">
25 - <dl class="row">
26 - ##
27 - ## Left part
28 - ##
29 - <div class="col-xs-12 col-md-6">
7 + {{html clean="false"}}
8 + <form id="officeImportForm" class="xform" method="post" enctype="multipart/form-data"
9 + action="$escapetool.xml($xwiki.getURL('XWiki.OfficeImporterResults'))"
10 + data-progress-message="$escapetool.xml($services.localization.render('office.import.inProgress'))"
11 + data-done-message="$escapetool.xml($services.localization.render('office.import.done'))"
12 + data-failed-message="$escapetool.xml($services.localization.render('office.import.failed'))">
13 + <fieldset>
14 + <dl class="row">
15 + ##
16 + ## Left part
17 + ##
18 + <div class="col-xs-12 col-md-6">
19 + #officeImporterForm_officeDocument()
20 + #officeImporterForm_targetPage()
21 + #if ($xwiki.exists($targetReference))
22 + #officeImporterForm_overwriteContent()
23 + #end
24 + </div>
25 + ##
26 + ## Right part
27 + ##
28 + <div class="col-xs-12 col-md-6">
29 + #officeImporterForm_filterStyles()
30 + #officeImporterForm_splitDocument()
31 + #officeImporterForm_headingLevelsToSplit()
32 + #officeImporterForm_childPagesNamingMethod()
33 + #officeImporterForm_terminalChildPages()
34 + </div>
35 + </dl>
30 30   ##
31 - ## Document
37 + ## Hidden inputs
32 32   ##
33 - <dt>
34 - <label for="filepath">$escapetool.xml($services.localization.render('xe.officeimporter.import.document'))</label>
35 - </dt>
36 - <dd class="buttonwrapper">
37 - <input id="filepath" type="file" name="filePath" value="" size="40" class="button secondary" />
38 - </dd>
39 + <input type="hidden" name="form_token" value="$!escapetool.xml($services.csrf.token)" />
40 + ## Normalize the parent reference of the new document so that even in a subwiki it points to the current wiki.
41 + #set ($normalizedParentReference = $services.model.resolveDocument("$!request.parent", 'current'))
42 + <input type="hidden" name="parent" value="$escapetool.xml($normalizedParentReference)" />
43 + <input type="hidden" name="target" value="$escapetool.xml($services.model.serialize($targetReference,
44 + 'default'))" />
39 39   ##
40 - ## Target
46 + ## Form action buttons
41 41   ##
42 - <dt>
43 - <label>Target</label>
44 - </dt>
45 - <dd>
46 - #template('hierarchy_macros.vm')
47 - #hierarchy($targetReference)
48 - </dd>
49 - ##
50 - ## Append result
51 - ##
52 - #if (!$targetDoc.isNew())
53 - <dt class="warningmessage">
54 - <label for="appendContentInputId">$escapetool.xml($services.localization.render('xe.officeimporter.import.appendresult'))</label>
55 - <span class="xHint">$escapetool.xml($services.localization.render('office.form.append.hint'))</span>
56 - </dt>
57 - <dd class="warningmessage">
58 - <input id="appendContentInputId" name="appendContent" type="checkbox" value="true" />
59 - </dd>
60 - #end
48 + <div class="buttons">
49 + <span class="buttonwrapper">
50 + <button id="submit">
51 + $escapetool.xml($services.localization.render('xe.officeimporter.import.import'))
52 + </button>
53 + </span>
54 + <span class="buttonwrapper">
55 + <a class="secondary button" href="$escapetool.xml($xwiki.getURL($targetReference))">
56 + $escapetool.xml($services.localization.render('cancel'))
57 + </a>
58 + </span>
59 + </div>
60 + </fieldset>
61 + </form>
62 + {{/html}}
63 +#end
64 +
65 +#macro (officeImporterForm_officeDocument)
66 + ## FIXME: The following list of file name extensions and media types are duplicated from the office resource reference
67 + ## picker (templates/html_displayer/officeresourcereference/edit.vm).
68 + #set ($officeFileNameExtensions = $stringtool.join([
69 + '.doc', '.docx',
70 + '.xls', '.xlsx',
71 + '.ppt', '.pptx',
72 + '.odt', '.ott', '.fodt',
73 + '.ods', '.ots', '.fods',
74 + '.odp', '.otp', '.fodp',
75 + '.sxw', '.sxc', '.sxi'
76 + ], ','))
77 + #set ($officeMediaTypes = $stringtool.join([
78 + 'application/msword', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint',
79 + 'application/vnd.oasis.opendocument.',
80 + 'application/vnd.openxmlformats-officedocument.',
81 + 'application/vnd.sun.xml.'
82 + ], ','))
83 + <dt>
84 + <label for="filePath">
85 + $escapetool.xml($services.localization.render('xe.officeimporter.import.document'))
86 + </label>
87 + <span class="xHint">
88 + $escapetool.xml($services.localization.render('office.import.document.hint'))
89 + </span>
90 + </dt>
91 + <dd class="buttonwrapper">
92 + <input type="file" id="filePath" name="filePath" value="" size="40" class="button secondary" required
93 + accept="$escapetool.xml("$officeFileNameExtensions,$officeMediaTypes")" />
94 + </dd>
95 +#end
96 +
97 +#macro (officeImporterForm_targetPage)
98 + <dt>
99 + <label>
100 + $escapetool.xml($services.localization.render('xe.officeimporter.import.target'))
101 + </label>
102 + <span class="xHint">
103 + $escapetool.xml($services.localization.render('office.import.target.hint'))
104 + </span>
105 + </dt>
106 + <dd>
107 + #template('hierarchy_macros.vm')
108 + #hierarchy($targetReference)
109 + </dd>
110 +#end
111 +
112 +#macro (officeImporterForm_overwriteContent)
113 + <dt class="box warningmessage">
114 + <label>
115 + <input name="overwriteContent" type="checkbox" value="true" checked />
116 + $escapetool.xml($services.localization.render('office.import.overwriteContent'))
117 + </label>
118 + <span class="xHint">
119 + $escapetool.xml($services.localization.render('office.import.overwriteContent.hint'))
120 + </span>
121 + </dt>
122 + <dd>
123 + #officeImporterForm_confirmationModal({
124 + 'cssClass': 'confirmation-overwriteContent',
125 + 'title': 'office.import.overwriteContent',
126 + 'message': 'office.import.overwriteContent.confirmationMessage',
127 + 'action': 'office.import.overwriteContent.confirmationAction'
128 + })
129 + </dd>
130 +#end
131 +
132 +#macro (officeImporterForm_confirmationModal $config)
133 + <div class="confirmation modal fade $!escapetool.xml($config.cssClass)" tabindex="-1" role="dialog">
134 + <div class="modal-dialog">
135 + <div class="modal-content">
136 + <div class="modal-header">
137 + <button type="button" class="close" data-dismiss="modal">&times;</button>
138 + <div class="modal-title">
139 + $escapetool.xml($services.localization.render($config.title))
140 + </div>
141 + </div>
142 + <div class="modal-body">
143 + $escapetool.xml($services.localization.render($config.message))
144 + </div>
145 + <div class="modal-footer">
146 + <input type="button" class="btn btn-danger" data-dismiss="modal"
147 + value="$escapetool.xml($services.localization.render($config.action))">
148 + <input type="button" class="btn btn-default" data-dismiss="modal"
149 + value="$escapetool.xml($services.localization.render('cancel'))">
150 + </div>
151 + </div>
61 61   </div>
62 - ##
63 - ## Right part
64 - ##
65 - <div class="col-xs-12 col-md-6">
66 - ##
67 - ## Styles
68 - ##
69 - <dt>
70 - <label for="filterStylesInputId">$escapetool.xml($services.localization.render('xe.officeimporter.import.filterstyles'))</label>
71 - <span class="xHint">$escapetool.xml($services.localization.render('xe.officeimporter.import.help.styles'))</span>
72 - </dt>
73 - <dd>
74 - <input id="filterStylesInputId" name="filterStyles" type="checkbox" value="strict" checked="checked"/>
75 - </dd>
76 - ##
77 - ## Splitting
78 - ##
79 - <dt>
80 - <label for="splitDocumentInputId">$escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.splitdocument'))</label>
81 - <span class="xHint">$escapetool.xml($services.localization.render('xe.officeimporter.import.help.splitting'))</span>
82 - </dt>
83 - <dd>
84 - <input id="splitDocumentInputId" name="splitDocument" type="checkbox" value="true"/>
85 - </dd>
86 - ##
87 - ## Heading level splits
88 - ##
89 - <dt>
90 - <label for="headingLevelsToSplitInputId" class="multipleselect">$escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.headinglevels'))</label>
91 - </dt>
92 - <dd>
93 - <select id="headingLevelsToSplitInputId" size="5" multiple="multiple" name="headingLevelsToSplit">
94 - #foreach($h in [1..6])
95 - <option value="${h}"#if ($foreach.count == 1) selected="selected"#end>$escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.heading'))-${h}</option>
96 - #end
97 - </select>
98 - </dd>
99 - ##
100 - ## Child pages naming method:
101 - ##
102 - #if ($targetDoc.documentReference.name == 'WebHome')
103 - ## When the target page is not terminal, the only logical strategy to use is "headingNames". It creates pages
104 - ## as children of the target, which seems to be the correct way in the nested pages paradigm.
105 -  ## The other choices have no sense:
106 - ## - "mainPageNameAndHeading" will create pages called "WebHome-Title1" instead of "targetDoc/Title1".
107 - ## - "mainPageNameAndNumbering" will create pages called "WebHome-1" instead of "targetDoc/1".
108 - ## In both cases, the "WebHome" part of the names are meaningless.
109 - ##
110 - ## NOTE: The created children are terminal until https://jira.xwiki.org/browse/XWIKI-12569 is fixed.
111 - <input type="hidden" name="childPagesNamingMethod" value="headingNames" />
112 - #else
113 - <dt>
114 - <label for="childPagesNamingMethodInputId">$escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.naming'))</label>
115 - </dt>
116 - <dd>
117 - <select id="childPagesNamingMethodInputId" name="childPagesNamingMethod">
118 - <option value="headingNames">$escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.naming.headingnames'))</option>
119 - <option value="mainPageNameAndHeading">$escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.naming.mainpagenameandheading'))</option>
120 - <option value="mainPageNameAndNumbering">$escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.naming.mainpagenameandnumbering'))</option>
121 - </select>
122 - </dd>
153 + </div>
154 +#end
155 +
156 +#macro (officeImporterForm_filterStyles)
157 + <dt>
158 + <label>
159 + <input name="filterStyles" type="checkbox" value="strict" checked />
160 + $escapetool.xml($services.localization.render('xe.officeimporter.import.filterstyles'))
161 + </label>
162 + <span class="xHint">
163 + $escapetool.xml($services.localization.render('xe.officeimporter.import.help.styles'))
164 + </span>
165 + </dt>
166 + <dd></dd>
167 +#end
168 +
169 +#macro (officeImporterForm_splitDocument)
170 + <dt>
171 + <label>
172 + <input name="splitDocument" type="checkbox" value="true" />
173 + $escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.splitdocument'))
174 + </label>
175 + <span class="xHint">
176 + $escapetool.xml($services.localization.render('xe.officeimporter.import.help.splitting'))
177 + </span>
178 + </dt>
179 + <dd></dd>
180 +#end
181 +
182 +#macro (officeImporterForm_headingLevelsToSplit)
183 + <dt>
184 + <label for="headingLevelsToSplitInputId">
185 + $escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.headinglevels'))
186 + </label>
187 + <span class="xHint">
188 + $escapetool.xml($services.localization.render('office.import.headingLevelsToSplit.hint'))
189 + </span>
190 + </dt>
191 + <dd>
192 + <select id="headingLevelsToSplitInputId" name="headingLevelsToSplit" multiple required size="6"
193 + class="splitDocument-setting">
194 + #foreach ($level in [1..6])
195 + <option value="$level"#if ($level == 1) selected#end>
196 + $escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.heading')) $level
197 + </option>
123 123   #end
124 - </div>
125 - </dl>
126 - <div class="clearfloats"></div>
127 - ##
128 - ## Hidden inputs
129 - ##
130 - <input type="hidden" name="form_token" value="$!{services.csrf.getToken()}" />
131 - ## Normalize the parent reference of the new document so that even in a subwiki it points to the current wiki
132 - #set ($normalizedParentReference = $services.model.resolveDocument("$!request.parent", 'current'))
133 - <input type="hidden" name="parent" value="$normalizedParentReference" />
134 - <input type="hidden" name="target" value="$escapetool.xml($services.model.serialize($targetReference, 'default'))" id="target"/>
135 - ##
136 - ## Confirm button
137 - ##
138 - <span class="buttonwrapper">
139 - <input type="submit" value="$services.localization.render('xe.officeimporter.import.import')" class="button" id="submit"/>
140 - </span>
141 -</form>
142 -{{/html}}
199 + </select>
200 + </dd>
143 143  #end
202 +
203 +#macro (officeImporterForm_childPagesNamingMethod)
204 + ## Hide the field when the target page is nested (not terminal) because the only logical strategy in this case is to
205 + ## use "headingNames". It creates pages as children of the target, which seems to be the correct way in the nested
206 + ## pages paradigm. The other choices have no sense:
207 + ## - "mainPageNameAndHeading" will create pages called "WebHome-Title1" instead of "targetPage/Title1".
208 + ## - "mainPageNameAndNumbering" will create pages called "WebHome-1" instead of "targetPage/1".
209 + ## In both cases, the "WebHome" part of the names is meaningless.
210 + <dt#if ($targetPageIsNested) hidden#end>
211 + <label for="childPagesNamingMethodInputId">
212 + $escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.naming'))
213 + </label>
214 + <span class="xHint">
215 + $escapetool.xml($services.localization.render('office.import.childPagesNaming.hint'))
216 + </span>
217 + </dt>
218 + <dd>
219 + <select id="childPagesNamingMethodInputId" name="childPagesNamingMethod" class="splitDocument-setting"
220 + #if ($targetPageIsNested) hidden#end>
221 + <option value="headingNames"#if ($targetPageIsNested) selected#end>
222 + $escapetool.xml($services.localization.render('xe.officeimporter.import.splitting.naming.headingnames'))
223 + </option>
224 + <option value="mainPageNameAndHeading"#if (!$targetPageIsNested) selected#end>
225 + $escapetool.xml($services.localization.render(
226 + 'xe.officeimporter.import.splitting.naming.mainpagenameandheading'))
227 + </option>
228 + <option value="mainPageNameAndNumbering">
229 + $escapetool.xml($services.localization.render(
230 + 'xe.officeimporter.import.splitting.naming.mainpagenameandnumbering'))
231 + </option>
232 + </select>
233 + </dd>
234 +#end
235 +
236 +#macro (officeImporterForm_terminalChildPages)
237 + #set ($hidden = !($targetPageIsNested && ($isAdvancedUser || $isSuperAdmin)))
238 + <dt#if ($hidden) hidden#end>
239 + <label>
240 + <input type="checkbox" name="terminalChildPages" value="true"#if ($hidden) checked#end
241 + class="splitDocument-setting" />
242 + $escapetool.xml($services.localization.render('office.import.terminalChildPages'))
243 + </label>
244 + <span class="xHint">
245 + $escapetool.xml($services.localization.render('office.import.terminalChildPages.hint'))
246 + </span>
247 + </dt>
248 + <dd></dd>
249 +#end
250 +
251 +#macro (officeImporter_translationWithLink $key $linkTarget)
252 + #set ($targetSyntax = 'xwiki/2.1')
253 + #set ($translation = $services.localization.render($key, $targetSyntax, ['LINKSTART', 'LINKEND']))
254 + #set ($linkLabel = $stringtool.substringBetween($translation, 'LINKSTART', 'LINKEND'))
255 + #if ($linkLabel)
256 + #set ($escapedLinkLabel = $services.rendering.escape($linkLabel, $targetSyntax))
257 + #set ($escapedLinkTarget = $services.rendering.escape($linkTarget, $targetSyntax))
258 + $translation.replace("LINKSTART${linkLabel}LINKEND", "[[$escapedLinkLabel>>$escapedLinkTarget]]")
259 + #else
260 + $services.localization.render($key, $targetSyntax, ['', ''])
261 + #end
262 +#end
144 144  {{/velocity}}
264 +
265 +{{velocity}}
266 +#if ("$!request.page" == '')
267 + {{error}}
268 + ## This page does not propose to select the target page anymore. The create action should be used instead.
269 + ## Note: The link points to the main page because the user might not have create right on the current "XWiki" space,
270 + ## which is reserved anyway for technical pages.
271 + #set ($createURL = $xwiki.getURL($services.wiki.currentWikiDescriptor.mainPageReference, 'create', 'type=office'))
272 + #officeImporter_translationWithLink('office.form.error.noDocument' "path:$createURL")
273 + {{/error}}
274 +#else
275 + ## Hide UI elements that are not needed for office import.
276 + #set ($displayContentMenu = false)
277 + #set ($displayContentFooter = false)
278 + #set ($displayDocExtra = false)
279 + #if ($isguest)
280 + {{error}}$services.localization.render('xe.officeimporter.notallowed', 'xwiki/2.1'){{/error}}
281 + #elseif (!$services.officemanager.isConnected())
282 + #if ($hasAdmin)
283 + {{error}}
284 + #set ($documentationURL = 'http://extensions.xwiki.org/xwiki/bin/Extension/Office%20Importer%20Application')
285 + #officeImporter_translationWithLink('xe.officeimporter.error.adminuser' $documentationURL)
286 + {{/error}}
287 + #else
288 + {{error}}$services.localization.render('xe.officeimporter.error.normaluser', 'xwiki/2.1'){{/error}}
289 + #end
290 + #else
291 + #officeImporterForm()
292 + #end
293 +#end
294 +{{/velocity}}
XWiki.JavaScriptExtension[0]
Code
... ... @@ -1,59 +1,80 @@
1 -require(['jquery'], function($) {
2 - $(function() {
1 +require(['jquery', 'bootstrap'], function($) {
2 + /**
3 + * Enable/disable the split document settings based on the value of the split document checkbox.
4 + */
5 + const maybeDisableSplitDocumentSettings = function() {
6 + const splitDocumentDisabled = !$('input[name=splitDocument]').prop('checked');
7 + $('.splitDocument-setting').prop('disabled', splitDocumentDisabled);
8 + };
3 3  
4 - // Add a validator on the document input
5 - var documentValidator = new LiveValidation($('#filepath')[0], {
6 - validMessage: "$services.localization.render('core.validation.valid.message')"
7 - });
8 - documentValidator.displayMessageWhenEmpty = true;
9 - documentValidator.add(Validate.Custom, {
10 - failureMessage: "$services.localization.render('core.validation.required.message')",
11 - against: function(value) {
12 - return typeof value === 'string' && value.strip().length > 0;
13 - }
14 - });
10 + // Initalize the default state.
11 + maybeDisableSplitDocumentSettings();
15 15  
16 - /**
17 - * Enable/disable the split option depending of the value of the split document checkbox
18 - */
19 - var maybeDisableSplitOptions = function () {
20 - var splitOptionsDisabled = !$('#splitDocumentInputId').prop('checked');
21 - $('#headingLevelsToSplitInputId').prop('disabled', splitOptionsDisabled);
22 - $('#childPagesNamingMethodInputId').prop('disabled', splitOptionsDisabled);
23 - }
13 + // Enable/disable the split document settings when the checkbox's value changes.
14 + $('input[name=splitDocument]').on('change', maybeDisableSplitDocumentSettings);
24 24  
25 - // Initalize the default state
26 - maybeDisableSplitOptions();
16 + /**
17 + * Handle form submit.
18 + */
19 + $('#officeImportForm').on('submit', function(event) {
20 + event.preventDefault();
27 27  
28 - // Enable/disable the split options when the checkbox's value changes
29 - $('#splitDocumentInputId').on('change', maybeDisableSplitOptions);
22 + const overwriteContentCheckbox = $('input[name=overwriteContent]');
23 + if (!overwriteContentCheckbox.prop('checked') || overwriteContentCheckbox.data('confirmed')) {
24 + importOfficeDocument($(event.target));
25 + } else {
26 + // Ask for confirmation to overwrite the content of the target page.
27 + $('.modal.confirmation-overwriteContent').modal();
28 + }
29 + });
30 30  
31 - /**
32 - * Event sent when the form is submitted
33 - */
34 - $('#officeImportForm').on('submit', function(event) {
35 - // Verify that the target document does not already exist
36 - var appendContentCheckbox = $('#appendContentInputId');
37 - if (appendContentCheckbox.length == 0 || appendContentCheckbox.prop('checked')) {
38 - // Except if the "append content" checkbox is enabled or if it is not present!
39 - return true;
40 - }
31 + $('.modal.confirmation-overwriteContent .btn-danger').on('click', function(event) {
32 + // Remember the confirmation.
33 + $('input[name=overwriteContent]').data('confirmed', true);
34 + // Re-submit the form.
35 + $('#officeImportForm #submit').click();
36 + });
41 41  
42 - // The document exist
43 - new XWiki.widgets.ConfirmationBox({
44 - onYes: function() {
45 - // Enable the append result checkbox
46 - $('#appendContentInputId').prop('checked', true);
47 - // Re-send the formular
48 - $('#submit').click();
49 - }
50 - }, {
51 - confirmationText: "$escapetool.javascript($services.localization.render('platform.office.importDocumentOverwriteConfirmation'))"
52 - });
53 -
54 - return false;
38 + const importOfficeDocument = function(form) {
39 + // Collect the form data before disabling the form.
40 + const formData = new FormData(form[0]);
41 + // Disable the form while the office document is being imported (to prevent the form from being re-submitted).
42 + form.children('fieldset').prop('disabled', true);
43 + // Let the user know that the import is in progress.
44 + $('body').css('cursor', 'wait');
45 + const notification = new XWiki.widgets.Notification(form.data('progressMessage'), 'inprogress');
46 + // Send the office import request.
47 + fetch(new XWiki.Document('OfficeImporterResults', 'XWiki').getURL('get'), {
48 + method: 'POST',
49 + body: formData
50 + }).then(
51 + response => response.text()
52 + ).then(html => {
53 + if (html.indexOf('infomessage') > 0) {
54 + // Office import successful.
55 + notification.replace(new XWiki.widgets.Notification(form.data('doneMessage'), 'done'));
56 + // Redirect to the target page.
57 + const targetPageReference = XWiki.Model.resolve(formData.get('target'), XWiki.EntityType.DOCUMENT,
58 + XWiki.currentDocument.documentReference);
59 + window.location.href = new XWiki.Document(targetPageReference).getURL();
60 + } else {
61 + // Extract the error message from the returned HTML.
62 + const errorMessage = $('<div></div>').html(html).text();
63 + return Promise.reject(errorMessage);
64 + }
65 + }).catch(error => {
66 + let failedMessage = form.data('failedMessage');
67 + if (error) {
68 + failedMessage += `: ${error}`;
69 + }
70 + notification.replace(new XWiki.widgets.Notification(failedMessage, 'error'));
71 + }).finally(() => {
72 + // Re-enable the office import.
73 + form.children('fieldset').prop('disabled', false);
74 + $('body').css('cursor', '');
55 55   });
76 + };
56 56  
57 - });
78 + // Everything is ready.
79 + $('#officeImportForm #submit').attr('data-ready', true);
58 58  });
59 -
Parse content
... ... @@ -1,1 +1,1 @@
1 -Yes
1 +No
XWiki.StyleSheetExtension[0]
Caching policy
... ... @@ -1,0 +1,1 @@
1 +long
Code
... ... @@ -1,0 +1,4 @@
1 +.xdocLastModification,
2 +#hierarchy.breadcrumb {
3 + display: none;
4 +}
Use this extension
... ... @@ -1,0 +1,1 @@
1 +onDemand
Parse content
... ... @@ -1,0 +1,1 @@
1 +No
Content Type
... ... @@ -1,0 +1,1 @@
1 +LESS