/* blueROCK - for digital rock Copyright (C) 2019 Dorian Zedler This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ import QtQuick 2.9 import QtQuick.Controls 2.4 import QtQuick.Layouts 1.3 import QtQuick.Controls.Material 2.12 import "../Components" DataListView { id: control property bool ready //% "calendar" property string title: (params.nation === "ICC" ? "IFSC":params.nation === "GER" ? "DAV":"SAC") + " " + qsTrId("#calendar") + " " + control.year property Component headerComponent: RowLayout { height: parent.height spacing: 0 ToolButton { id:yearToolBt onClicked: { control.changeYear() } text: "\uf133" font.family: fa5solid.name } ToolButton { id: filterToolBt onClicked: { var obj = app.compCats var compCats = new Array for(var prop in obj) { // go through the whole array and search for data keys if (obj.hasOwnProperty(prop) && obj[prop]["nation"] === params.nation) { //console.log("found cat: " + obj[prop]['label']) compCats.push( {"text": obj[prop]['label'], "data": obj[prop]} ) } } //% "Favorites" compCats.push( {"text": qsTrId("#favorites"), "data": {"sort_rank":0, "cat_id":[-1]}} ) compCats.sort(function(a, b) { return a['data']['sort_rank'] - b['data']['sort_rank']; }); //% "Select filters" filterSelectPu.appear(compCats, qsTrId("#selectFilters"), "") } text: "\uf0b0" font.family: fa5solid.name } ToolButton { id: cupToolBt onClicked: { control.openCup() } text: "\uf091" font.family: fa5solid.name } } property var widgetData: currentWidgetData property int year: new Date().getFullYear() property var displayedCompCats: [] property var compFavorites: [] anchors.fill: parent //boundsBehavior: Flickable.StopAtBounds model: widgetData["competitions"].length //listData: widgetData['competitions'] onRefresh: { updateData({}, false) } Component.onCompleted: { initFilters() initFavorites() if(model && widgetData["competitions"].length > 0){ control.status = 200 control.ready = true } else if(widgetData["competitions"].length === 0) { control.status = 404 control.ready = false } else { control.ready = false control.status = 901 return } autoScroll() } onWidgetDataChanged: { // if the IFSC Calendar is open -> add the worldranking if(params.nation === "ICC"){ control.widgetData['cups'].unshift({"SerId":"","rkey":"","name":"Worldranking","modified":"2018-10-24 16:11:12","modifier":"","year":"","num_comps":"","cats":["ICC-COA","ICC-HD","ICC-MED","ICC_F","ICC_FB","ICC_FS","ICC_M","ICC_MB","ICC_MS"]}) } } function autoScroll() { // function to scroll to the next competition that is not already over var compList = control.widgetData["competitions"] //console.log("scrolling") if(parseInt(control.year) === new Date().getFullYear()){ for(var i = 0; i < compList.length; i ++){ // get the start date of the competition var startDate = Date.fromLocaleString(Qt.locale(), compList[i]["date"], "yyyy-MM-dd") //control.widgetData["competitions"][i]["month"] = startDate.getMonth() //console.log("got date: " + startDate + " from string: " + compList[i]["date"] + " -> month is: " + compList[i]["month"]) // get the duration of the competition var durationString = compList[i]["duration"] === undefined ? "1":compList[i]["duration"] var days = parseInt(durationString.replace(/\D/g,'')) // calculate the end date of the competition var endDate = new Date(startDate.valueOf()) endDate.setDate(endDate.getDate() + days); //console.log(compList[i]["date"] + ": " + startDate + " to " + endDate) if(endDate.getTime() < new Date().getTime()){ // end date is already over -> move the list view down! control.positionViewAtIndex(i - 2, ListView.Top) //console.log("moving down!") } } //control.widgetData = control.widgetData } else { //console.log("not current year") } } function getCompCatData(compCatId) { var obj = app.compCats for(var prop in obj) { // go through the whole array and search for data keys if (obj.hasOwnProperty(prop) && obj[prop]["cat_id"].indexOf(compCatId) >= 0) { //console.log("found cat: " + obj[prop]['label']) return obj[prop] } } } function openComp(compIndex){ var cats = control.widgetData["competitions"][compIndex]["cats"] cats.sort(function(a, b) { return parseInt(a["GrpId"]) - parseInt(b["GrpId"]); }); var selectOptions = [] for(var prop in cats){ if (cats.hasOwnProperty(prop)) { selectOptions.push({text: cats[prop]["name"], data:{cat: cats[prop]["GrpId"], comp: control.widgetData["competitions"][compIndex]["WetId"], status:cats[prop]["status"]}}) } } var infoUrls = getCompInfoUrls(compIndex) var infosheet = ""; if(infoUrls.length >= 1) //% "Infosheet" infosheet += ("" + qsTrId("#infosheet") + "") if(infoUrls.length === 2) //% "Further infos" infosheet += (", " + qsTrId("#furtherInfos") + "") console.log("Infosheet: " + infosheet) var eventWebsite = control.widgetData["competitions"][compIndex]["homepage"] !== undefined ? //% "Event website" ("" + qsTrId("#eventWebsite") + ""):"" selector.appear(selectOptions, control.widgetData["competitions"][compIndex]['name'], eventWebsite + ((eventWebsite !== "" && infosheet !== "") ? ", ":"") + infosheet ) } function changeYear(){ var years = control.widgetData["years"] var selectOptions = [] for(var prop in years){ if (years.hasOwnProperty(prop)) { selectOptions.push({text: years[prop], data:{year: years[prop]}}) } } //% "Select year" selector.appear(selectOptions, qsTrId("#selectYear")) } function openCup(state, data) { var cups = control.widgetData["cups"] var prop var selectOptions = [] var selectTitle = "" if(state === undefined){ // opened for the first time -> select cup //% "Select cup" selectTitle = qsTrId("#selectCup") cups.sort(function(a, b) { return parseInt(b["SerId"]) - parseInt(a["SerId"]); }); for(prop in cups){ if (cups.hasOwnProperty(prop)) { selectOptions.push({text: cups[prop]["name"], data:{cup: cups[prop]["SerId"]}}) } } } else if(state === 1){ // opened for the second time -> select cat var cup // find the selected cup for(prop in cups){ if (cups.hasOwnProperty(prop) && cups[prop]['SerId'] === data.cup) { cup = cups[prop] } } if(cup === undefined){ // cup was not found return } //% "Select category" selectTitle = cup['name'] + ": " + qsTrId("#selectCategory") // build a list with all cat in the cup out of the cat keys (rkey) given in the cup.cats for(prop in cup['cats']){ if (cup['cats'].hasOwnProperty(prop)) { // search the rkey in the cat list for(var i = 0; i < control.widgetData["cats"].length; i ++ ){ if(control.widgetData["cats"][i]["rkey"] === cup["cats"][prop] && control.widgetData["cats"][i]["sex"] !== undefined){ // found it -> append it to the select list var catName = control.widgetData["cats"][i]["name"] // name of cat var catId = control.widgetData["cats"][i]["GrpId"] // id of cat selectOptions.push({text: catName, data:{cup: data.cup, cat: catId}}) } } } } } selector.appear(selectOptions, selectTitle) } function getCompInfoUrls(compIndex) { var urls = []; if(control.widgetData["competitions"][compIndex].hasOwnProperty("info")) { if(params.nation === "GER") urls.push("http://ranking.alpenverein.de/" + control.year + "/GER/" + control.widgetData["competitions"][compIndex]['rkey'] + ".pdf") else urls.push(control.widgetData["competitions"][compIndex]['info']) } if(control.widgetData["competitions"][compIndex].hasOwnProperty("info2")) { if(params.nation === "GER") urls.push("http://ranking.alpenverein.de/" + control.year + "/GER/i" + control.widgetData["competitions"][compIndex]['rkey'] + ".pdf") else urls.push(control.widgetData["competitions"][compIndex]['info2']) } return urls; } function filterCats(display, cats) { //console.log("filtering cats: " + cats + " displaying: " + display) for(var i = 0; i < cats.length; i ++){ if(control.displayedCompCats.indexOf(cats[i]) >= 0 && !display){ control.displayedCompCats.splice(control.displayedCompCats.indexOf(cats[i]), 1) } else if(control.displayedCompCats.indexOf(cats[i]) == -1 && display){ control.displayedCompCats.push(cats[i]) } } // trigger 'changed' signal control.displayedCompCats = control.displayedCompCats appSettings.write("displayedCompCats"+params.nation, JSON.stringify(displayedCompCats)) //console.log("new JSON string is: " + JSON.stringify(displayedCompCats)) //console.log("displayed cats is now: " + control.displayedCompCats) } function initFilters() { if(appSettings.read("displayedCompCats"+params.nation) !== "false"){ //console.log(appSettings.read("displayedCompCats"+params.nation)) control.displayedCompCats = JSON.parse(appSettings.read("displayedCompCats"+params.nation)) } if(control.displayedCompCats.length === 0){ var obj = app.compCats var compCats = new Array for(var prop in obj) { // go through the whole array and search for data keys if (obj.hasOwnProperty(prop) && obj[prop]["nation"] === params.nation) { //console.log("found cat: " + obj[prop]['label']) filterCats(true, obj[prop]['cat_id']) } } } // trigger 'changed' signal control.displayedCompCats = control.displayedCompCats //console.log(control.displayedCompCats) } function editFavorites(favorite, compId) { if(control.compFavorites.indexOf(compId) >= 0 && !favorite) { control.compFavorites.splice( control.compFavorites.indexOf(compId), 1) } else if(control.compFavorites.indexOf(compId) < 0 && favorite) { control.compFavorites.push(compId) } appSettings.write("compFavorites", JSON.stringify(control.compFavorites)) // trigger 'changed' signal control.compFavorites = control.compFavorites } function initFavorites() { if(appSettings.read("compFavorites") !== "false"){ //console.log(appSettings.read("displayedCompCats"+params.nation)) control.compFavorites = JSON.parse(appSettings.read("compFavorites")) } else { control.compFavorites = [] appSettings.write("compFavorites", JSON.stringify(control.compFavorites)) } // trigger 'changed' signal control.compFavorites = control.compFavorites console.log(control.compFavorites) } Connections { target: parent.selector function onSelectionFinished(index, data) { if(data.comp !== undefined){ app.openWidget({comp: data.comp, cat: data.cat, type:data.status === 4 ? 'starters':''}) } else if(data.year !== undefined){ updateData({year: data.year}, true) control.year = data.year } else if(data.cup !== undefined && data.cat === undefined){ control.openCup(1,data) } else if(data.cup !== undefined && data.cat !== undefined){ app.openWidget({cup: data.cup, cat: data.cat}) } } function onLinkActivated(link) { Qt.openUrlExternally(link) } } header: Item { id: topSpacerItm width: parent.width height: 10 } footer: Item { id: bottomSpacerItm width: parent.width height: 10 } delegate: CompetitionCalendarDelegate { } SelectorPopup { id: filterSelectPu Material.theme: control.Material.theme contentItem: ListView { id: selectorLv property int delegateHeight: 50 spacing: 10 clip: true implicitHeight: model === 0 ? 0:(delegateHeight + spacing) * model model: filterSelectPu.dataObj !== undefined ? filterSelectPu.dataObj.length:0 ScrollIndicator.vertical: ScrollIndicator { parent: selectorLv.parent anchors { top: selectorLv.top left: selectorLv.right margins: 10 leftMargin: 3 bottom: selectorLv.bottom } } delegate: CheckDelegate { id: catBt width: selectorLv.width height: text !== "" ? selectorLv.delegateHeight:0 //flat: true text: filterSelectPu.dataObj[index].text Component.onCompleted: { checked = getCheckedState() } Connections { target: control function onDisplayedCompCatsChanged() { //console.log("filters changed") //competitionDel.visible = control.displayedCompCats.indexOf(parseInt(competitionDel.thisData['cat_id'])) >= 0 checked = getCheckedState() } } function getCheckedState() { for(var i = 0; i < filterSelectPu.dataObj[index].data.cat_id.length; i ++){ //console.log("checking cat " + filterSelectPu.dataObj[index].data.label ) if(control.displayedCompCats.indexOf(filterSelectPu.dataObj[index].data.cat_id[i] ) >= 0){ return true } } return false } onClicked: { control.filterCats(checked, filterSelectPu.dataObj[index].data.cat_id) if(control.displayedCompCats.length == 0){ control.filterCats(true, filterSelectPu.dataObj[index].data.cat_id) checked = true } } } } } }