forked from lubuwest/Friendiqa
create and delete events
This commit is contained in:
parent
27cd83db3c
commit
400241ec6a
34 changed files with 1346 additions and 614 deletions
391
source-linux/qml/calendarqml/EventCreate.qml
Normal file
391
source-linux/qml/calendarqml/EventCreate.qml
Normal file
|
@ -0,0 +1,391 @@
|
|||
// This file is part of Friendiqa
|
||||
// https://git.friendi.ca/lubuwest/Friendiqa
|
||||
// Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
// In addition, as a special exception, the copyright holders give
|
||||
// permission to link the code of portions of this program with the
|
||||
// OpenSSL library under certain conditions as described in each
|
||||
// individual source file, and distribute linked combinations including
|
||||
// the two.
|
||||
//
|
||||
// You must obey the GNU General Public License in all respects for all
|
||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
||||
// exception, you may extend this exception to your version of the
|
||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
||||
// so, delete this exception statement from your version. If you delete
|
||||
// this exception statement from all source files in the program, then
|
||||
// also delete it here.
|
||||
//
|
||||
// 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Controls 2.12
|
||||
import QtQuick.Controls.Material 2.12
|
||||
import QtQuick.Controls 1.4 as Oldcontrols
|
||||
import "qrc:/js/service.js" as Service
|
||||
import "qrc:/js/helper.js" as Helperjs
|
||||
import "qrc:/qml/genericqml"
|
||||
import "qrc:/qml/calendarqml"
|
||||
|
||||
Rectangle{
|
||||
id:eventCreateBox
|
||||
color: Material.backgroundColor
|
||||
property date startDate: new Date()
|
||||
|
||||
function formatText(count, modelData) {
|
||||
var data = count === 12 ? modelData + 1 : modelData;
|
||||
return data.toString().length < 2 ? "0" + data : data;
|
||||
}
|
||||
|
||||
MButton{
|
||||
id:closeButton
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 1*mm
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 1*mm
|
||||
text: "\uf057"
|
||||
onClicked:{rootstackView.pop()}
|
||||
}
|
||||
|
||||
Label{
|
||||
x: 0.5*root.fontFactor*osSettings.bigFontSize
|
||||
y: 2*root.fontFactor*osSettings.bigFontSize
|
||||
width: 3*root.fontFactor*osSettings.bigFontSize
|
||||
height: root.fontFactor*osSettings.bigFontSize
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
//verticalAlignment: TextInput.AlignBottom
|
||||
color: Material.primaryTextColor
|
||||
text:qsTr("Start")
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: textStartDate
|
||||
property string dateDay:(startDate.getDate()).toString().length<2?"0"+(startDate.getDate()):(startDate.getDate())
|
||||
property string dateMonth: (startDate.getMonth()+1).toString().length<2?"0"+(startDate.getMonth()+1):(startDate.getMonth()+1)
|
||||
x: 4*root.fontFactor*osSettings.bigFontSize
|
||||
y: root.fontFactor*osSettings.bigFontSize
|
||||
width: 5*root.fontFactor*osSettings.bigFontSize
|
||||
height: 2.5*root.fontFactor*osSettings.bigFontSize
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
horizontalAlignment: TextInput.AlignRight
|
||||
text: dateDay+"-"+dateMonth+"-"+startDate.getFullYear()
|
||||
inputMask: "99-99-9999"
|
||||
validator: RegExpValidator{regExp: /^([0-2\s]?[0-9\s]|3[0-1\s])-(0[0-9\s]|1[0-2\s])-([0-9\s][0-9\s][0-9\s][0-9\s])$ / }
|
||||
font.bold: true
|
||||
}
|
||||
|
||||
MButton {
|
||||
id: textStartDateDropdown
|
||||
x: 9.5*root.fontFactor*osSettings.bigFontSize
|
||||
y: root.fontFactor*osSettings.bigFontSize
|
||||
width: 2*root.fontFactor*osSettings.bigFontSize
|
||||
height: 2*root.fontFactor*osSettings.bigFontSize
|
||||
text:"\uf0d7"
|
||||
onClicked:{
|
||||
cal.visible=true;
|
||||
cal.curSelection="start"
|
||||
}
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: textStartTime
|
||||
x: 13*root.fontFactor*osSettings.bigFontSize
|
||||
y: root.fontFactor*osSettings.bigFontSize
|
||||
width: 3*root.fontFactor*osSettings.bigFontSize
|
||||
height: 2.5*root.fontFactor*osSettings.bigFontSize
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
inputMask: "99:99"
|
||||
text: "00:00"
|
||||
horizontalAlignment: TextInput.AlignRight
|
||||
validator: RegExpValidator{regExp: /^([0-1\s]?[0-9\s]|2[0-3\s]):([0-5\s][0-9\s])$ / }
|
||||
font.bold: true
|
||||
}
|
||||
|
||||
MButton {
|
||||
id: textStartTimeDropdown
|
||||
x: 16.5*root.fontFactor*osSettings.bigFontSize
|
||||
y: root.fontFactor*osSettings.bigFontSize
|
||||
width: 2*root.fontFactor*osSettings.bigFontSize
|
||||
height: 2*root.fontFactor*osSettings.bigFontSize
|
||||
text:"\uf0d7"
|
||||
onClicked:{
|
||||
onClicked: {timeTumbler.visible=true;timeTumbler.curSelection="start"}
|
||||
}
|
||||
}
|
||||
|
||||
Label{
|
||||
x: 0.5*root.fontFactor*osSettings.bigFontSize
|
||||
y: 4*root.fontFactor*osSettings.bigFontSize
|
||||
width: 3*root.fontFactor*osSettings.bigFontSize
|
||||
height: root.fontFactor*osSettings.bigFontSize
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
color: Material.primaryTextColor
|
||||
text:qsTr("End")
|
||||
}
|
||||
TextField {
|
||||
id: textEndDate
|
||||
x: 4*root.fontFactor*osSettings.bigFontSize
|
||||
y: 3*root.fontFactor*osSettings.bigFontSize
|
||||
width: 5*root.fontFactor*osSettings.bigFontSize
|
||||
height: 2.5*root.fontFactor*osSettings.bigFontSize
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
horizontalAlignment: TextInput.AlignRight
|
||||
inputMask: "99-99-9999"
|
||||
validator: RegExpValidator{regExp: /^([0-2\s]?[0-9\s]|3[0-1\s])-(0[0-9\s]|1[0-2\s])-([0-9\s][0-9\s][0-9\s][0-9\s])$ / }
|
||||
enabled: false
|
||||
font.bold: true
|
||||
}
|
||||
|
||||
MButton {
|
||||
id: textEndDateDropdown
|
||||
x: 9.5*root.fontFactor*osSettings.bigFontSize
|
||||
y: 3*root.fontFactor*osSettings.bigFontSize
|
||||
width: 2*root.fontFactor*osSettings.bigFontSize
|
||||
height: 2*root.fontFactor*osSettings.bigFontSize
|
||||
enabled: false
|
||||
text:"\uf0d7"
|
||||
onClicked:{
|
||||
cal.visible=true;
|
||||
cal.curSelection="end"
|
||||
}
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: textEndTime
|
||||
x: 13*root.fontFactor*osSettings.bigFontSize
|
||||
y: 3*root.fontFactor*osSettings.bigFontSize
|
||||
width: 3*root.fontFactor*osSettings.bigFontSize
|
||||
height: 2.5*root.fontFactor*osSettings.bigFontSize
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
enabled: false
|
||||
horizontalAlignment: TextInput.AlignRight
|
||||
inputMask: "99:99"
|
||||
validator: RegExpValidator{regExp: /^([0-1\s]?[0-9\s]|2[0-3\s]):([0-5\s][0-9\s])$ / }
|
||||
font.bold: true
|
||||
}
|
||||
|
||||
MButton {
|
||||
id: textEndTimeDropdown
|
||||
x: 16.5*root.fontFactor*osSettings.bigFontSize
|
||||
y: 3*root.fontFactor*osSettings.bigFontSize
|
||||
width: 2*root.fontFactor*osSettings.bigFontSize
|
||||
height: 2*root.fontFactor*osSettings.bigFontSize
|
||||
enabled: false
|
||||
text:"\uf0d7"
|
||||
onClicked:{
|
||||
onClicked: {timeTumbler.visible=true;timeTumbler.curSelection="end"}
|
||||
}
|
||||
}
|
||||
|
||||
Column{
|
||||
x: 4*root.fontFactor*osSettings.bigFontSize
|
||||
y: 6*root.fontFactor*osSettings.bigFontSize
|
||||
width: parent.width-7*root.fontFactor*osSettings.bigFontSize
|
||||
Oldcontrols.Calendar{
|
||||
id:cal
|
||||
property string curSelection: "start"
|
||||
width: 12*root.fontFactor*osSettings.bigFontSize
|
||||
height: 15*root.fontFactor*osSettings.bigFontSize
|
||||
visible: false
|
||||
selectedDate: new Date()
|
||||
onClicked: {
|
||||
if (curSelection=="start"){
|
||||
textStartDate.text=Qt.formatDate(cal.selectedDate, "dd-MM-yyyy");
|
||||
}else{
|
||||
textEndDate.text=Qt.formatDate(cal.selectedDate, "dd-MM-yyyy");
|
||||
}
|
||||
cal.visible=false
|
||||
}
|
||||
}
|
||||
|
||||
Frame {
|
||||
id: timeTumbler
|
||||
width: 12*root.fontFactor*osSettings.bigFontSize
|
||||
height: 10*root.fontFactor*osSettings.bigFontSize
|
||||
visible: false
|
||||
property string curSelection: "start"
|
||||
|
||||
Row {
|
||||
Tumbler {
|
||||
id: hoursTumbler
|
||||
model: 24
|
||||
delegate: tumblerDelegateComponent
|
||||
currentIndex: 12
|
||||
}
|
||||
Tumbler {
|
||||
id: minutesTumbler
|
||||
model: 60
|
||||
delegate: tumblerDelegateComponent
|
||||
}
|
||||
}
|
||||
MButton {
|
||||
id: timeInputfinished
|
||||
width: 2*root.fontFactor*osSettings.bigFontSize
|
||||
height: 2*root.fontFactor*osSettings.bigFontSize
|
||||
anchors.right: parent.right
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
text:"\uf00c"
|
||||
onClicked:{
|
||||
if (timeTumbler.curSelection=="start"){
|
||||
textStartTime.text=formatText(24,hoursTumbler.currentIndex)+":"+formatText(60,minutesTumbler.currentIndex);
|
||||
}else{
|
||||
textEndTime.text=formatText(24,hoursTumbler.currentIndex)+":"+formatText(60,minutesTumbler.currentIndex);
|
||||
}
|
||||
timeTumbler.visible=false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CheckBox{
|
||||
id: checkNoEndTime
|
||||
width: 12*root.fontFactor*osSettings.bigFontSize
|
||||
height: 2.5*root.fontFactor*osSettings.bigFontSize
|
||||
checked: true
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
text: qsTr("no end")
|
||||
onCheckedChanged: {
|
||||
if(checked==true){
|
||||
textEndDate.enabled=false;
|
||||
textEndDateDropdown.enabled=false;
|
||||
textEndTime.enabled=false;
|
||||
textEndTimeDropdown.enabled=false;
|
||||
textEndDate.text="";
|
||||
textEndTime.text=""
|
||||
}else{
|
||||
textEndDate.enabled=true;
|
||||
textEndDateDropdown.enabled=true;
|
||||
textEndTime.enabled=true;
|
||||
textEndTimeDropdown.enabled=true;
|
||||
textEndDate.text=textStartDate.text;
|
||||
textEndTime.text=textStartTime.text
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: titleField
|
||||
width: parent.width-root.fontFactor*osSettings.bigFontSize
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
font.bold: true
|
||||
placeholderText: qsTr("Title (required)")
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
color: Material.backgroundColor
|
||||
radius: 0.5*mm
|
||||
width: parent.width-root.fontFactor*osSettings.bigFontSize
|
||||
height:Math.max(bodyField.contentHeight+root.fontFactor*osSettings.bigFontSize,2.5*root.fontFactor*osSettings.bigFontSize)
|
||||
TextArea {
|
||||
id: bodyField
|
||||
anchors.fill: parent
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
font.family: "Noto Sans"
|
||||
wrapMode: Text.Wrap
|
||||
selectByMouse: true
|
||||
placeholderText: qsTr("Event description (optional)")
|
||||
textFormat: TextEdit.PlainText
|
||||
onLinkActivated:{Qt.openUrlExternally(link)}
|
||||
}
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: locationField
|
||||
width: parent.width-root.fontFactor*osSettings.bigFontSize
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
placeholderText: qsTr("Location (optional)")
|
||||
}
|
||||
|
||||
CheckBox{
|
||||
id: chkbxPublish
|
||||
width: 10*root.fontFactor*osSettings.bigFontSize
|
||||
height: 2.5*root.fontFactor*osSettings.bigFontSize
|
||||
checked: true
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
text: qsTr("Publish event?")
|
||||
}
|
||||
|
||||
BusyIndicator{
|
||||
id: eventCreateBusy
|
||||
anchors.horizontalCenter: eventCreateBox.horizontalCenter
|
||||
anchors.top:eventCreateBox.top
|
||||
anchors.topMargin: 2*root.fontFactor*osSettings.bigFontSize
|
||||
width:3*root.fontFactor*osSettings.bigFontSize
|
||||
height: 3*root.fontFactor*osSettings.bigFontSize
|
||||
running: false
|
||||
}
|
||||
|
||||
MButton{
|
||||
id:createEventButton
|
||||
text: qsTr("Create event")
|
||||
onClicked:{
|
||||
let startdatetext=textStartDate.getText(0,textStartDate.length);
|
||||
let startdate=new Date(startdatetext.substring(6,10)+"-"+startdatetext.substring(3,5)+"-"+startdatetext.substring(0,2)+"T"+textStartTime.text)
|
||||
|
||||
if (titleField.text==""){
|
||||
Helperjs.showMessage(qsTr("Error"),qsTr("No event name supplied"),eventCreateBox)
|
||||
}else{
|
||||
let startdatetext=textStartDate.getText(0,textStartDate.length);
|
||||
let startdate=new Date(startdatetext.substring(6,10)+"-"+startdatetext.substring(3,5)+"-"+startdatetext.substring(0,2)+"T"+textStartTime.text)
|
||||
eventCreateBusy.running=true;
|
||||
xhr.setLogin(login.username+":"+Qt.atob(login.password));
|
||||
xhr.setUrl(login.server);
|
||||
xhr.setApi("/api/friendica/event_create");
|
||||
xhr.clearParams();
|
||||
xhr.setParam("name", titleField.text);
|
||||
xhr.setParam("start_time",startdate.toISOString())
|
||||
if(!checkNoEndTime.checked){
|
||||
let enddatetext=textEndDate.getText(0,textEndDate.length);
|
||||
let enddate=new Date(enddatetext.substring(6,10)+"-"+enddatetext.substring(3,5)+"-"+enddatetext.substring(0,2)+"T"+textEndTime.text)
|
||||
xhr.setParam("end_time",enddate.toISOString())
|
||||
}
|
||||
xhr.setParam("name",titleField.text)
|
||||
if (bodyField.text!=""){xhr.setParam("desc",bodyField.text)}
|
||||
if (locationField.text!=""){xhr.setParam("place",locationField.text)}
|
||||
xhr.setParam("publish",chkbxPublish.checked)
|
||||
xhr.post();
|
||||
}
|
||||
}
|
||||
}
|
||||
Connections{
|
||||
target: xhr
|
||||
function onSuccess(text,api){
|
||||
if (api=="/api/friendica/event_create"){
|
||||
updatenews.setDatabase();
|
||||
updatenews.login();
|
||||
updatenews.setSyncAll(false);
|
||||
updatenews.events();
|
||||
try{while(rootstackView.depth>1){rootstackView.pop()}}catch(e){}
|
||||
}
|
||||
}
|
||||
function onError(text,api){
|
||||
if (api=="/api/friendica/event_create"){
|
||||
Helperjs.showMessage(qsTr("Error"),text,root)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: tumblerDelegateComponent
|
||||
Label {
|
||||
text: formatText(Tumbler.tumbler.count, modelData)
|
||||
opacity: 1.0 - Math.abs(Tumbler.displacement) / (Tumbler.tumbler.visibleItemCount / 2)
|
||||
color:Material.primaryTextColor
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
font.pointSize: osSettings.systemFontSize
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue