teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

deletefileList ---> resultdeletefileList

2020/02/03 03:16

投稿

takashikawai
takashikawai

スコア195

answer CHANGED
@@ -245,14 +245,14 @@
245
245
  $.each(resultdeletefileList, function(i){
246
246
  $.ajax({
247
247
  type: "DELETE",
248
- url: '/attachments/' + deletefileList[i].fileid + '.json',
248
+ url: '/attachments/' + resultdeletefileList[i].fileid + '.json',
249
249
  headers: {
250
250
  'X-Redmine-API-Key': apiKey
251
251
  },
252
252
  dataType: "text",
253
253
  contentType: 'application/json',
254
254
  }).done(function(){
255
- console.log("チケット[" + deletefileList[i].issue_id + "]の添付ファイル[" + deletefileList[i].diskfilename + "]を削除しました");
255
+ console.log("チケット[" + resultdeletefileList[i].issue_id + "]の添付ファイル[" + resultdeletefileList[i].diskfilename + "]を削除しました");
256
256
  }).fail(function(){
257
257
  alert("失敗しました");
258
258
  })

1

スクリプトを修正

2020/02/03 03:16

投稿

takashikawai
takashikawai

スコア195

answer CHANGED
@@ -25,9 +25,12 @@
25
25
  ```jQuery
26
26
  var admin = ViewCustomize.context.user.admin;
27
27
  var apikey = ViewCustomize.context.user.apiKey;
28
- var closedissueList = [];
28
+ var closedissueList = []; //添付ファイル削除対象のチケット
29
- var deletefileListtmp = [];
30
- var deletefileList = [];
29
+ var deletefileList = []; //削除対象の添付ファイル
30
+ var openandundersixissueList = []; //添付ファイル削除対象外のチケット
31
+ var notdeletefileList = []; //削除対象外の添付ファイル
32
+ var resultdeletefileList = []; //実際に削除する添付ファイル
33
+
31
34
  $(function(){
32
35
  if (admin == true){
33
36
  //「設定」画面 =>「情報」タブ => 「名称」の後ろに「添付ファイル検索・削除」ボタンを追加
@@ -35,47 +38,65 @@
35
38
  var searchbtn = '&nbsp;' + '<input type="button" id="searchfile" value="添付ファイル検索">';
36
39
  var deletebtn = '&nbsp;' + '<input type="button" id="deletefile" value="添付ファイル削除">';
37
40
  $(target).append(searchbtn).append(deletebtn);
38
- $('input#deletefile').attr("disabled", true).css("color", "#fff").css("background-color", "#d6d6d6");
41
+ $('input#deletefile').attr("disabled", true).css("color", "#fff").css("background-color", "#d6d6d6"); //削除ボタンを一時的に無効化
39
42
 
43
+ //検索ボタンを押下したら、サーバから添付ファイル情報を取得する
40
44
  $('input#searchfile').click(function(){
45
+ //配列を初期化
41
46
  closedissueList = [];
42
- deletefileListtmp = [];
43
47
  deletefileList = [];
48
+ openandundersixissueList = [];
49
+ notdeletefileList = [];
50
+ resultdeletefileList = [];
51
+
44
52
  $('input#deletefile').attr("disabled", true).css("color", "#fff").css("background-color", "#d6d6d6");
45
53
  $.when(
46
54
  getclosedissueid(),
55
+ getclosedundersixmonthissueid(),
56
+ getopenissueid()
47
57
  ).done(function(){
48
- getdeletefile();
58
+ getdeletefile();
59
+ getnotdeletefile();
60
+ setTimeout(function() {
61
+ $('input#deletefile').attr("disabled", false).css("color", "#555").css("background-color", "#f0f0f0"); //情報を取得したら削除ボタンを有効化
62
+ }, 300);
49
63
  })
50
64
  })
51
65
 
52
66
  //削除ボタンを押下したら、サーバからファイルを削除する
53
67
  $('input#deletefile').click(function(){
68
+ $.when(
69
+ pushresultfile()
70
+ ).done(function(){
54
- if (deletefileList.length == 0){
71
+ if (resultdeletefileList.length == 0){
55
- alert("削除対象のファイルはありません");
72
+ alert("削除対象のファイルはありません");
56
- }else{
73
+ }else{
57
- closeissueattfiledelete();
74
+ closeissueattfiledelete();
58
- }
75
+ }
76
+ })
59
77
  })
60
78
  }
61
79
  })
62
80
 
81
+ //6か月前の日付を取得
82
+ function getbeforesixmonth(dt){
83
+ dt.setMonth(dt.getMonth() - 6);
84
+ var year = dt.getFullYear();
85
+ var month = ('0' + (dt.getMonth()+1)).slice(-2);
86
+ var day = ('0' + dt.getDate()).slice(-2);
87
+ var beforesixmonth = year+"-"+month+"-"+day;
88
+ return beforesixmonth;
89
+ }
90
+
63
91
  //対象プロジェクトのステータスが終了(完了)で、終了日が6か月以前のチケットを取得
64
92
  function getclosedissueid(){
65
93
  var deferred = new $.Deferred();
66
94
  var projectid = $('input#project_identifier').attr('value'); //プロジェクト識別子
95
+ var dt = new Date();
67
96
 
68
- //6か月前の日付を取得
69
- var dt = new Date();
70
- dt.setMonth(dt.getMonth() - 6);
71
- var year = dt.getFullYear();
72
- var month = ('0' + (dt.getMonth()+1)).slice(-2);
73
- var day = ('0' + dt.getDate()).slice(-2);
74
- var beforesixmonth = year+"-"+month+"-"+day;
75
-
76
97
  $.ajax({
77
98
  type: "GET",
78
- url: '/issues.json?limit=1000&project_id=' + projectid + '&status_id=closed&closed_on=%3C%3D' + beforesixmonth,
99
+ url: '/issues.json?limit=1000&project_id=' + projectid + '&status_id=closed&closed_on=%3C%3D' + getbeforesixmonth(dt),
79
100
  headers: {
80
101
  'X-Redmine-API-Key': apiKey
81
102
  },
@@ -95,6 +116,62 @@
95
116
  return deferred;
96
117
  }
97
118
 
119
+ //対象プロジェクトのステータスが終了(完了)で、終了日が6か月未満のチケットを取得
120
+ function getclosedundersixmonthissueid(){
121
+ var deferred = new $.Deferred();
122
+ var projectid = $('input#project_identifier').attr('value'); //プロジェクト識別子
123
+ var dt = new Date();
124
+
125
+ $.ajax({
126
+ type: "GET",
127
+ url: '/issues.json?limit=1000&project_id=' + projectid + '&status_id=closed&closed_on=%3E%3C' + getbeforesixmonth(dt),
128
+ headers: {
129
+ 'X-Redmine-API-Key': apiKey
130
+ },
131
+ dataType: "text",
132
+ contentType: 'application/json',
133
+ }).done(function(data){
134
+ data=JSON.parse(data);
135
+ data= data["issues"];
136
+ for (i in data) {
137
+ issueid=data[i].id;
138
+ openandundersixissueList.push(issueid);
139
+ }
140
+ setTimeout(function() {
141
+ deferred.resolve();
142
+ }, 300);
143
+ })
144
+ return deferred;
145
+ }
146
+
147
+ //対象プロジェクトのステータスが未完了のチケットを取得
148
+ function getopenissueid(){
149
+ var deferred = new $.Deferred();
150
+ var projectid = $('input#project_identifier').attr('value'); //プロジェクト識別子
151
+ var dt = new Date();
152
+
153
+ $.ajax({
154
+ type: "GET",
155
+ url: '/issues.json?limit=1000&project_id=' + projectid,
156
+ headers: {
157
+ 'X-Redmine-API-Key': apiKey
158
+ },
159
+ dataType: "text",
160
+ contentType: 'application/json',
161
+ }).done(function(data){
162
+ data=JSON.parse(data);
163
+ data= data["issues"];
164
+ for (i in data) {
165
+ issueid=data[i].id;
166
+ openandundersixissueList.push(issueid);
167
+ }
168
+ setTimeout(function() {
169
+ deferred.resolve();
170
+ }, 300);
171
+ })
172
+ return deferred;
173
+ }
174
+
98
175
  //チケットのリストに基づいて、削除対象ファイルの情報を取得
99
176
  function getdeletefile(){
100
177
  $.each(closedissueList, function(i){
@@ -113,19 +190,59 @@
113
190
  for (i in data){
114
191
  fileid = data[i].id; //添付ファイルID
115
192
  diskfilename = data[i].disk_filename; //サーバ上の物理ファイル名
116
- deletefileListtmp.push({issue_id, fileid, diskfilename});
193
+ deletefileList.push({issue_id, fileid, diskfilename});
117
- //サーバ上の物理ファイル名 が重複している場合は削除対象外とする
118
- deletefileList = deletefileListtmp.filter((x,y,z)=>z.slice(0,z.length).filter(w=>w.diskfilename==x.diskfilename).length < 2);
119
- console.log(deletefileList);
194
+ //console.log(deletefileList);
120
- $('input#deletefile').attr("disabled", false).css("color", "#555").css("background-color", "#f0f0f0");
121
195
  }
122
- })
196
+ })
123
197
  })
124
198
  }
125
199
 
200
+ //チケットのリストに基づいて、削除対象外のファイル情報を取得
201
+ function getnotdeletefile(){
202
+ $.each(openandundersixissueList, function(i){
203
+ $.ajax({
204
+ type: "GET",
205
+ url: '/issues/' + openandundersixissueList[i] + '.json?include=attachments',
206
+ headers: {
207
+ 'X-Redmine-API-Key': apiKey
208
+ },
209
+ dataType: "text",
210
+ contentType: 'application/json',
211
+ }).done(function(data){
212
+ data=JSON.parse(data);
213
+ data = data.issue.attachments;
214
+ for (i in data){
215
+ diskfilename = data[i].disk_filename; //サーバ上の物理ファイル名
216
+ notdeletefileList.push(diskfilename);
217
+ //console.log(notdeletefileList);
218
+ }
219
+ })
220
+ })
221
+ }
222
+
223
+ //削除対象と削除対象外を比較し、削除対象外に存在しなかったら削除対象を結果配列にpush
224
+ function pushresultfile(){
225
+ var deferred = new $.Deferred();
226
+ var a = deletefileList;
227
+ if (a.length == 0){
228
+ deferred.resolve(); //削除対象の添付ファイルがない場合は処理を終了
229
+ }
230
+ var b = notdeletefileList;
231
+ for (var i = 0; i < deletefileList.length; i++) {
232
+ if ($.inArray(a[i]["diskfilename"], b) < 0) {
233
+ resultdeletefileList.push(deletefileList[i]);
234
+ }
235
+ console.log(resultdeletefileList);
236
+ setTimeout(function() {
237
+ deferred.resolve();
238
+ }, 300);
239
+ }
240
+ return deferred;
241
+ }
242
+
126
243
  //サーバから添付ファイルを削除する
127
244
  function closeissueattfiledelete(){
128
- $.each(deletefileList, function(i){
245
+ $.each(resultdeletefileList, function(i){
129
246
  $.ajax({
130
247
  type: "DELETE",
131
248
  url: '/attachments/' + deletefileList[i].fileid + '.json',