OSDN Git Service

deploy: 403842186304d8e8bc6bb8d782fe5bcec0e713b1
[alterlinux/hayao.fascode.net.git] / alter / Download.js
1 'use strict';
2
3 // GETパラメータからrとeの値をそれぞれ取得する
4 const GetParams = () => {
5     let ParamsArray = {
6         release: undefined,
7         edition: undefined,
8     };
9     let searchParams = new URLSearchParams(document.location.search.substring(1));
10     ParamsArray["release"] = searchParams.get("r")
11     ParamsArray["edition"] = searchParams.get("e")
12     return ParamsArray;
13 }
14
15 // ダウンロードIDを取得してフォームを作成
16 const XmlReq = new XMLHttpRequest();
17 let JsonData = null;
18 XmlReq.onreadystatechange = function() {
19     if ((XmlReq.readyState === 4) && (XmlReq.status === 200)) {
20         JsonData = JSON.parse(XmlReq.responseText);
21         Object.keys(JsonData).reverse().forEach((ReleaseId) => {
22             //console.log(JsonData[ReleaseId])
23
24             if (JsonData[ReleaseId].disabled == true){
25                 return;
26             }else{
27                 console.log(ReleaseId + "を追加しました");
28             }
29
30             // セレクトボックス
31             let ReleaseIdOption = document.createElement("option");
32             ReleaseIdOption.value = ReleaseId;
33             ReleaseIdOption.innerText = ReleaseId;
34             ReleaseIdForm.insertAdjacentElement("afterbegin", ReleaseIdOption);
35         });
36
37         // URLのパラメータでリリース番号が指定されていた場合の処理
38         const ReleaseParam = GetParams()["release"];
39         let InitializeRelease = true // リリースフォームを初期化するかどうか
40
41         if (ReleaseParam){
42             //console.log(GetParams()["release"])
43             Array.from(ReleaseIdForm.options).forEach((e)=>{
44                 if (e.value.toLowerCase() === ReleaseParam.toLowerCase()){
45                     e.selected = true;
46                     InitializeRelease = false
47                 }
48             })
49         }
50
51         // GETでリリース番号が指定されていなければリリースフォームの初期化を行う
52         // 指定されていれば、その番号でエディション一覧を更新する
53         if(InitializeRelease){
54             // 「選択してください」にする
55             Array.from(ReleaseIdForm.options).slice(-1)[0].selected = true;
56
57             // エディションフォームを隠す
58             document.getElementById("editionform_div").classList.add("hidden");
59         }else{
60             Update_Edition();
61         }
62         
63
64         // ダウンロードリンクのClassを設定
65         Array.from(ReleaseIdForm.getElementsByTagName("option")).forEach((element) => {
66             element.classList.add("p-2", "cursor-pointer", "mt-1")
67         })
68
69     }
70 }
71 XmlReq.open("GET","/alter/alterlinux.json", true);
72 XmlReq.send(null);
73
74
75 // リリース番号が変更された時
76 const Update_Edition = () => {
77     let SelectedReleaseId = ReleaseIdForm.value;
78     EditionForm.innerHTML = null;
79
80     if (SelectedReleaseId == "None" || SelectedReleaseId == undefined || SelectedReleaseId == null){
81         document.getElementById("editionform_div").classList.add("hidden");
82         ShowMsg("リリース番号を選択してください");
83         return 0;
84     }else{
85         console.log("エディション一覧を" + SelectedReleaseId + "に更新しました");
86         document.getElementById("editionform_div").classList.remove("hidden");
87     }
88
89     // 選択肢を作成
90     const createOption = (value, text, selected) =>{
91         let Option = document.createElement("option");
92
93         if (! selected) {
94             selected = false;
95         }
96         Option.value = value;
97         Option.innerText = text;
98         Option.selected = selected;
99         return Option;
100     }
101
102     // 選択してくださいを追加
103     EditionForm.insertAdjacentElement("afterbegin", createOption("None", "選択してください", true))
104
105     Object.keys(JsonData[SelectedReleaseId]).forEach((EditionName) => {
106         if (EditionName != "disabled" && EditionName != "disabled-edition"){
107             //EditionOption = document.createElement("option");
108             //EditionOption.value = EditionName;
109             //EditionOption.innerText = EditionName;
110             if (JsonData[SelectedReleaseId][EditionName] == null || (JsonData[SelectedReleaseId]["disabled-edition"] && JsonData[SelectedReleaseId]["disabled-edition"].includes(EditionName)) ){
111                 console.log(`${EditionName}をスキップしました`);
112                 return;
113             }
114             EditionForm.insertAdjacentElement("afterbegin", createOption(EditionName, EditionName, false));
115         }
116     })
117
118     const EditionParam = GetParams()["edition"];
119     if (EditionParam){
120         Array.from(EditionForm.getElementsByTagName("option")).forEach((e)=>{
121             if(e.value.toLowerCase() == EditionParam.toLowerCase()){
122                 e.selected = true;
123             }
124         })
125     }
126     ShowEditionInfo();
127 }
128
129 ReleaseIdForm.addEventListener("change", (e) => {
130     Update_Edition();
131 });
132
133
134 // ダウンロードのエラーメッセージを表示する
135 const ShowMsg = (message) => {
136     const messageElement = document.getElementById("message");
137     if (message){
138         messageElement.innerText = message;
139         console.log(message);
140     }else{
141         messageElement.innerText = "";
142     }
143     
144 }
145
146 // エディションが変更された時
147 const ShowEditionInfo = () => {
148     const ReleaseId = ReleaseIdForm.value;
149     const EditionName = EditionForm.value;
150     if (ReleaseId == "None" || EditionName == "None"){
151         ShowMsg()
152         DownloadButton.classList.add("hidden")
153         return;
154     }
155     if (ReleaseId && EditionName){
156         ShowMsg(ReleaseId + "の" + EditionName + "が選択されました");
157         DownloadButton.classList.remove("hidden")
158     }else{
159         //ShowMsg();
160     }
161 }
162 EditionForm.addEventListener("change", ShowEditionInfo);
163 ReleaseIdForm.addEventListener("change", ShowEditionInfo);
164
165 //ダウンロードボタン
166 DownloadButton.addEventListener("click", (element) => {
167
168     const ReleaseId = ReleaseIdForm.value
169     const EditionName = EditionForm.value
170     if (! EditionName || EditionName == "None"){
171         ShowMsg("設定が不完全です。リリース番号とエディションを適切に指定してください。\n指定してるにも関わらずエラーが出る場合は開発者に連絡してください。");
172         return;
173     }else{
174         const OsdnId = JsonData[ReleaseId][EditionName]
175         if (OsdnId){
176             location.href = "https://osdn.net/projects/alterlinux/releases/" + OsdnId
177         }else{
178             ShowMsg(`不明なエラーが発生しました。\nリリースIDの取得に失敗しました。`)
179         }
180         
181     }
182 })