redmine_apijs 6.8.0 → 6.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README +8 -11
- data/app/controllers/apijs_controller.rb +47 -47
- data/app/views/application/_browser.html.erb +1 -1
- data/app/views/attachments/_links.html.erb +4 -4
- data/app/views/settings/_apijs.html.erb +6 -4
- data/assets/javascripts/apijs-redmine.js +12 -8
- data/assets/javascripts/apijs-redmine.min.js +2 -2
- data/assets/javascripts/apijs-redmine.min.js.map +1 -1
- data/assets/javascripts/apijs.min.js +3 -3
- data/assets/javascripts/apijs.min.js.map +1 -1
- data/assets/stylesheets/apijs-print.min.css +2 -2
- data/assets/stylesheets/apijs-print.min.css.map +1 -1
- data/assets/stylesheets/apijs-redmine-rtl.min.css +1 -1
- data/assets/stylesheets/apijs-redmine-rtl.min.css.map +1 -1
- data/assets/stylesheets/apijs-redmine.css +1 -1
- data/assets/stylesheets/apijs-redmine.min.css +1 -1
- data/assets/stylesheets/apijs-redmine.min.css.map +1 -1
- data/assets/stylesheets/apijs-screen-rtl.min.css +3 -3
- data/assets/stylesheets/apijs-screen-rtl.min.css.map +1 -1
- data/assets/stylesheets/apijs-screen.min.css +3 -3
- data/assets/stylesheets/apijs-screen.min.css.map +1 -1
- data/config/locales/cs.yml +1 -1
- data/config/locales/de.yml +1 -1
- data/config/locales/el.yml +1 -1
- data/config/locales/es.yml +1 -1
- data/config/locales/hu.yml +1 -1
- data/config/locales/it.yml +1 -1
- data/config/locales/ja.yml +1 -1
- data/config/locales/nl.yml +1 -1
- data/config/locales/pl.yml +1 -1
- data/config/locales/pt-BR.yml +1 -1
- data/config/locales/pt.yml +1 -1
- data/config/locales/ro.yml +1 -1
- data/config/locales/ru.yml +1 -1
- data/config/locales/sk.yml +1 -1
- data/config/locales/tr.yml +15 -15
- data/config/locales/uk.yml +1 -1
- data/config/locales/zh.yml +1 -1
- data/config/routes.rb +1 -1
- data/init.rb +28 -8
- data/lib/apijs_attachment.rb +4 -4
- data/lib/apijs_files.rb +1 -1
- data/lib/image.py +121 -21
- data/lib/redmine_apijs.rb +35 -12
- data/lib/useragentparser.rb +9 -9
- data/redmine_apijs.gemspec +2 -4
- metadata +5 -6
- data/lib/apijs_const.rb +0 -35
- data/lib/video.py +0 -80
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad479f065bce700e905afbde81433399e3553180dd4f68825f0622bc013febcf
|
4
|
+
data.tar.gz: ce1bb1461d6916a90369942accb642b9bc807ec54e4176c72d2d171d80c938af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a961ca3b0cba87bdb12230296a4297484d84c196a30397e100b9ac318f1e1a80fb90ebae080647c1c5003a91ca410865ac755eb5e6d3dfc1756ba30c49ab77a5
|
7
|
+
data.tar.gz: 29ff0f6a059c802279f78609cd56bfad3a475a641e999cd44d1a8c450a638eed71e2eee02b05254ac8325a58d57d0115d0486f48d7cd9423869ae48b5f5c7782
|
data/README
CHANGED
@@ -3,16 +3,13 @@ Tracker : https://github.com/luigifab/redmine-apijs
|
|
3
3
|
Rubygems : https://rubygems.org/gems/redmine_apijs
|
4
4
|
Plugin : Luigifab/Apijs
|
5
5
|
License : GNU GPL 2+ (https://opensource.org/licenses/gpl-2.0)
|
6
|
-
Copyright : 2008-
|
6
|
+
Copyright : 2008-2022 Fabrice Creuzot (luigifab) <code~luigifab~fr>
|
7
7
|
|
8
8
|
|
9
9
|
|
10
10
|
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
IF YOU FOUND A MISTAKE OR A BUG, PLEASE, CONTACT ME (IN FRENCH OR IN ENGLISH) AT code~luigifab~fr
|
12
|
+
IF YOU FOUND A MISTAKE OR A BUG, PLEASE CONTACT ME (IN FRENCH OR IN ENGLISH).
|
16
13
|
CSS AND JS FILES ARE MINIFIED WITH clean-css (github.com/jakubpawlowicz/clean-css) AND uglify-js (github.com/mishoo/uglifyjs).
|
17
14
|
ALL FILES (INCLUDING DOCUMENTATION AND TRANSLATIONS) ARE LICENSED UNDER THE TERMS OF THE GNU GPL 2+ LICENSE.
|
18
15
|
THAT BEING SAID SOME FILES COME FROM OTHER PROJECTS AND ARE UNDER OTHER LICENSES (SEE AT THE END OF THIS FILE).
|
@@ -37,7 +34,7 @@ Translations in de-DE (deutsch/Deutschland) by:
|
|
37
34
|
- Philip Junietz <info~label-park~com> 2016
|
38
35
|
- Pamela Steinborn <st.pamela~laposte~net> 2016
|
39
36
|
Translations in en-US (english/United-States) by:
|
40
|
-
- Fabrice Creuzot (luigifab) <code~luigifab~fr> 2008-
|
37
|
+
- Fabrice Creuzot (luigifab) <code~luigifab~fr> 2008-2022
|
41
38
|
- Brian Legrand <mrbibi1987~gmail~com> 2012
|
42
39
|
- Pascale Scellier <scellier.pascale~orange~fr> 2016
|
43
40
|
Translations in es-ES (español/España) by:
|
@@ -47,7 +44,7 @@ Translations in es-ES (español/España) by:
|
|
47
44
|
- Hélène Vergine <vergineh~gmail~com> 2017, 2020
|
48
45
|
- Guillaume Genetet <genetet.incorporated~gmail~com> 2018 https://fr.tipeee.com/william-broome
|
49
46
|
Translations in fr-FR (français/France) by:
|
50
|
-
- Fabrice Creuzot (luigifab) <code~luigifab~fr> 2008-
|
47
|
+
- Fabrice Creuzot (luigifab) <code~luigifab~fr> 2008-2022
|
51
48
|
- Pascale Scellier <scellier.pascale~orange~fr> 2016
|
52
49
|
Translations in it-IT (italiano/Italia) by:
|
53
50
|
- Maria Grasso <mgrasso~outlook~fr> 2016-2017
|
@@ -57,15 +54,15 @@ Translations in pt-PT (português/Portugal) by:
|
|
57
54
|
Translations in ru-RU (русский/Россия) by:
|
58
55
|
- Eugene Parfenov (igro) <admin~mytona~com>
|
59
56
|
Translations in tr-TR (türkçe/Türkiye) by:
|
60
|
-
- Adnan Topcu <adnan~topcu~name>
|
57
|
+
- Adnan Topcu <adnan~topcu~name> 2022
|
61
58
|
|
62
59
|
If you like, take some of your time to improve the translations, go to https://bit.ly/2HyCCEc
|
63
60
|
|
64
61
|
|
65
62
|
File: /lib/useragentparser.rb
|
66
|
-
Source: https://github.com/donatj/PhpUserAgent + https://gist.github.com/luigifab/19a68d9aa98fa80f2961809d7cec59c0 (1.
|
67
|
-
Copyright: 2013-
|
68
|
-
Copyright: 2019-
|
63
|
+
Source: https://github.com/donatj/PhpUserAgent + https://gist.github.com/luigifab/19a68d9aa98fa80f2961809d7cec59c0 (1.6.1-fork1)
|
64
|
+
Copyright: 2013-2022 Jesse G. Donat <donatj~gmail~com>
|
65
|
+
Copyright: 2019-2022 Fabrice Creuzot (luigifab) <code~luigifab~fr>
|
69
66
|
License: MIT (https://opensource.org/licenses/mit)
|
70
67
|
|
71
68
|
Files: /assets/fonts/apijs/fontello.woff /assets/fonts/apijs/fontello.woff2
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# Created J/12/12/2013
|
3
|
-
# Updated
|
3
|
+
# Updated M/05/07/2022
|
4
4
|
#
|
5
|
-
# Copyright 2008-
|
5
|
+
# Copyright 2008-2022 | Fabrice Creuzot (luigifab) <code~luigifab~fr>
|
6
6
|
# https://www.luigifab.fr/redmine/apijs
|
7
7
|
#
|
8
8
|
# This program is free software, you can redistribute it or modify
|
@@ -41,13 +41,13 @@ class ApijsController < AttachmentsController
|
|
41
41
|
end
|
42
42
|
|
43
43
|
|
44
|
-
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
44
|
+
## Gestion de l'image miniature (photo ou vidéo)
|
45
|
+
# Vérifie si l'utilisateur a accès au projet avant l'envoi de la miniature
|
46
|
+
# Utilise un script python pour générer l'image thumb (taille 200x150)
|
47
|
+
# Utilise un script python pour générer l'image srcset (taille 400x300)
|
48
|
+
# Utilise un script python pour générer l'image show (taille 1200x900)
|
49
|
+
# Enregistre les commandes et leurs résultats dans le log
|
50
|
+
# Téléchargement d'une image avec mise en cache (inline/stale)
|
51
51
|
def thumb
|
52
52
|
|
53
53
|
source = @attachment.diskfile
|
@@ -101,7 +101,7 @@ class ApijsController < AttachmentsController
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
|
-
#
|
104
|
+
# acl
|
105
105
|
if !User.current.allowed_to?({controller: 'projects', action: 'show'}, @project)
|
106
106
|
deny_access
|
107
107
|
# envoie de l'image avec mise en cache
|
@@ -112,13 +112,13 @@ class ApijsController < AttachmentsController
|
|
112
112
|
end
|
113
113
|
|
114
114
|
|
115
|
-
|
116
|
-
#
|
117
|
-
#
|
118
|
-
#
|
119
|
-
#
|
120
|
-
#
|
121
|
-
#
|
115
|
+
## Gestion de l'image miniature 2x (photo ou vidéo)
|
116
|
+
# Vérifie si l'utilisateur a accès au projet avant l'envoi de l'aperçu
|
117
|
+
# Utilise un script python pour générer l'image srcset (taille 400x300)
|
118
|
+
# Utilise un script python pour générer l'image thumb (taille 200x150)
|
119
|
+
# Utilise un script python pour générer l'image show (taille 1200x900)
|
120
|
+
# Enregistre les commandes et leurs résultats dans le log
|
121
|
+
# Téléchargement d'une image avec mise en cache (inline/stale)
|
122
122
|
def srcset
|
123
123
|
|
124
124
|
source = @attachment.diskfile
|
@@ -172,7 +172,7 @@ class ApijsController < AttachmentsController
|
|
172
172
|
end
|
173
173
|
end
|
174
174
|
|
175
|
-
#
|
175
|
+
# acl
|
176
176
|
if !User.current.allowed_to?({controller: 'projects', action: 'show'}, @project)
|
177
177
|
deny_access
|
178
178
|
# envoie de l'image avec mise en cache
|
@@ -183,11 +183,11 @@ class ApijsController < AttachmentsController
|
|
183
183
|
end
|
184
184
|
|
185
185
|
|
186
|
-
|
187
|
-
#
|
188
|
-
#
|
189
|
-
#
|
190
|
-
#
|
186
|
+
## Gestion de l'image aperçu (photo)
|
187
|
+
# Vérifie si l'utilisateur a accès au projet avant l'envoi de l'aperçu
|
188
|
+
# Utilise un script python pour générer l'image show (taille 1200x900)
|
189
|
+
# Enregistre les commandes et leurs résultats dans le log
|
190
|
+
# Téléchargement d'une image avec mise en cache (inline/stale)
|
191
191
|
def show
|
192
192
|
|
193
193
|
source = @attachment.diskfile
|
@@ -199,7 +199,7 @@ class ApijsController < AttachmentsController
|
|
199
199
|
logger.info 'APIJS::ApijsController#show: ' + cmd + ' (' + `#{cmd}`.gsub(/^\s+|\s+$/, '') + ')'
|
200
200
|
end
|
201
201
|
|
202
|
-
#
|
202
|
+
# acl
|
203
203
|
if !User.current.allowed_to?({controller: 'projects', action: 'show'}, @project)
|
204
204
|
deny_access
|
205
205
|
# envoie de l'image avec mise en cache
|
@@ -210,13 +210,13 @@ class ApijsController < AttachmentsController
|
|
210
210
|
end
|
211
211
|
|
212
212
|
|
213
|
-
|
214
|
-
#
|
215
|
-
#
|
216
|
-
#
|
213
|
+
## Gestion du téléchargement des fichiers
|
214
|
+
# Vérifie si l'utilisateur a accès au projet avant
|
215
|
+
# Téléchargement d'une vidéo en 206 Partial Content (inline)
|
216
|
+
# Téléchargement d'une image avec mise en cache (inline/stale) ou téléchargement d'un fichier (attachment)
|
217
217
|
def download
|
218
218
|
|
219
|
-
#
|
219
|
+
# acl
|
220
220
|
if !User.current.allowed_to?({controller: 'projects', action: 'show'}, @project)
|
221
221
|
deny_access
|
222
222
|
# télachargement d'une vidéo en 206 Partial Content (https://stackoverflow.com/a/7604330 + https://stackoverflow.com/a/16593030)
|
@@ -246,11 +246,11 @@ class ApijsController < AttachmentsController
|
|
246
246
|
if !request.headers['Range']
|
247
247
|
send_file(@attachment.diskfile,
|
248
248
|
filename: filename_for_content_disposition(@attachment.filename),
|
249
|
-
type: @attachment
|
249
|
+
type: detect_content_type(@attachment), disposition: 'inline')
|
250
250
|
else
|
251
251
|
send_data(File.binread(@attachment.diskfile, file_end - file_begin + 1, file_begin),
|
252
252
|
filename: filename_for_content_disposition(@attachment.filename),
|
253
|
-
type: @attachment
|
253
|
+
type: detect_content_type(@attachment), disposition: 'inline', status: '206 Partial Content')
|
254
254
|
end
|
255
255
|
|
256
256
|
response.close
|
@@ -258,32 +258,32 @@ class ApijsController < AttachmentsController
|
|
258
258
|
elsif @attachment.isImage?
|
259
259
|
if stale?(etag: @attachment.diskfile)
|
260
260
|
send_file(@attachment.diskfile, filename: filename_for_content_disposition(@attachment.filename),
|
261
|
-
type: @attachment
|
261
|
+
type: detect_content_type(@attachment), disposition: 'inline')
|
262
262
|
end
|
263
263
|
# fichier
|
264
264
|
else
|
265
265
|
send_file(@attachment.diskfile, filename: filename_for_content_disposition(@attachment.filename),
|
266
|
-
type: @attachment
|
266
|
+
type: detect_content_type(@attachment), disposition: 'attachment')
|
267
267
|
end
|
268
268
|
# téléchargement d'un fichier
|
269
269
|
else
|
270
270
|
@attachment.increment_download if @attachment.container.is_a?(Version) || @attachment.container.is_a?(Project)
|
271
271
|
send_file(@attachment.diskfile, filename: filename_for_content_disposition(@attachment.filename),
|
272
|
-
type: @attachment
|
272
|
+
type: detect_content_type(@attachment), disposition: 'attachment')
|
273
273
|
end
|
274
274
|
end
|
275
275
|
|
276
276
|
|
277
|
-
|
278
|
-
#
|
279
|
-
#
|
280
|
-
#
|
277
|
+
## Modification d'une description ou du nom du fichier
|
278
|
+
# Vérifie si l'utilisateur a accès au projet et à la modification
|
279
|
+
# Renvoie l'id du fichier suivi de la description en cas de modification réussie
|
280
|
+
# Supprime certains caractères de la description avant son enregistrement
|
281
281
|
def editdesc
|
282
282
|
|
283
283
|
@attachment.description = params[:desc].gsub(/["\\\x0]/, '')
|
284
284
|
@attachment.description.strip!
|
285
285
|
|
286
|
-
#
|
286
|
+
# acl
|
287
287
|
if !User.current.allowed_to?({controller: 'projects', action: 'show'}, @project) || !User.current.allowed_to?(:edit_attachments, @project)
|
288
288
|
deny_access
|
289
289
|
# modification
|
@@ -316,7 +316,7 @@ class ApijsController < AttachmentsController
|
|
316
316
|
@attachment.filename = name
|
317
317
|
@attachment.filename.strip!
|
318
318
|
|
319
|
-
#
|
319
|
+
# acl
|
320
320
|
if !User.current.allowed_to?({controller: 'projects', action: 'show'}, @project) || !User.current.allowed_to?(:rename_attachments, @project)
|
321
321
|
deny_access
|
322
322
|
# modification
|
@@ -333,12 +333,12 @@ class ApijsController < AttachmentsController
|
|
333
333
|
end
|
334
334
|
|
335
335
|
|
336
|
-
|
337
|
-
#
|
338
|
-
#
|
336
|
+
## Suppression d'un fichier
|
337
|
+
# Vérifie si l'utilisateur a accès au projet et à la suppresion
|
338
|
+
# Renvoie l'id du fichier suivi en cas de suppression réussie
|
339
339
|
def delete
|
340
340
|
|
341
|
-
#
|
341
|
+
# acl
|
342
342
|
if !User.current.allowed_to?({controller: 'projects', action: 'show'}, @project) || !User.current.allowed_to?(:delete_attachments, @project)
|
343
343
|
deny_access
|
344
344
|
# suppression
|
@@ -358,11 +358,11 @@ class ApijsController < AttachmentsController
|
|
358
358
|
end
|
359
359
|
|
360
360
|
|
361
|
-
|
362
|
-
#
|
361
|
+
## Vide le cache
|
362
|
+
# Si l'utilisateur est admin
|
363
363
|
def clearcache
|
364
364
|
|
365
|
-
#
|
365
|
+
# acl
|
366
366
|
if !User.current.admin?
|
367
367
|
deny_access
|
368
368
|
# suppression
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# Created S/17/08/2019
|
3
3
|
# Updated L/25/05/2020
|
4
4
|
#
|
5
|
-
# Copyright 2008-
|
5
|
+
# Copyright 2008-2022 | Fabrice Creuzot (luigifab) <code~luigifab~fr>
|
6
6
|
# https://www.luigifab.fr/redmine/apijs
|
7
7
|
#
|
8
8
|
# This program is free software, you can redistribute it or modify
|
@@ -1,8 +1,8 @@
|
|
1
1
|
<%
|
2
2
|
# Created L/21/05/2012
|
3
|
-
# Updated J/
|
3
|
+
# Updated J/26/05/2022
|
4
4
|
#
|
5
|
-
# Copyright 2008-
|
5
|
+
# Copyright 2008-2022 | Fabrice Creuzot (luigifab) <code~luigifab~fr>
|
6
6
|
# https://www.luigifab.fr/redmine/apijs
|
7
7
|
#
|
8
8
|
# This program is free software, you can redistribute it or modify
|
@@ -55,8 +55,8 @@ end
|
|
55
55
|
<dl id="attachmentId<%= attachment.id %>">
|
56
56
|
<dt>
|
57
57
|
<a href="<%= (attachment.isVideo?) ? attachment.getDownloadUrl + '?stream=1' : attachment.getShowUrl %>" type="<%= attachment.content_type %>" onclick="return false" id="slideshow.<%= @slideshowi %>.<%= slideshowj %>">
|
58
|
-
<img src="<%= attachment.getThumbUrl %>" srcset="<%= attachment.getSrcsetUrl %> 2x" width="200" height="150" alt=""/>
|
59
|
-
<input type="hidden" value="<%= (setting_show_filename) ? attachment.filename : 'false' %>|<%= (setting_show_exifdate) ? format_time(attachment.created_on) : 'false' %>|<%= h(description) %>"/>
|
58
|
+
<img src="<%= attachment.getThumbUrl %>" srcset="<%= attachment.getSrcsetUrl %> 2x" width="200" height="150" alt="" />
|
59
|
+
<input type="hidden" value="<%= (setting_show_filename) ? attachment.filename : 'false' %>|<%= (setting_show_exifdate) ? format_time(attachment.created_on) : 'false' %>|<%= h(description) %>" />
|
60
60
|
</a>
|
61
61
|
</dt>
|
62
62
|
<dd class="<%= (setting_show_album_infos) ? 'big' : 'one' %>">
|
@@ -1,8 +1,8 @@
|
|
1
1
|
<%
|
2
2
|
# Created J/12/12/2013
|
3
|
-
# Updated
|
3
|
+
# Updated M/05/07/2022
|
4
4
|
#
|
5
|
-
# Copyright 2008-
|
5
|
+
# Copyright 2008-2022 | Fabrice Creuzot (luigifab) <code~luigifab~fr>
|
6
6
|
# https://www.luigifab.fr/redmine/apijs
|
7
7
|
#
|
8
8
|
# This program is free software, you can redistribute it or modify
|
@@ -55,6 +55,8 @@ if File.directory?(File.join(APIJS_ROOT, 'show'))
|
|
55
55
|
end
|
56
56
|
%>
|
57
57
|
|
58
|
+
<input type="text" style="position:absolute; width:5px; opacity:0.01;" onfocus="document.querySelector('.apijs select').focus(); this.remove();" />
|
59
|
+
|
58
60
|
<p style="margin:0.5em 1em; padding:0.5em;">
|
59
61
|
Luigifab/Apijs <%= Redmine::Plugin.find(:redmine_apijs).version %>
|
60
62
|
<span style="float:<%= l(:direction) == 'rtl' ? 'left' : 'right' %>; font-size:11px;"><a href="https://www.redmine.org/plugins/apijs">redmine.org/plugins/apijs</a> | <a href="https://www.luigifab.fr/redmine/apijs">luigifab.fr/redmine/apijs</a> | <a href="https://www.luigifab.fr/apijs">luigifab.fr/apijs</a> | ⚠ IPv6</span>
|
@@ -218,10 +220,10 @@ end
|
|
218
220
|
<p dir="ltr">
|
219
221
|
<label>python / python-pil / python-scour</label>
|
220
222
|
<span class="cmd"><%= raw Attachment.new.getProgramVersions(
|
221
|
-
'(jpg jpeg gif png..., <a href="https://pillow.readthedocs.io/en/latest/">docs</a>)',
|
223
|
+
'(jpg jpeg gif png webp..., <a href="https://pillow.readthedocs.io/en/latest/">docs</a>)',
|
222
224
|
'(svg, <a href="https://github.com/scour-project/scour/wiki/Documentation">docs</a>)') %></span>
|
223
225
|
<em class="info">python3 .../redmine_apijs/lib/image.py .../xyz.jpg .../xyz.jpg 200 150 90 2>&1</em>
|
224
|
-
<em class="info">python3 .../redmine_apijs/lib/
|
226
|
+
<em class="info">python3 .../redmine_apijs/lib/image.py .../xyz.ogv .../xyz.jpg 200 150 90 2>&1</em>
|
225
227
|
</p>
|
226
228
|
<p dir="ltr">
|
227
229
|
<label>libimage-exiftool-perl</label>
|
@@ -1,8 +1,8 @@
|
|
1
1
|
/**
|
2
2
|
* Created D/15/12/2013
|
3
|
-
* Updated
|
3
|
+
* Updated M/22/03/2022
|
4
4
|
*
|
5
|
-
* Copyright 2008-
|
5
|
+
* Copyright 2008-2022 | Fabrice Creuzot (luigifab) <code~luigifab~fr>
|
6
6
|
* https://www.luigifab.fr/redmine/apijs
|
7
7
|
*
|
8
8
|
* This program is free software, you can redistribute it or modify
|
@@ -20,7 +20,7 @@ var apijsRedmine = new (function () {
|
|
20
20
|
|
21
21
|
"use strict";
|
22
22
|
|
23
|
-
this.
|
23
|
+
this.init = function () {
|
24
24
|
|
25
25
|
var d = apijs.i18n.data;
|
26
26
|
if (!d.frca) d.frca = {};
|
@@ -36,6 +36,7 @@ var apijsRedmine = new (function () {
|
|
36
36
|
d.de[254] = "Es tut uns leid, diese Datei existiert nicht mehr, bitte [a §]aktualisieren Sie die Seite[/a].";
|
37
37
|
d.de[255] = "Eine Beschreibung bearbeiten";
|
38
38
|
d.de[256] = "Bitte geben Sie weiter unten die neue Beschreibung für diese Datei an. Um die Beschreibung zu löschen lassen Sie das Feld leer.";
|
39
|
+
d.el[252] = "Σφάλμα";
|
39
40
|
d.en[250] = "Remove file";
|
40
41
|
d.en[251] = "Are you sure you want to remove this file?[br]Be careful, you can't cancel this operation.";
|
41
42
|
d.en[252] = "Error";
|
@@ -66,6 +67,7 @@ var apijsRedmine = new (function () {
|
|
66
67
|
d.fr[258] = "Saisissez ci-dessous le nouveau nom pour ce fichier.";
|
67
68
|
d.fr[259] = "Vider le cache";
|
68
69
|
d.fr[260] = "Êtes-vous certain(e) de vouloir vider le cache ?[br]Attention, cette opération n'est pas annulable.";
|
70
|
+
d.hu[252] = "Hiba";
|
69
71
|
d.it[250] = "Cancella i file";
|
70
72
|
d.it[251] = "Sei sicura di voler eliminare il file?[br]Attenzione, questa operazione non può essere annullata.";
|
71
73
|
d.it[252] = "Errore";
|
@@ -86,6 +88,7 @@ var apijsRedmine = new (function () {
|
|
86
88
|
d.pt[254] = "Lamento, o ficheiro já não existe, por favor [a §]atualize a página[/a].";
|
87
89
|
d.pt[255] = "Modificar uma descrição";
|
88
90
|
d.pt[256] = "Digite abaixo a nova descrição para este ficheiro. Para suprimir a descrição, deixe o campo vazio.";
|
91
|
+
d.ro[252] = "Eroare";
|
89
92
|
d.ru[250] = "Удалить файл";
|
90
93
|
d.ru[251] = "Вы уверены, что хотите удалить этот файл?[br]Осторожно, вы не сможете отменить эту операцию.";
|
91
94
|
d.ru[252] = "Ошибка";
|
@@ -95,6 +98,7 @@ var apijsRedmine = new (function () {
|
|
95
98
|
d.ru[256] = "Ниже введите новое описание файла. Оставьте поле пустым, чтобы удалить описание.";
|
96
99
|
d.sk[252] = "Chyba";
|
97
100
|
d.tr[252] = "Hata";
|
101
|
+
d.tr[259] = "Önbelleği temizle";
|
98
102
|
d.uk[252] = "Помилка";
|
99
103
|
d.zh[252] = "错误信息";
|
100
104
|
// auto end
|
@@ -220,25 +224,25 @@ var apijsRedmine = new (function () {
|
|
220
224
|
subelem = elem.querySelector('input');
|
221
225
|
if (subelem) {
|
222
226
|
text = subelem.getAttribute('value');
|
223
|
-
subelem.setAttribute('value', name + text.
|
227
|
+
subelem.setAttribute('value', name + text.substring(text.indexOf('|')));
|
224
228
|
}
|
225
229
|
|
226
230
|
subelem = elem.querySelector('a');
|
227
231
|
if (subelem) {
|
228
232
|
text = subelem.getAttribute('href');
|
229
|
-
subelem.setAttribute('href', text.
|
233
|
+
subelem.setAttribute('href', text.substring(0, text.lastIndexOf('/') + 1) + name);
|
230
234
|
}
|
231
235
|
|
232
236
|
subelem = elem.querySelector('button.download');
|
233
237
|
if (subelem) {
|
234
238
|
text = subelem.getAttribute('onclick');
|
235
|
-
subelem.setAttribute('onclick', text.
|
239
|
+
subelem.setAttribute('onclick', text.substring(0, text.lastIndexOf('/') + 1) + name + "';");
|
236
240
|
}
|
237
241
|
|
238
242
|
subelem = elem.querySelector('button.show');
|
239
243
|
if (subelem) {
|
240
244
|
text = subelem.getAttribute('onclick');
|
241
|
-
subelem.setAttribute('onclick', text.
|
245
|
+
subelem.setAttribute('onclick', text.substring(0, text.lastIndexOf('/') + 1) + name + "';");
|
242
246
|
}
|
243
247
|
|
244
248
|
apijs.dialog.actionClose();
|
@@ -316,4 +320,4 @@ var apijsRedmine = new (function () {
|
|
316
320
|
})();
|
317
321
|
|
318
322
|
if (typeof self.addEventListener == 'function')
|
319
|
-
self.addEventListener('apijsload', apijsRedmine.
|
323
|
+
self.addEventListener('apijsload', apijsRedmine.init.bind(apijsRedmine));
|
@@ -1,8 +1,8 @@
|
|
1
1
|
/*!
|
2
|
-
* Copyright 2008-
|
2
|
+
* Copyright 2008-2022 | Fabrice Creuzot (luigifab) <code~luigifab~fr>
|
3
3
|
* https://www.luigifab.fr/redmine/apijs
|
4
4
|
* This program is free software, you can redistribute it or modify
|
5
5
|
* it under the terms of the GNU General Public License (GPL).
|
6
6
|
*/
|
7
|
-
var apijsRedmine=new function(){"use strict";this.
|
7
|
+
var apijsRedmine=new function(){"use strict";this.init=function(){var e=apijs.i18n.data;e.frca||(e.frca={}),e.cs[250]="Smazat soubor",e.cs[251]="Opravdu chcete tento soubor smazat?[br]Pozor, tuto operaci nelze vrátit zpět.",e.cs[252]="Chyba",e.de[250]="Eine Datei löschen",e.de[251]="Sind Sie sicher, dass Sie diese Datei löschen möchten?[br]Achtung, diese Aktion ist unrückgängig.",e.de[252]="Fehler",e.de[253]="Sie verfügen nicht über die notwendigen Rechte um diese Operation durchzuführen, bitte [a §]aktualisieren Sie die Seite[/a].",e.de[254]="Es tut uns leid, diese Datei existiert nicht mehr, bitte [a §]aktualisieren Sie die Seite[/a].",e.de[255]="Eine Beschreibung bearbeiten",e.de[256]="Bitte geben Sie weiter unten die neue Beschreibung für diese Datei an. Um die Beschreibung zu löschen lassen Sie das Feld leer.",e.el[252]="Σφάλμα",e.en[250]="Remove file",e.en[251]="Are you sure you want to remove this file?[br]Be careful, you can't cancel this operation.",e.en[252]="Error",e.en[253]="You are not authorized to perform this operation, please [a §]refresh the page[/a].",e.en[254]="Sorry, the file no longer exists, please [a §]refresh the page[/a].",e.en[255]="Edit description",e.en[256]="Enter below the new description for the file. To remove the description, leave the field empty.",e.en[257]="Rename file",e.en[258]="Enter below the new name for the file.",e.en[259]="Clear cache",e.en[260]="Are you sure you want to clear the cache?[br]Be careful, you can't cancel this operation.",e.es[250]="Borrar un archivo",e.es[251]="¿Está usted seguro(a) de que desea eliminar este archivo?[br]Atención, pues no podrá cancelar esta operación.",e.es[253]="No está autorizado-a para llevar a cabo esta operación, por favor [a §]actualice la página[/a].",e.es[254]="Disculpe, pero el archivo ya no existe, por favor [a §]actualice la página[/a].",e.es[255]="Editar una descripción",e.es[256]="Introduzca a continuación la nueva descripción para el archivo. Para eliminar la descripción, deje el campo en blanco.",e.es[259]="Vaciar la caché",e.es[260]="¿Está usted seguro(a) de querer vaciar la caché?[br]Cuidado, esta operación no puede ser cancelada.",e.fr[250]="Supprimer le fichier",e.fr[251]="Êtes-vous sûr(e) de vouloir supprimer ce fichier ?[br]Attention, cette opération n'est pas annulable.",e.fr[252]="Erreur",e.fr[253]="Vous n'êtes pas autorisé(e) à effectuer cette opération, veuillez [a §]actualiser la page[/a].",e.fr[254]="Désolé, le fichier n'existe plus, veuillez [a §]actualiser la page[/a].",e.fr[255]="Modifier la description",e.fr[256]="Saisissez ci-dessous la nouvelle description pour ce fichier. Pour supprimer la description, laissez le champ vide.",e.fr[257]="Renommer le fichier",e.fr[258]="Saisissez ci-dessous le nouveau nom pour ce fichier.",e.fr[259]="Vider le cache",e.fr[260]="Êtes-vous certain(e) de vouloir vider le cache ?[br]Attention, cette opération n'est pas annulable.",e.hu[252]="Hiba",e.it[250]="Cancella i file",e.it[251]="Sei sicura di voler eliminare il file?[br]Attenzione, questa operazione non può essere annullata.",e.it[252]="Errore",e.it[253]="Non siete autorizzati a eseguire questa operazione, vi preghiamo di [a §]ricaricare la pagina[/a].",e.it[254]="Spiacenti, il file non esiste più, vi preghiamo di [a §]ricaricare la pagina[/a].",e.it[255]="Modificare una descrizione",e.it[256]="Inserire qui sotto la nuova descrizione del file. Per cancellare la descrizione, lasciate lo spazio vuoto.",e.ja[250]="ファイルを削除",e.ja[252]="エラー",e.nl[252]="Fout",e.pl[250]="Usuń plik",e.pl[251]="Jesteś pewny, że chcesz usunąć ten plik?[br]Uwaga! Nie ma odwrotu od tej operacji.",e.pl[252]="Błąd",e.pt[250]="Suprimir um ficheiro",e.pt[251]="Tem certeza de que quer suprimir este ficheiro?[br]Cuidado, não pode cancelar esta operação.",e.pt[252]="Erro",e.pt[253]="Não é autorizado(a) para efetuar esta operação, por favor [a §]atualize a página[/a].",e.pt[254]="Lamento, o ficheiro já não existe, por favor [a §]atualize a página[/a].",e.pt[255]="Modificar uma descrição",e.pt[256]="Digite abaixo a nova descrição para este ficheiro. Para suprimir a descrição, deixe o campo vazio.",e.ro[252]="Eroare",e.ru[250]="Удалить файл",e.ru[251]="Вы уверены, что хотите удалить этот файл?[br]Осторожно, вы не сможете отменить эту операцию.",e.ru[252]="Ошибка",e.ru[253]="Вы не авторизованы для выполнения этой операции, пожалуйста [a §]обновите страницу[/a].",e.ru[254]="Извините, но файл не существует, пожалуйста [a §]обновите страницу[/a].",e.ru[255]="Редактировать описание",e.ru[256]="Ниже введите новое описание файла. Оставьте поле пустым, чтобы удалить описание.",e.sk[252]="Chyba",e.tr[252]="Hata",e.tr[259]="Önbelleği temizle",e.uk[252]="Помилка",e.zh[252]="错误信息"},this.error=function(e){"string"==typeof e&&e.indexOf("<!DOCTYPE")<0?apijs.dialog.dialogInformation(apijs.i18n.translate(252),e,"error"):(apijs.dialog.remove("lock"),self.location.reload())},this.editAttachment=function(e,t,a,i){var r=apijs.i18n.translate(255),e=e.parentNode.parentNode.querySelector(".description").textContent.trim(),e='[p][label for="apijsinput"]'+apijs.i18n.translate(256)+'[/label][/p][input type="text" name="description" value="'+e+'" spellcheck="true" id="apijsinput"]';apijs.dialog.dialogFormOptions(r,e,a,apijsRedmine.actionEditAttachment,[t,a,i],"editattach"),apijs.dialog.t1.querySelector("input").select()},this.actionEditAttachment=function(e,t){if("boolean"==typeof e)return!0;var a;"string"==typeof e&&((a=new XMLHttpRequest).open("POST",t[1]+"?id="+t[0]+"&isAjax=true",!0),a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.setRequestHeader("X-CSRF-Token",t[2]),a.onreadystatechange=function(){var e,t;4===a.readyState&&([0,200].has(a.status)?0===a.responseText.indexOf("attachmentId")?(t=a.responseText.slice(0,a.responseText.indexOf(":")),e=a.responseText.slice(a.responseText.indexOf(":")+1),(t=document.getElementById(t)).querySelector(".description").textContent=e,(t=t.querySelector("input"))&&(t.value=t.value.slice(0,t.value.lastIndexOf("|")+1)+e),apijs.dialog.actionClose()):apijsRedmine.error(a.responseText):apijsRedmine.error(a.status))},a.send("desc="+encodeURIComponent(document.getElementById("apijsinput").value)))},this.renameAttachment=function(e,t,a,i){var r=apijs.i18n.translate(257),e=e.parentNode.parentNode.querySelector(".filename").textContent.trim(),e='[p][label for="apijsinput"]'+apijs.i18n.translate(258)+'[/label][/p][input type="text" name="name" value="'+e+'" spellcheck="false" id="apijsinput"]';apijs.dialog.dialogFormOptions(r,e,a,apijsRedmine.actionRenameAttachment,[t,a,i],"editattach")},this.actionRenameAttachment=function(e,t){if("boolean"==typeof e)return!0;var r;"string"==typeof e&&((r=new XMLHttpRequest).open("POST",t[1]+"?id="+t[0]+"&isAjax=true",!0),r.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),r.setRequestHeader("X-CSRF-Token",t[2]),r.onreadystatechange=function(){var e,t,a,i;4===r.readyState&&([0,200].has(r.status)?0===r.responseText.indexOf("attachmentId")?(i=r.responseText.slice(0,r.responseText.indexOf(":")),a=r.responseText.slice(r.responseText.indexOf(":")+1),(i=document.getElementById(i)).querySelector(".filename").textContent=a,(e=i.querySelector("input"))&&(t=e.getAttribute("value"),e.setAttribute("value",a+t.substring(t.indexOf("|")))),(e=i.querySelector("a"))&&(t=e.getAttribute("href"),e.setAttribute("href",t.substring(0,t.lastIndexOf("/")+1)+a)),(e=i.querySelector("button.download"))&&(t=e.getAttribute("onclick"),e.setAttribute("onclick",t.substring(0,t.lastIndexOf("/")+1)+a+"';")),(e=i.querySelector("button.show"))&&(t=e.getAttribute("onclick"),e.setAttribute("onclick",t.substring(0,t.lastIndexOf("/")+1)+a+"';")),apijs.dialog.actionClose()):apijsRedmine.error(r.responseText):apijsRedmine.error(r.status))},r.send("name="+encodeURIComponent(document.getElementById("apijsinput").value)))},this.removeAttachment=function(e,t,a,i){apijs.dialog.dialogConfirmation(apijs.i18n.translate(250),apijs.i18n.translate(251),apijsRedmine.actionRemoveAttachment,[t,a,i])},this.actionRemoveAttachment=function(e){var i=new XMLHttpRequest;i.open("POST",e[1]+"?id="+e[0]+"&isAjax=true",!0),i.setRequestHeader("X-CSRF-Token",e[2]),i.onreadystatechange=function(){var e,t,a;4===i.readyState&&([0,200].has(i.status)?0===i.responseText.indexOf("attachmentId")?(t=(e=document.getElementById(i.responseText)).parentNode,a=0,e.remove(),t.querySelectorAll("dl, li").length<1?t.remove():t.querySelectorAll("a[id][type]").forEach(function(e){e.setAttribute("id",e.getAttribute("id").slice(0,e.getAttribute("id").lastIndexOf(".")+1)+a++)}),apijs.dialog.actionClose()):apijsRedmine.error(i.responseText):apijsRedmine.error(i.status))},i.send()},this.clearCache=function(e){apijs.dialog.dialogConfirmation(apijs.i18n.translate(259),apijs.i18n.translate(260),apijsRedmine.actionClearCache,e)},this.actionClearCache=function(e){apijs.dialog.remove("waiting","lock"),self.location.href=e}};"function"==typeof self.addEventListener&&self.addEventListener("apijsload",apijsRedmine.init.bind(apijsRedmine));
|
8
8
|
//# sourceMappingURL=apijs-redmine.min.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["apijs-redmine.js"],"sourcesContent":["/**\n * Created D/15/12/2013\n * Updated D/09/05/2021\n *\n * Copyright 2008-2021 | Fabrice Creuzot (luigifab) <code~luigifab~fr>\n * https://www.luigifab.fr/redmine/apijs\n *\n * This program is free software, you can redistribute it or modify\n * it under the terms of the GNU General Public License (GPL) as published\n * by the free software foundation, either version 2 of the license, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but without any warranty, without even the implied warranty of\n * merchantability or fitness for a particular purpose. See the\n * GNU General Public License (GPL) for more details.\n */\n\nvar apijsRedmine = new (function () {\n\n\t\"use strict\";\n\n\tthis.start = function () {\n\n\t\tvar d = apijs.i18n.data;\n\t\tif (!d.frca) d.frca = {};\n\t\t// https://docs.google.com/spreadsheets/d/1UUpKZ-YAAlcfvGHYwt6aUM9io390j0-fIL0vMRh1pW0/edit?usp=sharing\n\t\t// auto start\n\t\td.cs[250] = \"Smazat soubor\";\n\t\td.cs[251] = \"Opravdu chcete tento soubor smazat?[br]Pozor, tuto operaci nelze vrátit zpět.\";\n\t\td.cs[252] = \"Chyba\";\n\t\td.de[250] = \"Eine Datei löschen\";\n\t\td.de[251] = \"Sind Sie sicher, dass Sie diese Datei löschen möchten?[br]Achtung, diese Aktion ist unrückgängig.\";\n\t\td.de[252] = \"Fehler\";\n\t\td.de[253] = \"Sie verfügen nicht über die notwendigen Rechte um diese Operation durchzuführen, bitte [a §]aktualisieren Sie die Seite[/a].\";\n\t\td.de[254] = \"Es tut uns leid, diese Datei existiert nicht mehr, bitte [a §]aktualisieren Sie die Seite[/a].\";\n\t\td.de[255] = \"Eine Beschreibung bearbeiten\";\n\t\td.de[256] = \"Bitte geben Sie weiter unten die neue Beschreibung für diese Datei an. Um die Beschreibung zu löschen lassen Sie das Feld leer.\";\n\t\td.en[250] = \"Remove file\";\n\t\td.en[251] = \"Are you sure you want to remove this file?[br]Be careful, you can't cancel this operation.\";\n\t\td.en[252] = \"Error\";\n\t\td.en[253] = \"You are not authorized to perform this operation, please [a §]refresh the page[/a].\";\n\t\td.en[254] = \"Sorry, the file no longer exists, please [a §]refresh the page[/a].\";\n\t\td.en[255] = \"Edit description\";\n\t\td.en[256] = \"Enter below the new description for the file. To remove the description, leave the field empty.\";\n\t\td.en[257] = \"Rename file\";\n\t\td.en[258] = \"Enter below the new name for the file.\";\n\t\td.en[259] = \"Clear cache\";\n\t\td.en[260] = \"Are you sure you want to clear the cache?[br]Be careful, you can't cancel this operation.\";\n\t\td.es[250] = \"Borrar un archivo\";\n\t\td.es[251] = \"¿Está usted seguro(a) de que desea eliminar este archivo?[br]Atención, pues no podrá cancelar esta operación.\";\n\t\td.es[253] = \"No está autorizado-a para llevar a cabo esta operación, por favor [a §]actualice la página[/a].\";\n\t\td.es[254] = \"Disculpe, pero el archivo ya no existe, por favor [a §]actualice la página[/a].\";\n\t\td.es[255] = \"Editar una descripción\";\n\t\td.es[256] = \"Introduzca a continuación la nueva descripción para el archivo. Para eliminar la descripción, deje el campo en blanco.\";\n\t\td.es[259] = \"Vaciar la caché\";\n\t\td.es[260] = \"¿Está usted seguro(a) de querer vaciar la caché?[br]Cuidado, esta operación no puede ser cancelada.\";\n\t\td.fr[250] = \"Supprimer le fichier\";\n\t\td.fr[251] = \"Êtes-vous sûr(e) de vouloir supprimer ce fichier ?[br]Attention, cette opération n'est pas annulable.\";\n\t\td.fr[252] = \"Erreur\";\n\t\td.fr[253] = \"Vous n'êtes pas autorisé(e) à effectuer cette opération, veuillez [a §]actualiser la page[/a].\";\n\t\td.fr[254] = \"Désolé, le fichier n'existe plus, veuillez [a §]actualiser la page[/a].\";\n\t\td.fr[255] = \"Modifier la description\";\n\t\td.fr[256] = \"Saisissez ci-dessous la nouvelle description pour ce fichier. Pour supprimer la description, laissez le champ vide.\";\n\t\td.fr[257] = \"Renommer le fichier\";\n\t\td.fr[258] = \"Saisissez ci-dessous le nouveau nom pour ce fichier.\";\n\t\td.fr[259] = \"Vider le cache\";\n\t\td.fr[260] = \"Êtes-vous certain(e) de vouloir vider le cache ?[br]Attention, cette opération n'est pas annulable.\";\n\t\td.it[250] = \"Cancella i file\";\n\t\td.it[251] = \"Sei sicura di voler eliminare il file?[br]Attenzione, questa operazione non può essere annullata.\";\n\t\td.it[252] = \"Errore\";\n\t\td.it[253] = \"Non siete autorizzati a eseguire questa operazione, vi preghiamo di [a §]ricaricare la pagina[/a].\";\n\t\td.it[254] = \"Spiacenti, il file non esiste più, vi preghiamo di [a §]ricaricare la pagina[/a].\";\n\t\td.it[255] = \"Modificare una descrizione\";\n\t\td.it[256] = \"Inserire qui sotto la nuova descrizione del file. Per cancellare la descrizione, lasciate lo spazio vuoto.\";\n\t\td.ja[250] = \"ファイルを削除\";\n\t\td.ja[252] = \"エラー\";\n\t\td.nl[252] = \"Fout\";\n\t\td.pl[250] = \"Usuń plik\";\n\t\td.pl[251] = \"Jesteś pewny, że chcesz usunąć ten plik?[br]Uwaga! Nie ma odwrotu od tej operacji.\";\n\t\td.pl[252] = \"Błąd\";\n\t\td.pt[250] = \"Suprimir um ficheiro\";\n\t\td.pt[251] = \"Tem certeza de que quer suprimir este ficheiro?[br]Cuidado, não pode cancelar esta operação.\";\n\t\td.pt[252] = \"Erro\";\n\t\td.pt[253] = \"Não é autorizado(a) para efetuar esta operação, por favor [a §]atualize a página[/a].\";\n\t\td.pt[254] = \"Lamento, o ficheiro já não existe, por favor [a §]atualize a página[/a].\";\n\t\td.pt[255] = \"Modificar uma descrição\";\n\t\td.pt[256] = \"Digite abaixo a nova descrição para este ficheiro. Para suprimir a descrição, deixe o campo vazio.\";\n\t\td.ru[250] = \"Удалить файл\";\n\t\td.ru[251] = \"Вы уверены, что хотите удалить этот файл?[br]Осторожно, вы не сможете отменить эту операцию.\";\n\t\td.ru[252] = \"Ошибка\";\n\t\td.ru[253] = \"Вы не авторизованы для выполнения этой операции, пожалуйста [a §]обновите страницу[/a].\";\n\t\td.ru[254] = \"Извините, но файл не существует, пожалуйста [a §]обновите страницу[/a].\";\n\t\td.ru[255] = \"Редактировать описание\";\n\t\td.ru[256] = \"Ниже введите новое описание файла. Оставьте поле пустым, чтобы удалить описание.\";\n\t\td.sk[252] = \"Chyba\";\n\t\td.tr[252] = \"Hata\";\n\t\td.uk[252] = \"Помилка\";\n\t\td.zh[252] = \"错误信息\";\n\t\t// auto end\n\t};\n\n\tthis.error = function (data) {\n\n\t\tif ((typeof data == 'string') && (data.indexOf('<!DOCTYPE') < 0)) {\n\t\t\tapijs.dialog.dialogInformation(apijs.i18n.translate(252), data, 'error');\n\t\t}\n\t\telse {\n\t\t\tapijs.dialog.remove('lock'); // obligatoire sinon demande de confirmation de quitter la page\n\t\t\tself.location.reload();\n\t\t}\n\t};\n\n\tthis.editAttachment = function (elem, id, action, token) {\n\n\t\tvar desc, text, title = apijs.i18n.translate(255);\n\n\t\tdesc = elem.parentNode.parentNode.querySelector('.description').textContent.trim();\n\t\ttext = '[p][label for=\"apijsinput\"]' + apijs.i18n.translate(256) + '[/label][/p]' +\n\t\t\t\t'[input type=\"text\" name=\"description\" value=\"' + desc + '\" spellcheck=\"true\" id=\"apijsinput\"]';\n\n\t\tapijs.dialog.dialogFormOptions(title, text, action, apijsRedmine.actionEditAttachment, [id, action, token], 'editattach');\n\t\tapijs.dialog.t1.querySelector('input').select();\n\t};\n\n\tthis.actionEditAttachment = function (action, args) {\n\n\t\t// vérification de la nouvelle description\n\t\tif (typeof action == 'boolean') {\n\t\t\treturn true;\n\t\t}\n\t\t// sauvegarde de la nouvelle description\n\t\telse if (typeof action == 'string') {\n\n\t\t\t// args = [id, action, token]\n\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\txhr.open('POST', args[1] + '?id=' + args[0] + '&isAjax=true', true);\n\t\t\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\t\t\txhr.setRequestHeader('X-CSRF-Token', args[2]);\n\n\t\t\txhr.onreadystatechange = function () {\n\n\t\t\t\tif (xhr.readyState === 4) {\n\t\t\t\t\tif ([0, 200].has(xhr.status)) {\n\t\t\t\t\t\tif (xhr.responseText.indexOf('attachmentId') === 0) {\n\n\t\t\t\t\t\t\t// extrait l'id et la description du fichier enregistré\n\t\t\t\t\t\t\tvar elem, id, text;\n\t\t\t\t\t\t\tid = xhr.responseText.slice(0, xhr.responseText.indexOf(':'));\n\t\t\t\t\t\t\ttext = xhr.responseText.slice(xhr.responseText.indexOf(':') + 1);\n\n\t\t\t\t\t\t\t// description\n\t\t\t\t\t\t\telem = document.getElementById(id);\n\t\t\t\t\t\t\telem.querySelector('.description').textContent = text;\n\n\t\t\t\t\t\t\t// input type hidden\n\t\t\t\t\t\t\telem = elem.querySelector('input');\n\t\t\t\t\t\t\tif (elem)\n\t\t\t\t\t\t\t\telem.value = elem.value.slice(0, elem.value.lastIndexOf('|') + 1) + text;\n\n\t\t\t\t\t\t\tapijs.dialog.actionClose();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tapijsRedmine.error(xhr.responseText);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tapijsRedmine.error(xhr.status);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\txhr.send('desc=' + encodeURIComponent(document.getElementById('apijsinput').value));\n\t\t}\n\t};\n\n\tthis.renameAttachment = function (elem, id, action, token) {\n\n\t\tvar name, text, title = apijs.i18n.translate(257);\n\n\t\tname = elem.parentNode.parentNode.querySelector('.filename').textContent.trim();\n\t\ttext = '[p][label for=\"apijsinput\"]' + apijs.i18n.translate(258) + '[/label][/p]' +\n\t\t\t\t'[input type=\"text\" name=\"name\" value=\"' + name + '\" spellcheck=\"false\" id=\"apijsinput\"]';\n\n\t\tapijs.dialog.dialogFormOptions(title, text, action, apijsRedmine.actionRenameAttachment, [id, action, token], 'editattach');\n\t};\n\n\tthis.actionRenameAttachment = function (action, args) {\n\n\t\t// vérification du nouveau nom\n\t\tif (typeof action == 'boolean') {\n\t\t\treturn true;\n\t\t}\n\t\t// sauvegarde du nouveau nom\n\t\telse if (typeof action == 'string') {\n\n\t\t\t// args = [id, action, token]\n\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\txhr.open('POST', args[1] + '?id=' + args[0] + '&isAjax=true', true);\n\t\t\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\t\t\txhr.setRequestHeader('X-CSRF-Token', args[2]);\n\n\t\t\txhr.onreadystatechange = function () {\n\n\t\t\t\tif (xhr.readyState === 4) {\n\t\t\t\t\tif ([0, 200].has(xhr.status)) {\n\t\t\t\t\t\tif (xhr.responseText.indexOf('attachmentId') === 0) {\n\n\t\t\t\t\t\t\t// extrait l'id et le nom du fichier enregistré\n\t\t\t\t\t\t\tvar elem, id, name, subelem, text;\n\t\t\t\t\t\t\tid = xhr.responseText.slice(0, xhr.responseText.indexOf(':'));\n\t\t\t\t\t\t\tname = xhr.responseText.slice(xhr.responseText.indexOf(':') + 1);\n\n\t\t\t\t\t\t\t// nom\n\t\t\t\t\t\t\telem = document.getElementById(id);\n\t\t\t\t\t\t\telem.querySelector('.filename').textContent = name;\n\n\t\t\t\t\t\t\t// urls sur a/href et input/value et button.download/onclick et button.show/onclick\n\t\t\t\t\t\t\t// pas de maj de src et srcset sur img pour éviter un appel réseau inutile\n\t\t\t\t\t\t\tsubelem = elem.querySelector('input');\n\t\t\t\t\t\t\tif (subelem) {\n\t\t\t\t\t\t\t\ttext = subelem.getAttribute('value');\n\t\t\t\t\t\t\t\tsubelem.setAttribute('value', name + text.substr(text.indexOf('|')));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsubelem = elem.querySelector('a');\n\t\t\t\t\t\t\tif (subelem) {\n\t\t\t\t\t\t\t\ttext = subelem.getAttribute('href');\n\t\t\t\t\t\t\t\tsubelem.setAttribute('href', text.substr(0, text.lastIndexOf('/') + 1) + name);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsubelem = elem.querySelector('button.download');\n\t\t\t\t\t\t\tif (subelem) {\n\t\t\t\t\t\t\t\ttext = subelem.getAttribute('onclick');\n\t\t\t\t\t\t\t\tsubelem.setAttribute('onclick', text.substr(0, text.lastIndexOf('/') + 1) + name + \"';\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsubelem = elem.querySelector('button.show');\n\t\t\t\t\t\t\tif (subelem) {\n\t\t\t\t\t\t\t\ttext = subelem.getAttribute('onclick');\n\t\t\t\t\t\t\t\tsubelem.setAttribute('onclick', text.substr(0, text.lastIndexOf('/') + 1) + name + \"';\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tapijs.dialog.actionClose();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tapijsRedmine.error(xhr.responseText);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tapijsRedmine.error(xhr.status);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\txhr.send('name=' + encodeURIComponent(document.getElementById('apijsinput').value));\n\t\t}\n\t};\n\n\tthis.removeAttachment = function (elem, id, action, token) {\n\t\tapijs.dialog.dialogConfirmation(apijs.i18n.translate(250), apijs.i18n.translate(251), apijsRedmine.actionRemoveAttachment, [id, action, token]);\n\t};\n\n\tthis.actionRemoveAttachment = function (args) {\n\n\t\t// args = [id, action, token]\n\t\tvar xhr = new XMLHttpRequest();\n\t\txhr.open('POST', args[1] + '?id=' + args[0] + '&isAjax=true', true);\n\t\txhr.setRequestHeader('X-CSRF-Token', args[2]);\n\n\t\txhr.onreadystatechange = function () {\n\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tif ([0, 200].has(xhr.status)) {\n\t\t\t\t\tif (xhr.responseText.indexOf('attachmentId') === 0) {\n\n\t\t\t\t\t\t// supprime le fichier de la page grâce à son id\n\t\t\t\t\t\tvar attachment = document.getElementById(xhr.responseText), elems = attachment.parentNode, idx = 0;\n\t\t\t\t\t\tattachment.remove();\n\n\t\t\t\t\t\t// supprime la liste des fichiers\n\t\t\t\t\t\tif (elems.querySelectorAll('dl, li').length < 1) {\n\t\t\t\t\t\t\telems.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// ou réattribue les ids du diaporama (pas de réinitialisation, on remet juste les ids en place)\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\telems.querySelectorAll('a[id][type]').forEach(function (elem) {\n\t\t\t\t\t\t\t\telem.setAttribute('id', elem.getAttribute('id').slice(0, elem.getAttribute('id').lastIndexOf('.') + 1) + idx++);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tapijs.dialog.actionClose();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tapijsRedmine.error(xhr.responseText);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tapijsRedmine.error(xhr.status);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\txhr.send();\n\t};\n\n\tthis.clearCache = function (action) {\n\t\tapijs.dialog.dialogConfirmation(apijs.i18n.translate(259), apijs.i18n.translate(260), apijsRedmine.actionClearCache, action);\n\t};\n\n\tthis.actionClearCache = function (args) {\n\t\tapijs.dialog.remove('waiting', 'lock'); // obligatoire sinon demande de confirmation de quitter la page\n\t\tself.location.href = args;\n\t};\n\n})();\n\nif (typeof self.addEventListener == 'function')\n\tself.addEventListener('apijsload', apijsRedmine.start.bind(apijsRedmine));"],"names":["apijsRedmine","this","start","d","apijs","i18n","data","frca","cs","de","en","es","fr","it","ja","nl","pl","pt","ru","sk","tr","uk","zh","error","indexOf","dialog","dialogInformation","translate","remove","self","location","reload","editAttachment","elem","id","action","token","title","desc","parentNode","querySelector","textContent","trim","text","dialogFormOptions","actionEditAttachment","t1","select","args","xhr","XMLHttpRequest","open","setRequestHeader","onreadystatechange","readyState","has","status","responseText","slice","document","getElementById","value","lastIndexOf","actionClose","send","encodeURIComponent","renameAttachment","name","actionRenameAttachment","subelem","getAttribute","setAttribute","substr","removeAttachment","dialogConfirmation","actionRemoveAttachment","attachment","elems","idx","querySelectorAll","length","forEach","clearCache","actionClearCache","href","addEventListener","bind"],"mappings":"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"}
|
1
|
+
{"version":3,"sources":["apijs-redmine.js"],"sourcesContent":["/**\n * Created D/15/12/2013\n * Updated M/22/03/2022\n *\n * Copyright 2008-2022 | Fabrice Creuzot (luigifab) <code~luigifab~fr>\n * https://www.luigifab.fr/redmine/apijs\n *\n * This program is free software, you can redistribute it or modify\n * it under the terms of the GNU General Public License (GPL) as published\n * by the free software foundation, either version 2 of the license, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but without any warranty, without even the implied warranty of\n * merchantability or fitness for a particular purpose. See the\n * GNU General Public License (GPL) for more details.\n */\n\nvar apijsRedmine = new (function () {\n\n\t\"use strict\";\n\n\tthis.init = function () {\n\n\t\tvar d = apijs.i18n.data;\n\t\tif (!d.frca) d.frca = {};\n\t\t// https://docs.google.com/spreadsheets/d/1UUpKZ-YAAlcfvGHYwt6aUM9io390j0-fIL0vMRh1pW0/edit?usp=sharing\n\t\t// auto start\n\t\td.cs[250] = \"Smazat soubor\";\n\t\td.cs[251] = \"Opravdu chcete tento soubor smazat?[br]Pozor, tuto operaci nelze vrátit zpět.\";\n\t\td.cs[252] = \"Chyba\";\n\t\td.de[250] = \"Eine Datei löschen\";\n\t\td.de[251] = \"Sind Sie sicher, dass Sie diese Datei löschen möchten?[br]Achtung, diese Aktion ist unrückgängig.\";\n\t\td.de[252] = \"Fehler\";\n\t\td.de[253] = \"Sie verfügen nicht über die notwendigen Rechte um diese Operation durchzuführen, bitte [a §]aktualisieren Sie die Seite[/a].\";\n\t\td.de[254] = \"Es tut uns leid, diese Datei existiert nicht mehr, bitte [a §]aktualisieren Sie die Seite[/a].\";\n\t\td.de[255] = \"Eine Beschreibung bearbeiten\";\n\t\td.de[256] = \"Bitte geben Sie weiter unten die neue Beschreibung für diese Datei an. Um die Beschreibung zu löschen lassen Sie das Feld leer.\";\n\t\td.el[252] = \"Σφάλμα\";\n\t\td.en[250] = \"Remove file\";\n\t\td.en[251] = \"Are you sure you want to remove this file?[br]Be careful, you can't cancel this operation.\";\n\t\td.en[252] = \"Error\";\n\t\td.en[253] = \"You are not authorized to perform this operation, please [a §]refresh the page[/a].\";\n\t\td.en[254] = \"Sorry, the file no longer exists, please [a §]refresh the page[/a].\";\n\t\td.en[255] = \"Edit description\";\n\t\td.en[256] = \"Enter below the new description for the file. To remove the description, leave the field empty.\";\n\t\td.en[257] = \"Rename file\";\n\t\td.en[258] = \"Enter below the new name for the file.\";\n\t\td.en[259] = \"Clear cache\";\n\t\td.en[260] = \"Are you sure you want to clear the cache?[br]Be careful, you can't cancel this operation.\";\n\t\td.es[250] = \"Borrar un archivo\";\n\t\td.es[251] = \"¿Está usted seguro(a) de que desea eliminar este archivo?[br]Atención, pues no podrá cancelar esta operación.\";\n\t\td.es[253] = \"No está autorizado-a para llevar a cabo esta operación, por favor [a §]actualice la página[/a].\";\n\t\td.es[254] = \"Disculpe, pero el archivo ya no existe, por favor [a §]actualice la página[/a].\";\n\t\td.es[255] = \"Editar una descripción\";\n\t\td.es[256] = \"Introduzca a continuación la nueva descripción para el archivo. Para eliminar la descripción, deje el campo en blanco.\";\n\t\td.es[259] = \"Vaciar la caché\";\n\t\td.es[260] = \"¿Está usted seguro(a) de querer vaciar la caché?[br]Cuidado, esta operación no puede ser cancelada.\";\n\t\td.fr[250] = \"Supprimer le fichier\";\n\t\td.fr[251] = \"Êtes-vous sûr(e) de vouloir supprimer ce fichier ?[br]Attention, cette opération n'est pas annulable.\";\n\t\td.fr[252] = \"Erreur\";\n\t\td.fr[253] = \"Vous n'êtes pas autorisé(e) à effectuer cette opération, veuillez [a §]actualiser la page[/a].\";\n\t\td.fr[254] = \"Désolé, le fichier n'existe plus, veuillez [a §]actualiser la page[/a].\";\n\t\td.fr[255] = \"Modifier la description\";\n\t\td.fr[256] = \"Saisissez ci-dessous la nouvelle description pour ce fichier. Pour supprimer la description, laissez le champ vide.\";\n\t\td.fr[257] = \"Renommer le fichier\";\n\t\td.fr[258] = \"Saisissez ci-dessous le nouveau nom pour ce fichier.\";\n\t\td.fr[259] = \"Vider le cache\";\n\t\td.fr[260] = \"Êtes-vous certain(e) de vouloir vider le cache ?[br]Attention, cette opération n'est pas annulable.\";\n\t\td.hu[252] = \"Hiba\";\n\t\td.it[250] = \"Cancella i file\";\n\t\td.it[251] = \"Sei sicura di voler eliminare il file?[br]Attenzione, questa operazione non può essere annullata.\";\n\t\td.it[252] = \"Errore\";\n\t\td.it[253] = \"Non siete autorizzati a eseguire questa operazione, vi preghiamo di [a §]ricaricare la pagina[/a].\";\n\t\td.it[254] = \"Spiacenti, il file non esiste più, vi preghiamo di [a §]ricaricare la pagina[/a].\";\n\t\td.it[255] = \"Modificare una descrizione\";\n\t\td.it[256] = \"Inserire qui sotto la nuova descrizione del file. Per cancellare la descrizione, lasciate lo spazio vuoto.\";\n\t\td.ja[250] = \"ファイルを削除\";\n\t\td.ja[252] = \"エラー\";\n\t\td.nl[252] = \"Fout\";\n\t\td.pl[250] = \"Usuń plik\";\n\t\td.pl[251] = \"Jesteś pewny, że chcesz usunąć ten plik?[br]Uwaga! Nie ma odwrotu od tej operacji.\";\n\t\td.pl[252] = \"Błąd\";\n\t\td.pt[250] = \"Suprimir um ficheiro\";\n\t\td.pt[251] = \"Tem certeza de que quer suprimir este ficheiro?[br]Cuidado, não pode cancelar esta operação.\";\n\t\td.pt[252] = \"Erro\";\n\t\td.pt[253] = \"Não é autorizado(a) para efetuar esta operação, por favor [a §]atualize a página[/a].\";\n\t\td.pt[254] = \"Lamento, o ficheiro já não existe, por favor [a §]atualize a página[/a].\";\n\t\td.pt[255] = \"Modificar uma descrição\";\n\t\td.pt[256] = \"Digite abaixo a nova descrição para este ficheiro. Para suprimir a descrição, deixe o campo vazio.\";\n\t\td.ro[252] = \"Eroare\";\n\t\td.ru[250] = \"Удалить файл\";\n\t\td.ru[251] = \"Вы уверены, что хотите удалить этот файл?[br]Осторожно, вы не сможете отменить эту операцию.\";\n\t\td.ru[252] = \"Ошибка\";\n\t\td.ru[253] = \"Вы не авторизованы для выполнения этой операции, пожалуйста [a §]обновите страницу[/a].\";\n\t\td.ru[254] = \"Извините, но файл не существует, пожалуйста [a §]обновите страницу[/a].\";\n\t\td.ru[255] = \"Редактировать описание\";\n\t\td.ru[256] = \"Ниже введите новое описание файла. Оставьте поле пустым, чтобы удалить описание.\";\n\t\td.sk[252] = \"Chyba\";\n\t\td.tr[252] = \"Hata\";\n\t\td.tr[259] = \"Önbelleği temizle\";\n\t\td.uk[252] = \"Помилка\";\n\t\td.zh[252] = \"错误信息\";\n\t\t// auto end\n\t};\n\n\tthis.error = function (data) {\n\n\t\tif ((typeof data == 'string') && (data.indexOf('<!DOCTYPE') < 0)) {\n\t\t\tapijs.dialog.dialogInformation(apijs.i18n.translate(252), data, 'error');\n\t\t}\n\t\telse {\n\t\t\tapijs.dialog.remove('lock'); // obligatoire sinon demande de confirmation de quitter la page\n\t\t\tself.location.reload();\n\t\t}\n\t};\n\n\tthis.editAttachment = function (elem, id, action, token) {\n\n\t\tvar desc, text, title = apijs.i18n.translate(255);\n\n\t\tdesc = elem.parentNode.parentNode.querySelector('.description').textContent.trim();\n\t\ttext = '[p][label for=\"apijsinput\"]' + apijs.i18n.translate(256) + '[/label][/p]' +\n\t\t\t\t'[input type=\"text\" name=\"description\" value=\"' + desc + '\" spellcheck=\"true\" id=\"apijsinput\"]';\n\n\t\tapijs.dialog.dialogFormOptions(title, text, action, apijsRedmine.actionEditAttachment, [id, action, token], 'editattach');\n\t\tapijs.dialog.t1.querySelector('input').select();\n\t};\n\n\tthis.actionEditAttachment = function (action, args) {\n\n\t\t// vérification de la nouvelle description\n\t\tif (typeof action == 'boolean') {\n\t\t\treturn true;\n\t\t}\n\t\t// sauvegarde de la nouvelle description\n\t\telse if (typeof action == 'string') {\n\n\t\t\t// args = [id, action, token]\n\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\txhr.open('POST', args[1] + '?id=' + args[0] + '&isAjax=true', true);\n\t\t\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\t\t\txhr.setRequestHeader('X-CSRF-Token', args[2]);\n\n\t\t\txhr.onreadystatechange = function () {\n\n\t\t\t\tif (xhr.readyState === 4) {\n\t\t\t\t\tif ([0, 200].has(xhr.status)) {\n\t\t\t\t\t\tif (xhr.responseText.indexOf('attachmentId') === 0) {\n\n\t\t\t\t\t\t\t// extrait l'id et la description du fichier enregistré\n\t\t\t\t\t\t\tvar elem, id, text;\n\t\t\t\t\t\t\tid = xhr.responseText.slice(0, xhr.responseText.indexOf(':'));\n\t\t\t\t\t\t\ttext = xhr.responseText.slice(xhr.responseText.indexOf(':') + 1);\n\n\t\t\t\t\t\t\t// description\n\t\t\t\t\t\t\telem = document.getElementById(id);\n\t\t\t\t\t\t\telem.querySelector('.description').textContent = text;\n\n\t\t\t\t\t\t\t// input type hidden\n\t\t\t\t\t\t\telem = elem.querySelector('input');\n\t\t\t\t\t\t\tif (elem)\n\t\t\t\t\t\t\t\telem.value = elem.value.slice(0, elem.value.lastIndexOf('|') + 1) + text;\n\n\t\t\t\t\t\t\tapijs.dialog.actionClose();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tapijsRedmine.error(xhr.responseText);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tapijsRedmine.error(xhr.status);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\txhr.send('desc=' + encodeURIComponent(document.getElementById('apijsinput').value));\n\t\t}\n\t};\n\n\tthis.renameAttachment = function (elem, id, action, token) {\n\n\t\tvar name, text, title = apijs.i18n.translate(257);\n\n\t\tname = elem.parentNode.parentNode.querySelector('.filename').textContent.trim();\n\t\ttext = '[p][label for=\"apijsinput\"]' + apijs.i18n.translate(258) + '[/label][/p]' +\n\t\t\t\t'[input type=\"text\" name=\"name\" value=\"' + name + '\" spellcheck=\"false\" id=\"apijsinput\"]';\n\n\t\tapijs.dialog.dialogFormOptions(title, text, action, apijsRedmine.actionRenameAttachment, [id, action, token], 'editattach');\n\t};\n\n\tthis.actionRenameAttachment = function (action, args) {\n\n\t\t// vérification du nouveau nom\n\t\tif (typeof action == 'boolean') {\n\t\t\treturn true;\n\t\t}\n\t\t// sauvegarde du nouveau nom\n\t\telse if (typeof action == 'string') {\n\n\t\t\t// args = [id, action, token]\n\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\txhr.open('POST', args[1] + '?id=' + args[0] + '&isAjax=true', true);\n\t\t\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\t\t\txhr.setRequestHeader('X-CSRF-Token', args[2]);\n\n\t\t\txhr.onreadystatechange = function () {\n\n\t\t\t\tif (xhr.readyState === 4) {\n\t\t\t\t\tif ([0, 200].has(xhr.status)) {\n\t\t\t\t\t\tif (xhr.responseText.indexOf('attachmentId') === 0) {\n\n\t\t\t\t\t\t\t// extrait l'id et le nom du fichier enregistré\n\t\t\t\t\t\t\tvar elem, id, name, subelem, text;\n\t\t\t\t\t\t\tid = xhr.responseText.slice(0, xhr.responseText.indexOf(':'));\n\t\t\t\t\t\t\tname = xhr.responseText.slice(xhr.responseText.indexOf(':') + 1);\n\n\t\t\t\t\t\t\t// nom\n\t\t\t\t\t\t\telem = document.getElementById(id);\n\t\t\t\t\t\t\telem.querySelector('.filename').textContent = name;\n\n\t\t\t\t\t\t\t// urls sur a/href et input/value et button.download/onclick et button.show/onclick\n\t\t\t\t\t\t\t// pas de maj de src et srcset sur img pour éviter un appel réseau inutile\n\t\t\t\t\t\t\tsubelem = elem.querySelector('input');\n\t\t\t\t\t\t\tif (subelem) {\n\t\t\t\t\t\t\t\ttext = subelem.getAttribute('value');\n\t\t\t\t\t\t\t\tsubelem.setAttribute('value', name + text.substring(text.indexOf('|')));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsubelem = elem.querySelector('a');\n\t\t\t\t\t\t\tif (subelem) {\n\t\t\t\t\t\t\t\ttext = subelem.getAttribute('href');\n\t\t\t\t\t\t\t\tsubelem.setAttribute('href', text.substring(0, text.lastIndexOf('/') + 1) + name);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsubelem = elem.querySelector('button.download');\n\t\t\t\t\t\t\tif (subelem) {\n\t\t\t\t\t\t\t\ttext = subelem.getAttribute('onclick');\n\t\t\t\t\t\t\t\tsubelem.setAttribute('onclick', text.substring(0, text.lastIndexOf('/') + 1) + name + \"';\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsubelem = elem.querySelector('button.show');\n\t\t\t\t\t\t\tif (subelem) {\n\t\t\t\t\t\t\t\ttext = subelem.getAttribute('onclick');\n\t\t\t\t\t\t\t\tsubelem.setAttribute('onclick', text.substring(0, text.lastIndexOf('/') + 1) + name + \"';\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tapijs.dialog.actionClose();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tapijsRedmine.error(xhr.responseText);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tapijsRedmine.error(xhr.status);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\txhr.send('name=' + encodeURIComponent(document.getElementById('apijsinput').value));\n\t\t}\n\t};\n\n\tthis.removeAttachment = function (elem, id, action, token) {\n\t\tapijs.dialog.dialogConfirmation(apijs.i18n.translate(250), apijs.i18n.translate(251), apijsRedmine.actionRemoveAttachment, [id, action, token]);\n\t};\n\n\tthis.actionRemoveAttachment = function (args) {\n\n\t\t// args = [id, action, token]\n\t\tvar xhr = new XMLHttpRequest();\n\t\txhr.open('POST', args[1] + '?id=' + args[0] + '&isAjax=true', true);\n\t\txhr.setRequestHeader('X-CSRF-Token', args[2]);\n\n\t\txhr.onreadystatechange = function () {\n\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tif ([0, 200].has(xhr.status)) {\n\t\t\t\t\tif (xhr.responseText.indexOf('attachmentId') === 0) {\n\n\t\t\t\t\t\t// supprime le fichier de la page grâce à son id\n\t\t\t\t\t\tvar attachment = document.getElementById(xhr.responseText), elems = attachment.parentNode, idx = 0;\n\t\t\t\t\t\tattachment.remove();\n\n\t\t\t\t\t\t// supprime la liste des fichiers\n\t\t\t\t\t\tif (elems.querySelectorAll('dl, li').length < 1) {\n\t\t\t\t\t\t\telems.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// ou réattribue les ids du diaporama (pas de réinitialisation, on remet juste les ids en place)\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\telems.querySelectorAll('a[id][type]').forEach(function (elem) {\n\t\t\t\t\t\t\t\telem.setAttribute('id', elem.getAttribute('id').slice(0, elem.getAttribute('id').lastIndexOf('.') + 1) + idx++);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tapijs.dialog.actionClose();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tapijsRedmine.error(xhr.responseText);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tapijsRedmine.error(xhr.status);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\txhr.send();\n\t};\n\n\tthis.clearCache = function (action) {\n\t\tapijs.dialog.dialogConfirmation(apijs.i18n.translate(259), apijs.i18n.translate(260), apijsRedmine.actionClearCache, action);\n\t};\n\n\tthis.actionClearCache = function (args) {\n\t\tapijs.dialog.remove('waiting', 'lock'); // obligatoire sinon demande de confirmation de quitter la page\n\t\tself.location.href = args;\n\t};\n\n})();\n\nif (typeof self.addEventListener == 'function')\n\tself.addEventListener('apijsload', apijsRedmine.init.bind(apijsRedmine));"],"names":["apijsRedmine","this","init","d","apijs","i18n","data","frca","cs","de","el","en","es","fr","hu","it","ja","nl","pl","pt","ro","ru","sk","tr","uk","zh","error","indexOf","dialog","dialogInformation","translate","remove","self","location","reload","editAttachment","elem","id","action","token","title","desc","parentNode","querySelector","textContent","trim","text","dialogFormOptions","actionEditAttachment","t1","select","args","xhr","XMLHttpRequest","open","setRequestHeader","onreadystatechange","readyState","has","status","responseText","slice","document","getElementById","value","lastIndexOf","actionClose","send","encodeURIComponent","renameAttachment","name","actionRenameAttachment","subelem","getAttribute","setAttribute","substring","removeAttachment","dialogConfirmation","actionRemoveAttachment","attachment","elems","idx","querySelectorAll","length","forEach","clearCache","actionClearCache","href","addEventListener","bind"],"mappings":"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"}
|