mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-29 13:06:44 +00:00
Import/Export GUI
This commit is contained in:
committed by
Michal Horejsek
parent
1c10cc5065
commit
7e5e3d3dd4
@ -210,7 +210,7 @@ Window {
|
||||
|
||||
|
||||
Component.onCompleted : {
|
||||
testgui.winMain.x = 150
|
||||
testgui.winMain.x = 350
|
||||
testgui.winMain.y = 100
|
||||
}
|
||||
|
||||
@ -230,7 +230,7 @@ Window {
|
||||
}
|
||||
|
||||
ListModel{
|
||||
id: structureExternal
|
||||
id: structureExternalOFF
|
||||
|
||||
property var globalOptions: JSON.parse('{ "folderId" : "global--uniq" , "folderName" : "" , "folderColor" : "" , "folderType" : "" , "folderEntries" : 0, "fromDate": 0, "toDate": 0, "isFolderSelected" : false , "targetFolderID": "14" , "targetLabelIDs": ";20;29" }')
|
||||
|
||||
@ -265,7 +265,7 @@ Window {
|
||||
}
|
||||
|
||||
ListModel{
|
||||
id: structurePM
|
||||
id: structurePMOFF
|
||||
|
||||
// group selectors
|
||||
property bool selectedLabels : false
|
||||
@ -328,6 +328,7 @@ Window {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function setTypeSelected (model, folderType , toSelect ) {
|
||||
console.log(" select type ", folderType, toSelect)
|
||||
for (var i= -1; i<model.count; i++) {
|
||||
@ -457,6 +458,355 @@ Window {
|
||||
ListElement{ mailSubject : "Pop art is cool again" ; mailDate : "March 2 , 2019 12 : 00 : 22" ; inputFolder : "Archive" ; mailFrom : "me@me.me" ; errorMessage : "Something went wrong and import retry was not successful" ; }
|
||||
ListElement{ mailSubject : "Check this cute kittens play volleyball on Copacabanana beach" ; mailDate : "March 2 , 2019 12 : 00 : 22" ; inputFolder : "Archive" ; mailFrom : "me@me.me" ; errorMessage : "Something went wrong and import retry was not successful" ; }
|
||||
}
|
||||
|
||||
// Transfer rules
|
||||
ListModel {
|
||||
id: transferRules
|
||||
|
||||
property var targets : new Object();
|
||||
|
||||
// test data for import
|
||||
property var importRules : JSON.parse('[
|
||||
{"isActive" : true , "mboxID" : "src1" , "fromDate" : 0 , "toDate" : 0 , "targetIDs" : [ "0" , "label1" ] } ,
|
||||
{"isActive" : true , "mboxID" : "src2" , "fromDate" : 0 , "toDate" : 0 , "targetIDs" : [ "6" , "label2" ] } ,
|
||||
{"isActive" : true , "mboxID" : "src3" , "fromDate" : 350000 , "toDate" : 5000000 , "targetIDs" : [ "folder1" ] } ,
|
||||
{"isActive" : true , "mboxID" : "src4" , "fromDate" : 0 , "toDate" : 0 , "targetIDs" : [ "folder2" , "label1" , "label2" ] }
|
||||
]')
|
||||
|
||||
property var selectedForExport : [ "0", "7", "folder1", "folde2", "label1", "label2", "label3"]
|
||||
|
||||
property var extMailboxes: JSON.parse('{
|
||||
"src1": {"name" : "Source Inbox" , "type" : "external" , "color" : "#000"} ,
|
||||
"src2": {"name" : "Source Sent" , "type" : "external" , "color" : "#000"} ,
|
||||
"src3": {"name" : "Source Folder" , "type" : "external" , "color" : "#000"} ,
|
||||
"src4": {"name" : "Source Trash" , "type" : "external" , "color" : "#000"}
|
||||
}')
|
||||
|
||||
property var pmMailboxes : JSON.parse('{
|
||||
"0": {"name" : "Inbox" , "type" : "system" , "color" : "#000"} ,
|
||||
"3": {"name" : "Draft" , "type" : "system" , "color" : "#000"} ,
|
||||
"6": {"name" : "Archive" , "type" : "system" , "color" : "#000"} ,
|
||||
"5": {"name" : "All Mail" , "type" : "system" , "color" : "#000"} ,
|
||||
"3": {"name" : "Trash" , "type" : "system" , "color" : "#000"} ,
|
||||
"7": {"name" : "Sent" , "type" : "system" , "color" : "#000"} ,
|
||||
"4": {"name" : "Spam" , "type" : "system" , "color" : "#000"} ,
|
||||
|
||||
"folder1": {"name": "Folder 1", "type":"folder", "color":"#57c"},
|
||||
"folder2": {"name": "Folder 2", "type":"folder", "color":"#5c7"},
|
||||
"folder3": {"name": "Folder 3", "type":"folder", "color":"#c57"},
|
||||
|
||||
"label1": {"name": "Label 1", "type":"label", "color":"#a5a"},
|
||||
"label2": {"name": "Label 2", "type":"label", "color":"#5aa"},
|
||||
"label3": {"name": "Label 3", "type":"label", "color":"#aa5"}
|
||||
}')
|
||||
|
||||
ListElement{isActive : true ; mboxID : "source1" ; name : "Source folder 1" ; iconColor : "#cccccc" ; type : "external" ; fromDate : 0 ; toDate : 0 ; labelColors : "red ; green ; blue"}
|
||||
ListElement{isActive : false ; mboxID : "source2" ; name : "Source folder 2" ; iconColor : "#cccccc" ; type : "external" ; fromDate : 300000 ; toDate : 15000000 ; labelColors : "red ; green ; blue"}
|
||||
ListElement{isActive : true ; mboxID : "source3" ; name : "Source folder 4" ; iconColor : "#cccccc" ; type : "external" ; fromDate : 0 ; toDate : 0 ; labelColors : "red ; green ; blue"}
|
||||
|
||||
|
||||
// TransferRules INTERFACE
|
||||
|
||||
// TransferRules properties
|
||||
property int globalFromDate : 0 // 45000
|
||||
property int globalToDate : 0 // 120000
|
||||
property bool isLabelGroupSelected : false
|
||||
property bool isFolderGroupSelected : false
|
||||
|
||||
// TransferRules default getters
|
||||
// func (*TransferRules) count() int
|
||||
// func (*TransferRules) roleNames() map[int] QByteArray
|
||||
// func (*TransferRules) data(index, role) *QVariant
|
||||
//
|
||||
// Expected roles for TransferRules
|
||||
//
|
||||
// isActive bool
|
||||
// mboxID string // constant
|
||||
// name string // constant
|
||||
// type string // constant, expected values: "label", "folder", ""
|
||||
// iconColor string // constant
|
||||
// fromDate int64
|
||||
// toDate int64
|
||||
// labelColors string // list of hex RGB strings delimited by `;`
|
||||
|
||||
|
||||
|
||||
// TransferRules custom getters
|
||||
|
||||
function targetFolders(sourceID) {
|
||||
//ListElement{isActive: true; mboxID: "target1"; name: "Target system folder"; type: "system"; iconColor:"red"}
|
||||
return getTargets(sourceID, "folder")
|
||||
}
|
||||
|
||||
function targetLabels(sourceID) {
|
||||
//ListElement{isActive: false; mboxID: "target3"; name: "Target custom label 1"; type: "label"; iconColor:"green"}
|
||||
return getTargets(sourceID, "label")
|
||||
}
|
||||
|
||||
// For target drop down menu (labels and folders) we need
|
||||
// additional model TargetList (QAbstractListModel).
|
||||
//
|
||||
// func (*TransferRules) targetFolders(sourceID string) * QAbstractListModel
|
||||
//
|
||||
// There is no setter functions for this list all actions are
|
||||
// handled by TransferRules.
|
||||
//
|
||||
// The target models have therefore only data functions and one property as interface:
|
||||
//
|
||||
// TargetList properties:
|
||||
// property int selectedIndex : -1
|
||||
//
|
||||
// TargetList default getters
|
||||
// func (*TargetList) count() int
|
||||
// func (*TargetList) roleNames() map[int] QByteArray
|
||||
// func (*TargetList) data(index, role) *QVariant
|
||||
//
|
||||
// Expected roles for TargetList
|
||||
//
|
||||
// isActive bool
|
||||
// mboxID string // constant
|
||||
// name string // constant
|
||||
// type string // constant, expected values: "label", "folder", ""
|
||||
// iconColor string // constant
|
||||
//
|
||||
// The tricky part here is the QAbstractListModel implemetation: it
|
||||
// needs to return all targets of certain type and their index.
|
||||
|
||||
// Setters
|
||||
function setIsRuleActive(srcID, isActive){
|
||||
console.log("setIsRuleActive", srcID, isActive)
|
||||
var groupLabelsSelected = true
|
||||
var groupFoldersSelected = true
|
||||
for (var i = 0; i < transferRules.count; i++) {
|
||||
var rule = transferRules.get(i)
|
||||
if (rule.mboxID ==srcID) rule.isActive = isActive;
|
||||
if (!rule.isActive && rule.type == "label") groupLabelsSelected = false
|
||||
if (!rule.isActive && rule.type == "folder") groupFoldersSelected = false
|
||||
}
|
||||
transferRules.isLabelGroupSelected = groupLabelsSelected
|
||||
transferRules.isFolderGroupSelected = groupFoldersSelected
|
||||
}
|
||||
|
||||
function setIsGroupActive(groupName,isActive){
|
||||
console.log("setIsGroupActive", groupName, isActive)
|
||||
var groupLabelsSelected = true
|
||||
var groupFoldersSelected = true
|
||||
for (var i = 0; i < transferRules.count; i++) {
|
||||
var rule = transferRules.get(i)
|
||||
if (rule.type == groupName) rule.isActive = isActive;
|
||||
if (!rule.isActive && rule.type == "label") groupLabelsSelected = false
|
||||
if (!rule.isActive && rule.type == "folder") groupFoldersSelected = false
|
||||
}
|
||||
transferRules.isLabelGroupSelected = groupLabelsSelected
|
||||
transferRules.isFolderGroupSelected = groupFoldersSelected
|
||||
}
|
||||
|
||||
function setFromToDate(srcID, fromDate, toDate){
|
||||
console.log("setFromToDate", srcID, fromDate, toDate)
|
||||
for (var i = 0; i < transferRules.count; i++) {
|
||||
var rule = transferRules.get(i)
|
||||
if (rule.mboxID ==srcID) {
|
||||
rule.fromDate = fromDate
|
||||
rule.toDate = toDate
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function addTargetID(srcID, targetID){
|
||||
console.log("addTargetID", srcID, targetID)
|
||||
changeTargetID(srcID, targetID, true)
|
||||
}
|
||||
|
||||
function removeTargetID(srcID, targetID){
|
||||
console.log("removeTargetID", srcID, targetID)
|
||||
changeTargetID(srcID, targetID, false)
|
||||
}
|
||||
|
||||
|
||||
// MOCK METHODS: NOT PART OF INTERFACE
|
||||
|
||||
Component.onCompleted: prepareImport()
|
||||
|
||||
// Fill model with import rules
|
||||
function prepareImport() {
|
||||
console.log(" ==== Prepare IMPORT ==== ")
|
||||
console.trace()
|
||||
transferRules.clear()
|
||||
for (var ruleI in transferRules.importRules) {
|
||||
var rule = transferRules.importRules[ruleI]
|
||||
var src = transferRules.extMailboxes[rule.mboxID];
|
||||
|
||||
var labelColors = [];
|
||||
for (var tid in rule.targetIDs) {
|
||||
var targetID = rule.targetIDs[tid]
|
||||
if (pmMailboxes[targetID].type == "label") {
|
||||
labelColors.push(pmMailboxes[targetID]["color"])
|
||||
}
|
||||
}
|
||||
|
||||
transferRules.append({
|
||||
"isActive" : rule.isActive,
|
||||
"mboxID" : rule.mboxID,
|
||||
"name" : src.name,
|
||||
"type" : src.type,
|
||||
"iconColor" : src["color"],
|
||||
"fromDate" : rule.fromDate,
|
||||
"toDate" : rule.toDate,
|
||||
"labelColors" : labelColors.join(";"),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Fill model with export rules
|
||||
function prepareExport() {
|
||||
console.log(" ==== Prepare EXPORT ==== ")
|
||||
console.trace()
|
||||
transferRules.clear()
|
||||
var groupLabelsSelected = true
|
||||
var groupFoldersSelected = true
|
||||
for (var srcID in transferRules.pmMailboxes) {
|
||||
var src = transferRules.pmMailboxes[srcID]
|
||||
|
||||
var isActive = transferRules.selectedForExport.find(function(mboxID){return mboxID == srcID}) !== undefined
|
||||
|
||||
transferRules.append({
|
||||
"isActive" : isActive,
|
||||
"mboxID" : srcID,
|
||||
"name" : src.name,
|
||||
"type" : (src.type == "system" ? "" : src["type"]),
|
||||
"iconColor" : src["color"],
|
||||
"fromDate" : 0,
|
||||
"toDate" : 0,
|
||||
"labelColors" : src["color"]
|
||||
});
|
||||
|
||||
if (!isActive) {
|
||||
if (src.type == "label") {
|
||||
groupLabelsSelected = false
|
||||
}
|
||||
if (src.type == "folder") {
|
||||
groupFoldersSelected = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
transferRules.isLabelGroupSelected = groupLabelsSelected
|
||||
transferRules.isFolderGroupSelected = groupFoldersSelected
|
||||
}
|
||||
|
||||
function getTargets(sourceID, type) {
|
||||
console.log("get targets:", type, sourceID)
|
||||
|
||||
if (! (type+sourceID in transferRules.targets)){
|
||||
var source;
|
||||
|
||||
for (var srcI in transferRules.importRules) {
|
||||
source = transferRules.importRules[srcI]
|
||||
if (source.mboxID == sourceID ) {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
var model = Qt.createQmlObject ('import QtQuick 2.3; ListModel { property int selectedIndex: -1; }', transferRules);
|
||||
|
||||
var i = -1
|
||||
for (var tgtID in transferRules.pmMailboxes) {
|
||||
var tgt = transferRules.pmMailboxes[tgtID]
|
||||
|
||||
if (type == "label" && tgt.type != "label") continue
|
||||
if (type != "label" && tgt.type == "label") continue
|
||||
|
||||
i++;
|
||||
|
||||
|
||||
var isActive = false
|
||||
for (var tid in source.targetIDs ) {
|
||||
var selectedID = source.targetIDs[tid]
|
||||
if (selectedID == tgtID) {
|
||||
isActive = true
|
||||
model.selectedIndex=i
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
var row = {
|
||||
"isActive" : isActive,
|
||||
"mboxID" : tgtID,
|
||||
"name" : tgt.name,
|
||||
"type" : tgt.type,
|
||||
"iconColor" : tgt["color"]
|
||||
};
|
||||
|
||||
model.append (row) ;
|
||||
}
|
||||
|
||||
transferRules.targets[type+sourceID] = model;
|
||||
}
|
||||
|
||||
return transferRules.targets[type+sourceID];
|
||||
}
|
||||
|
||||
function changeTargetID(srcID, targetID, add){
|
||||
console.log("change target ID ", srcID, targetID, add)
|
||||
for (var targetsName in transferRules.targets) {
|
||||
var targets = transferRules.targets[targetsName]
|
||||
var areFolders = targetsName == "folder"+srcID
|
||||
var areLabels = targetsName == "label"+srcID
|
||||
if (areFolders || areLabels) {
|
||||
console.log("matched targets ", targetsName, targets)
|
||||
var deactivateOthers = false
|
||||
var colorList = []
|
||||
for (var i =0; i<targets.count; i++) {
|
||||
var tgt = targets.get(i)
|
||||
console.log(" tgt", i, tgt.mboxID, tgt.isActive)
|
||||
if (tgt.mboxID == targetID) {
|
||||
console.log(" matched tgt", i, tgt.mboxID)
|
||||
if (areFolders && !add) {
|
||||
console.exception("WRONG LOGIC: removing folder")
|
||||
}
|
||||
if (add) {
|
||||
targets.selectedIndex=i
|
||||
}
|
||||
|
||||
tgt.isActive = add
|
||||
deactivateOthers = add && areFolders
|
||||
console.log(" active ", tgt.isActive)
|
||||
}
|
||||
if (areLabels && tgt.isActive) {
|
||||
colorList.push(tgt.iconColor)
|
||||
console.log(" colors", i, colorList)
|
||||
}
|
||||
}
|
||||
|
||||
if (areLabels) {
|
||||
if (colorList.length == 0){
|
||||
targets.selectedIndex = -1
|
||||
}
|
||||
for (var i = 0; i<transferRules.count; i++) {
|
||||
var rule = transferRules.get(i)
|
||||
console.log (" are labels: color list", i, rule.mboxID )
|
||||
if (rule.mboxID == srcID) {
|
||||
rule.labelColors = colorList.join(";")
|
||||
console.log("updated label color list", rule.labelColors)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (deactivateOthers) {
|
||||
for (var i =0; i<targets.count; i++) {
|
||||
var tgt = targets.get(i)
|
||||
if (tgt.mboxID != targetID) {
|
||||
tgt.isActive = false
|
||||
console.log(" deactivate ", tgt.mboxID, tgt.isActive)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -497,6 +847,14 @@ Window {
|
||||
|
||||
signal toggleMainWin(int systX, int systY, int systW, int systH)
|
||||
|
||||
|
||||
|
||||
signal notifyHasNoKeychain()
|
||||
signal notifyKeychainRebuild()
|
||||
signal notifyAddressChangedLogout()
|
||||
signal notifyAddressChanged()
|
||||
signal notifyUpdate()
|
||||
|
||||
signal showWindow()
|
||||
signal showHelp()
|
||||
signal showQuit()
|
||||
@ -692,8 +1050,8 @@ Window {
|
||||
go.animateProgressBar.resume()
|
||||
}
|
||||
|
||||
function cancelProcess(clearUnfinished) {
|
||||
console.log("stopped at ", go.progress, " clearing unfinished", clearUnfinished)
|
||||
function cancelProcess() {
|
||||
console.log("stopped at ", go.progress)
|
||||
go.animateProgressBar.stop()
|
||||
}
|
||||
|
||||
@ -718,6 +1076,7 @@ Window {
|
||||
break;
|
||||
|
||||
case "loadStructureForExport" :
|
||||
transferRules.prepareExport()
|
||||
go.exportStructureLoadFinished(true)
|
||||
break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user