- AbitaregliIblei.it

- Server aggiornamenti agli script.
- Editor HTML corretto un po'.
- Record Mysql per server (appena iniziato)
This commit is contained in:
Surya Paolo
2024-09-06 19:57:17 +02:00
parent 8f4ff8ff9c
commit e9ac281125
50 changed files with 797 additions and 155 deletions

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="19" APP_ID="19"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="18" APP_ID="18"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="17" APP_ID="17"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

28
.env.test.abitaregliiblei.it Executable file
View File

@@ -0,0 +1,28 @@
APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="19"
DIRECTORY_LOCAL=newfreeplanet
DIRECTORY_SERVER=test.freeplanet_serverside
SERVERDIR_WEBSITE="/var/www/test.abitaregliiblei.it"
SERVERPW_WEBSITE="pwdadmin@1AOK"
APP_URL="https://test.abitaregliiblei.it"
URL_FACEBOOK=""
PROVA_PAOLO=""
LANG_DEFAULT="it"
PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF"
MASTER_KEY="KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T"
MONGODB_HOST="https://testapi.abitaregliiblei.it"
LOGO_REG='abitaregliiblei-logo-full.png'
TEST_NAME=""
TEST_SURNAME=""
TEST_EMAIL=""
TEST_USERNAME=""
TEST_PASSWORD=""
TEST_APORTADOR=""
PUBLICKEY_PUSH="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
IN_CONSTRUCTION="0"
DEBUG="1"
TELEGRAM_SUPPORT=""
PROJECT_ID_MAIN="5cc0a13fe5c9d156728f400a"
TEST_CELL=""
ISTEST=1

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="18" APP_ID="18"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="17" APP_ID="17"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker_1.0.39.js" SERVICE_WORKER_FILE="service-worker_1.0.39.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="19" APP_ID="19"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="16" APP_ID="16"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,6 +1,6 @@
{ {
"name": "abitaregliiblei", "name": "abitaregliiblei",
"version": "1.0.55", "version": "1.0.56",
"description": "Abitare Gli Iblei", "description": "Abitare Gli Iblei",
"productName": "AbitareGliIblei", "productName": "AbitareGliIblei",
"author": "Paolo Arena", "author": "Paolo Arena",
@@ -153,4 +153,4 @@
"npm": ">= 6.14.8", "npm": ">= 6.14.8",
"yarn": ">= 1.21.1" "yarn": ">= 1.21.1"
} }
} }

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="15" APP_ID="15"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="15" APP_ID="15"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,6 +1,6 @@
{ {
"name": "fioredellavita", "name": "fioredellavita",
"version": "1.0.55", "version": "1.0.56",
"description": "Fiore Della Vita", "description": "Fiore Della Vita",
"productName": "Fiore Della Vita", "productName": "Fiore Della Vita",
"author": "Paolo Arena", "author": "Paolo Arena",
@@ -140,4 +140,4 @@
"npm": ">= 6.14.8", "npm": ">= 6.14.8",
"yarn": ">= 1.21.1" "yarn": ">= 1.21.1"
} }
} }

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="18" APP_ID="18"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="16" APP_ID="16"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,6 +1,6 @@
{ {
"name": "gruppomacro", "name": "gruppomacro",
"version": "1.0.55", "version": "1.0.56",
"description": "GruppoMacro", "description": "GruppoMacro",
"productName": "Gruppo Macro", "productName": "Gruppo Macro",
"author": "Paolo Arena", "author": "Paolo Arena",
@@ -157,4 +157,4 @@
"npm": ">= 6.14.8", "npm": ">= 6.14.8",
"yarn": ">= 1.21.1" "yarn": ">= 1.21.1"
} }
} }

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="17" APP_ID="17"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="1.0.55" APP_VERSION="1.0.56"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="16" APP_ID="16"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,6 +1,6 @@
{ {
"name": "riso", "name": "riso",
"version": "1.0.55", "version": "1.0.56",
"description": "Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.", "description": "Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.",
"productName": "Riso", "productName": "Riso",
"author": "Paolo Arena", "author": "Paolo Arena",
@@ -153,4 +153,4 @@
"npm": ">= 6.14.8", "npm": ">= 6.14.8",
"yarn": ">= 1.21.1" "yarn": ">= 1.21.1"
} }
} }

View File

@@ -0,0 +1,28 @@
#!/bin/bash
source ./.env.test.abitaregliiblei.it
msg="*** Sincronizzazione ??? $DIRECTORY_LOCAL e $SERVERDIR_WEBSITE (Y/N) ? "
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
risposta=$1
fi
cp .env.production .env.prod.bak
cp .env.test.abitaregliiblei.it .env.production
sleep 1
npm run buildpwa
echo "Sincronizzazione $SERVERDIR_WEBSITE in remoto..."
rsync -e 'ssh -p 8822' -a dist/pwa/ pcbuser@pcb:$SERVERDIR_WEBSITE
rsync -e 'ssh -p 8822' -av --delete dist/pwa/js/ pcbuser@pcb:$SERVERDIR_WEBSITE/js
cp .env.prod.bak .env.production
sleep 1
echo "Finito $SERVERDIR_WEBSITE"

View File

@@ -1,6 +1,6 @@
{ {
"name": "abitaregliiblei", "name": "abitaregliiblei",
"version": "1.0.55", "version": "1.0.56",
"description": "Abitare Gli Iblei", "description": "Abitare Gli Iblei",
"productName": "AbitareGliIblei", "productName": "AbitareGliIblei",
"author": "Paolo Arena", "author": "Paolo Arena",
@@ -155,4 +155,4 @@
"npm": ">= 6.14.8", "npm": ">= 6.14.8",
"yarn": ">= 1.21.1" "yarn": ">= 1.21.1"
} }
} }

View File

@@ -0,0 +1,11 @@
#!/bin/bash
source .env.test.abitaregliiblei.it
cp .env.test.abitaregliiblei.it .env.production
echo "Sincronizzazione in remoto $SERVERDIR_WEBSITE ..."
rsync -e 'ssh -p 8822' -a --exclude 'upload' dist/pwa/ pcbuser@pcb:$SERVERDIR_WEBSITE
echo "Finito $SERVERDIR_WEBSITE"
cp .env.prod.bak .env.production

View File

@@ -34,7 +34,7 @@ self.addEventListener('activate', (event) => {
}); });
const VersioneApp = "1.0.55"; const VersioneApp = "1.0.56";
console.log(' [ VER-' + VersioneApp + ' ] _---------________------ PAO: this is my custom service worker'); console.log(' [ VER-' + VersioneApp + ' ] _---------________------ PAO: this is my custom service worker');

View File

@@ -630,8 +630,8 @@
myrec.mycities[0].comune myrec.mycities[0].comune
" "
> >
<q-item-section avatar> <q-item-section avatar>
<q-icon color="amber" name="fas fa-map-marker-alt" /> <q-icon color="amber" name="fas fa-map-marker-alt" />
</q-item-section> </q-item-section>
<q-item-section> <q-item-section>
<q-item-label> <q-item-label>
@@ -652,10 +652,7 @@
}}</q-item-label> }}</q-item-label>
</q-item-section> </q-item-section>
</q-item> </q-item>
<q-item <q-item clickable v-if="myrec.coordinate_gps">
clickable
v-if="myrec.coordinate_gps"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="blue" name="fas fa-crosshairs" /> <q-icon color="blue" name="fas fa-crosshairs" />
</q-item-section> </q-item-section>
@@ -673,7 +670,9 @@
<q-btn <q-btn
:label="t('attivita.vediinmappa')" :label="t('attivita.vediinmappa')"
color="primary" color="primary"
size="sm" icon="fas fa-map-marker-alt"
size="md"
class="q-my-sm"
@click="showInMap(myrec)" @click="showInMap(myrec)"
/> />
</q-item-label> </q-item-label>

View File

@@ -201,7 +201,7 @@ export default defineComponent({
if (!myel.value.elemsText) if (!myel.value.elemsText)
myel.value.elemsText = [] myel.value.elemsText = []
myel.value.elemsText.push({ _id: objectId(), text: '', color: '#ffffff', class: '', size: '', anim: { name: 'FadeIn', clduration: '', cldelay: '', timingtype: 'ease-in-out'} }) myel.value.elemsText.push({ _id: objectId(), text: '', color: '#ffffff', class: '', size: '', anim: { name: 'FadeIn', clduration: '', cldelay: '', timingtype: 'ease-in-out' } })
modifElem() modifElem()
} }
@@ -255,7 +255,7 @@ export default defineComponent({
}) })
} }
} else if ((props.myelem.type === shared_consts.ELEMTYPE.IMGTITLE) || } else if ((props.myelem.type === shared_consts.ELEMTYPE.IMGTITLE) ||
(props.myelem.type === shared_consts.ELEMTYPE.IMAGE)) { (props.myelem.type === shared_consts.ELEMTYPE.IMAGE)) {
myel.value.image = myval myel.value.image = myval
} }
modifElem() modifElem()
@@ -263,11 +263,11 @@ export default defineComponent({
function showAnimation() { function showAnimation() {
return (myel.value.type === shared_consts.ELEMTYPE.IMAGE) return (myel.value.type === shared_consts.ELEMTYPE.IMAGE)
|| (myel.value.type === shared_consts.ELEMTYPE.IMGTITLE) || (myel.value.type === shared_consts.ELEMTYPE.IMGTITLE)
|| (myel.value.type === shared_consts.ELEMTYPE.TEXT) || (myel.value.type === shared_consts.ELEMTYPE.TEXT)
|| (myel.value.type === shared_consts.ELEMTYPE.CARD) || (myel.value.type === shared_consts.ELEMTYPE.CARD)
|| (myel.value.type === shared_consts.ELEMTYPE.HTML) || (myel.value.type === shared_consts.ELEMTYPE.HTML)
|| (myel.value.type === shared_consts.ELEMTYPE.CAROUSEL_IMGS) || (myel.value.type === shared_consts.ELEMTYPE.CAROUSEL_IMGS)
} }
function updateElem(myvalue: any) { function updateElem(myvalue: any) {
@@ -278,6 +278,20 @@ export default defineComponent({
modifElem() modifElem()
} }
function generateSizeOptions() {
const options = [];
for (let i = 0; i <= 700; i += 50) {
options.push({ label: `${i}px`, value: `${i}px` });
}
return options;
}
function updateSizeWidth(value: any) {
// Gestisce l'input dell'utente per un nuovo valore
myel.value.widthimg = value; // Aggiorna widthimg con il nuovo valore
modifElem()
}
onMounted(mounted) onMounted(mounted)
return { return {
@@ -318,6 +332,8 @@ export default defineComponent({
visuadd, visuadd,
tabadd, tabadd,
Products, Products,
generateSizeOptions,
updateSizeWidth,
} }
}, },

View File

@@ -59,41 +59,45 @@
> >
</q-btn> </q-btn>
</q-bar> </q-bar>
<div class="justify-center row q-ma-xs"> <div class="fixed-button">
<q-btn <div class="justify-center row q-ma-xs">
dense <q-btn
v-if="enableEdit && !disableSave" dense
icon="fas fa-check" v-if="enableEdit && !disableSave"
color="positive" icon="fas fa-check"
label="Applica" color="positive"
size="sm" label="Salva Modifiche"
:disable="disableSave" :disable="disableSave"
@click="saveElem" @click="saveElem"
> >
</q-btn> </q-btn>
<q-btn <!--<q-btn
dense dense
v-if="enableEdit && !disableSave" v-if="enableEdit && !disableSave"
icon="fas fa-check" icon="fas fa-check"
color="positive" color="positive"
label="Salva" label="Salva"
size="sm" :disable="disableSave"
:disable="disableSave" @click="saveElem(true)"
@click="saveElem(true)" >
> </q-btn>-->
</q-btn> </div>
</div> </div>
<div class="row"> <div class="row">
<q-input <q-select
label="Lunghezza:" label="Lunghezza:"
@update:model-value="modifElem"
style="width: 100px"
v-model="myel.widthimg" v-model="myel.widthimg"
emit-value
map-options
:options="generateSizeOptions()"
use-input
use-chips
@input="modifElem"
@new-value="updateSizeWidth"
filled filled
dense dense
v-on:keyup.enter="saveElem" style="width: 150px"
> />
</q-input>
<q-input <q-input
label="Altezza:" label="Altezza:"
@update:model-value="modifElem" @update:model-value="modifElem"
@@ -484,15 +488,21 @@
> >
</CMyFieldRec> </CMyFieldRec>
<div class="row"> <div class="row">
<q-input <q-select
label="Lunghezza Logo:" label="Lunghezza Logo:"
@update:model-value="modifElem" v-model="myel.widthimg"
v-model="myel.width" emit-value
map-options
:options="generateSizeOptions()"
use-input
use-chips
@input="saveElem"
filled filled
dense dense
v-on:keyup.enter="saveElem" @new-value="updateSizeWidth"
> style="width: 150px"
</q-input> />
<q-input <q-input
label="Altezza Logo:" label="Altezza Logo:"
@update:model-value="modifElem" @update:model-value="modifElem"
@@ -675,15 +685,20 @@
</CMyFieldRec> </CMyFieldRec>
<div class=""> <div class="">
<div class="col-12 col-sm-6 col-md-6 col-lg-6 col-xl-6 col-sticky"> <div class="col-12 col-sm-6 col-md-6 col-lg-6 col-xl-6 col-sticky">
<q-input <q-select
dense
label="Lunghezza:" label="Lunghezza:"
@update:model-value="modifElem"
v-model="myel.widthimg" v-model="myel.widthimg"
emit-value
map-options
:options="generateSizeOptions()"
@input="modifElem"
filled filled
v-on:keyup.enter="saveElem" dense
> use-input
</q-input> use-chips
@new-value="updateSizeWidth"
style="width: 150px"
/>
<q-input <q-input
dense dense
label="Altezza:" label="Altezza:"
@@ -989,8 +1004,9 @@
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.CATALOGO"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.CATALOGO">
<div v-if="enableEdit" class="row"> <div v-if="enableEdit" class="row">
<div>Cataloghi:</div><br> <div>Cataloghi:</div>
<br />
<!--++AddCATALOGO_FIELDS--> <!--++AddCATALOGO_FIELDS-->
<q-select <q-select
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'" :behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
@@ -1008,10 +1024,12 @@
map-options map-options
> >
</q-select> </q-select>
<q-select <q-select
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'" :behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
v-if="enableEdit && myel.catalogo && myel.catalogo.excludeproductTypes" v-if="
enableEdit && myel.catalogo && myel.catalogo.excludeproductTypes
"
rounded rounded
outlined outlined
v-model="myel.catalogo.excludeproductTypes" v-model="myel.catalogo.excludeproductTypes"
@@ -1041,15 +1059,20 @@
map-options map-options
option-value="_id" option-value="_id"
option-label="name" option-label="name"
> >
</q-select> </q-select>
Versione PDF: <q-toggle v-model="myel.catalogo.pdf" color="positive" icon="fas fa-file-pdf" Versione PDF:
@update:model-value="modifElem"> <q-toggle
</q-toggle> v-model="myel.catalogo.pdf"
color="positive"
icon="fas fa-file-pdf"
@update:model-value="modifElem"
>
</q-toggle>
</div> </div>
</div> </div>
</div> </div>
<br /><br /><br />
</div> </div>
<div> <div>
<q-dialog <q-dialog

View File

@@ -64,7 +64,7 @@ export default defineComponent({
CMyProfileTutorial, CSendRISTo, CMyProfileTutorial, CSendRISTo,
CTitleBanner, CShareSocial, CCheckAppRunning, CRegistration, CTitleBanner, CShareSocial, CCheckAppRunning, CRegistration,
CVisuVideoPromoAndPDF, CECommerce, CCatalogo, CAITools, CVisuVideoPromoAndPDF, CECommerce, CCatalogo, CAITools,
CMapComuni, CMapUsers, CMapGetCoordinates, CMapEditAddressByCoord, CMapComuni, CMapUsers, CMapGetCoordinates, CMapEditAddressByCoord,
CDashGroup, CDashGroup,
// , //CMapMarker, // , //CMapMarker,
}, },
@@ -123,8 +123,8 @@ export default defineComponent({
const isAppRunning = computed(() => globalStore.isAppRunning) const isAppRunning = computed(() => globalStore.isAppRunning)
const coordaddr = ref(<ICoordGPS> { address: '', coordinates: [0, 0] }) const coordaddr = ref(<ICoordGPS>{ address: '', coordinates: [0, 0] })
watch(() => myel.value.order, (value, oldval) => { watch(() => myel.value.order, (value, oldval) => {
mounted() mounted()
}) })

View File

@@ -513,10 +513,10 @@
</q-btn> </q-btn>
</div> </div>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.BOTT_CHAT_TERRITORIALE"> <div
<div v-if="editOn" class="elemEdit"> v-else-if="myel.type === shared_consts.ELEMTYPE.BOTT_CHAT_TERRITORIALE"
Bottone Chat Territoriale >
</div> <div v-if="editOn" class="elemEdit">Bottone Chat Territoriale</div>
<div class="row justify-evenly items-center"> <div class="row justify-evenly items-center">
<q-btn <q-btn
v-if="tools.getLinkChatTerritoriale()" v-if="tools.getLinkChatTerritoriale()"
@@ -525,7 +525,11 @@
type="a" type="a"
size="md" size="md"
rounded rounded
:label="$t('dashboard.link_gruppo_telegram', { prov: tools.getProvincia() })" :label="
$t('dashboard.link_gruppo_telegram', {
prov: tools.getProvincia(),
})
"
:href="tools.getLinkChatTerritoriale()" :href="tools.getLinkChatTerritoriale()"
target="__blank" target="__blank"
> >
@@ -559,8 +563,7 @@
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.CATALOGO"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.CATALOGO">
<div v-if="editOn" class="elemEdit">PRODOTTI CATALOGO:</div> <div v-if="editOn" class="elemEdit">PRODOTTI CATALOGO:</div>
<CCatalogo <CCatalogo :optcatalogo="myel.catalogo"> </CCatalogo>
:optcatalogo="myel.catalogo"> </CCatalogo>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.MAPPA"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.MAPPA">
<div v-if="editOn" class="elemEdit">MAPPA:</div> <div v-if="editOn" class="elemEdit">MAPPA:</div>
@@ -570,25 +573,22 @@
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.MAPPAUTENTI"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.MAPPAUTENTI">
<div v-if="editOn" class="elemEdit">MAPPA UTENTI:</div> <div v-if="editOn" class="elemEdit">MAPPA UTENTI:</div>
<CMapUsers <CMapUsers></CMapUsers>
></CMapUsers>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.MAPPAGETCOORDINATE"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.MAPPAGETCOORDINATE">
<div v-if="editOn" class="elemEdit">MAPPA COORDINATE:</div> <div v-if="editOn" class="elemEdit">MAPPA COORDINATE:</div>
<CMapGetCoordinates <CMapGetCoordinates></CMapGetCoordinates>
></CMapGetCoordinates>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.EDITADDRESSBYCOORD"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.EDITADDRESSBYCOORD">
<div v-if="editOn" class="elemEdit">EDIT ADDRESS BY COORD:</div> <div v-if="editOn" class="elemEdit">EDIT ADDRESS BY COORD:</div>
<CMapEditAddressByCoord <CMapEditAddressByCoord
:editaddress="true" :editaddress="true"
v-model:model-value="coordaddr" v-model:model-value="coordaddr"
></CMapEditAddressByCoord> ></CMapEditAddressByCoord>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.MAPPACOMUNI"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.MAPPACOMUNI">
<div v-if="editOn" class="elemEdit">MAPPA COMUNI:</div> <div v-if="editOn" class="elemEdit">MAPPA COMUNI:</div>
<CMapComuni <CMapComuni></CMapComuni>
></CMapComuni>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.TOOLSAI"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.TOOLSAI">
<div v-if="editOn" class="elemEdit">STRUMENTI AI:</div> <div v-if="editOn" class="elemEdit">STRUMENTI AI:</div>

View File

@@ -24,8 +24,8 @@ export default defineComponent({
const mystyle = ref('') const mystyle = ref('')
function mounted() { function mounted() {
console.log('mounted')
console.log(props.src) // console.log(props.src)
if (props.width) if (props.width)
mystyle.value = 'max-width: ' + props.width + 'px; ' mystyle.value = 'max-width: ' + props.width + 'px; '

View File

@@ -65,12 +65,14 @@ export default defineComponent({
const globalStore = useGlobalStore() const globalStore = useGlobalStore()
const $router = useRouter() const $router = useRouter()
const mywidthEditor = ref(400)
const editOn = computed({ const editOn = computed({
get (): boolean { get(): boolean {
return !!globalStore.editOn ? globalStore.editOn : false return !!globalStore.editOn ? globalStore.editOn : false
}, },
set (value: boolean) { set(value: boolean) {
return globalStore.editOn = value return globalStore.editOn = value
} }
}) })
@@ -141,6 +143,10 @@ export default defineComponent({
globalStore.changeVisuDrawer(path, edit) globalStore.changeVisuDrawer(path, edit)
} }
function toggleSize() {
mywidthEditor.value = mywidthEditor.value === 400 ? 1200 : 400
}
onMounted(mounted) onMounted(mounted)
return { return {
@@ -156,6 +162,8 @@ export default defineComponent({
selElem, selElem,
saveElem, saveElem,
changeVisuDrawer, changeVisuDrawer,
mywidthEditor,
toggleSize,
} }
}, },

View File

@@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<div v-if="mypathin && !!rec"> <div v-if="mypathin && !!rec">
<q-toggle <q-toggle
v-if="tools.isManager()" v-if="tools.isManager()"
v-model="editOn" v-model="editOn"
dense dense
@@ -18,8 +18,9 @@
show-if-above show-if-above
:breakpoint="800" :breakpoint="800"
side="right" side="right"
:width="tools.isMobile() ? 350 : 400" :width="tools.isMobile() ? 350 : mywidthEditor"
elevated elevated
style="transition: 'width 0.3s ease'"
> >
<q-bar dense class="q-ma-xs bg-primary text-white"> <q-bar dense class="q-ma-xs bg-primary text-white">
<q-toolbar-title> Editor </q-toolbar-title> <q-toolbar-title> Editor </q-toolbar-title>
@@ -29,10 +30,15 @@
size="md" size="md"
color="white" color="white"
icon="close" icon="close"
@click="visuEditor = false; selElem = {};" @click="
visuEditor = false;
selElem = {};
"
></q-btn> ></q-btn>
</q-bar> </q-bar>
<q-btn class="q-ma-sm" @click="toggleSize" label="<" color="primary" />
<CMyEditElem <CMyEditElem
:myelem="selElem" :myelem="selElem"
:editOn="true" :editOn="true"
@@ -42,7 +48,7 @@
</CMyEditElem> </CMyEditElem>
</q-drawer> </q-drawer>
<div class="q-gutter-xs" style="margin-left: 1px; margin-right: 1px;"> <div class="q-gutter-xs" style="margin-left: 1px; margin-right: 1px">
<div v-if="!!rec.img1" class="text-center"> <div v-if="!!rec.img1" class="text-center">
<q-img :src="`` + rec.img1" class="img"></q-img> <q-img :src="`` + rec.img1" class="img"></q-img>
</div> </div>
@@ -76,7 +82,6 @@
<div v-for="(myelem, ind) in myelems" :key="ind"> <div v-for="(myelem, ind) in myelems" :key="ind">
<div> <div>
<CMyElem <CMyElem
v-if="(myelem.active || editOn) && !!rec.path" v-if="(myelem.active || editOn) && !!rec.path"
:myelem="myelem" :myelem="myelem"
@@ -120,9 +125,7 @@
<CImgTitle v-if="img" :src="img" :title="title"> </CImgTitle> <CImgTitle v-if="img" :src="img" :title="title"> </CImgTitle>
</div> </div>
<slot></slot> <slot></slot>
<div v-if="!nofooter"> <div v-if="!nofooter"></div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -461,7 +461,7 @@ export default defineComponent({
} }
function mounted() { function mounted() {
console.log('mounted')
myrow.value = props.rec && props.isrec ? { ...props.rec } : { ...props.row } myrow.value = props.rec && props.isrec ? { ...props.rec } : { ...props.row }

View File

@@ -2001,22 +2001,35 @@ h3 {
} }
.marker-shadow { .marker-shadow {
width: 40px; /* Dimensione dell'ombra, dovrebbe corrispondere all'icona principale */ width: 40px;
height: 40px; /* Dimensione dell'ombra */ /* Dimensione dell'ombra, dovrebbe corrispondere all'icona principale */
position: absolute; /* Posizionamento assoluto per posizionarla correttamente */ height: 40px;
top: 3px; /* Allineata sopra */ /* Dimensione dell'ombra */
left: 8px; /* Allineata a sinistra */ position: absolute;
z-index: -10; /* Assicurati che l'ombra sia sotto */ /* Posizionamento assoluto per posizionarla correttamente */
opacity: 1; /* L'opacità dell'ombra per un effetto realistico */ top: 3px;
/* Allineata sopra */
left: 8px;
/* Allineata a sinistra */
z-index: -10;
/* Assicurati che l'ombra sia sotto */
opacity: 1;
/* L'opacità dell'ombra per un effetto realistico */
} }
.custom-icon .material-icons { .custom-icon .material-icons {
position: absolute; /* Posizionamento assoluto per centrare */ position: absolute;
top: 50%; /* Posizionamento verticale */ /* Posizionamento assoluto per centrare */
left: 50%; /* Posizionamento orizzontale */ top: 50%;
transform: translate(-50%, -50%); /* Centra l'icona */ /* Posizionamento verticale */
font-size: 40px; /* Dimensione dell'icona 20x20 */ left: 50%;
color: blue; /* Colore dell'icona (puoi cambiarlo) */ /* Posizionamento orizzontale */
transform: translate(-50%, -50%);
/* Centra l'icona */
font-size: 40px;
/* Dimensione dell'icona 20x20 */
color: blue;
/* Colore dell'icona (puoi cambiarlo) */
} }
.current-location-icon { .current-location-icon {
@@ -2025,6 +2038,7 @@ h3 {
border-radius: 50%; border-radius: 50%;
box-shadow: 0 0 0 4px #4A89F3; box-shadow: 0 0 0 4px #4A89F3;
} }
.current-location-icon::after { .current-location-icon::after {
content: ''; content: '';
position: absolute; position: absolute;
@@ -2043,27 +2057,53 @@ h3 {
} }
.no-padding-dialog .q-dialog__inner { .no-padding-dialog .q-dialog__inner {
padding: 0 !important; /* Rimuove il padding dal dialog */ padding: 0 !important;
/* Rimuove il padding dal dialog */
} }
.custom-zoom-button { .custom-zoom-button {
background-color: white; background-color: white;
border: 2px solid #007bff; /* Colore del bordo */ border: 2px solid #007bff;
/* Colore del bordo */
border-radius: 4px; border-radius: 4px;
padding: 5px 10px; padding: 5px 10px;
cursor: pointer; cursor: pointer;
margin-top: 10px; /* Spaziatura dal bordo superiore */ margin-top: 10px;
z-index: 1000; /* Assicurati che appaia sopra altri controlli */ /* Spaziatura dal bordo superiore */
z-index: 1000;
/* Assicurati che appaia sopra altri controlli */
} }
.custom-zoom-button:hover { .custom-zoom-button:hover {
background-color: #007bff; /* Colore di sfondo al passaggio del mouse */ background-color: #007bff;
color: white; /* Colore del testo al passaggio del mouse */ /* Colore di sfondo al passaggio del mouse */
color: white;
/* Colore del testo al passaggio del mouse */
} }
.barretta-sep { .barretta-sep {
background-color: #dadce0; background-color: #dadce0;
border-radius: 2px; border-radius: 2px;
height: 4px; height: 4px;
width: 100%; width: 100%;
}
.fixed-button {
position: fixed;
bottom: 16px;
/* Distanza dal fondo */
right: 16px;
/* Distanza dal lato */
z-index: 1000;
/* Opzionale: assicura che il bottone sia sopra altri elementi */
}
.fixed-button2 {
position: fixed;
bottom: 16px;
/* Distanza dal fondo */
right: 120px;
/* Distanza dal lato */
z-index: 1000;
/* Opzionale: assicura che il bottone sia sopra altri elementi */
} }

View File

@@ -10,7 +10,7 @@
<meta name="description" content="<%= productDescription %>"> <meta name="description" content="<%= productDescription %>">
<meta name="format-detection" content="telephone=no"> <meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no"> <meta name="msapplication-tap-highlight" content="no">
<meta name="version" content="1.0.55"> <meta name="version" content="1.0.56">
<meta name="viewport" <meta name="viewport"
content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width<% if (ctx.mode.cordova || ctx.mode.capacitor) { %>, viewport-fit=cover<% } %>"> content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width<% if (ctx.mode.cordova || ctx.mode.capacitor) { %>, viewport-fit=cover<% } %>">

View File

@@ -1547,6 +1547,7 @@ const msg_it = {
myelems: { myelems: {
active: 'active', active: 'active',
img: 'img', img: 'img',
image: 'Immagine:',
path: 'Path', path: 'Path',
order: 'Order', order: 'Order',
type: 'Type', type: 'Type',

View File

@@ -2151,6 +2151,35 @@ export const useGlobalStore = defineStore('GlobalStore', {
}) })
}, },
async saveServerMysql(paramquery: any) {
return Api.SendReq('/admin/mysql', 'POST', paramquery)
.then((res) => {
return res.data
}).catch((error) => {
return false
})
},
async getCloudFlareTok(cmd: string, tok: string, zoneId: string, dnsRecordId: any = null, record: any = undefined) {
const mydata = {
cmd,
tokcheck: "php8.1_version_762321HSD121nJDokq@?!aFS.tar.gz",
tok,
zoneId,
dnsRecordId,
record,
}
return Api.SendReq('/admin/cloudflare', 'POST', mydata)
.then((res) => {
return res.data
}).catch((error) => {
return false
})
},
} }
}) })

View File

@@ -40,4 +40,8 @@ $button-margin: 5px;
/* Mostra i puntini di sospensione se il testo è troppo lungo (opzionale) */ /* Mostra i puntini di sospensione se il testo è troppo lungo (opzionale) */
white-space: nowrap; white-space: nowrap;
/* Impedisce il wrapping della riga (opzionale) */ /* Impedisce il wrapping della riga (opzionale) */
}
.selected-row {
background-color: #e3f2fd !important;
} }

View File

@@ -21,6 +21,7 @@ export default defineComponent({
const $q = useQuasar() const $q = useQuasar()
const { t } = useI18n() const { t } = useI18n()
const circuitStore = useCircuitStore() const circuitStore = useCircuitStore()
const userStore = useUserStore()
const messages = ref('') const messages = ref('')
const input = ref('') const input = ref('')
@@ -57,6 +58,84 @@ export default defineComponent({
const globalStore = useGlobalStore() const globalStore = useGlobalStore()
const selectedApi = ref(<string>'');
const dnsPageActive = ref(false)
const optionsApi = ref(<any>[])
const arrZones = ref(<any>[])
const arrDNS = ref(<any>[])
const optZones = ref(<any>[])
const selected = ref(<any>[])
const selZoneId = ref('')
const columnsZones = [
{ name: 'id', align: 'right', label: 'ID', field: 'id', visible: true },
{ name: 'name', required: true, label: 'Nome', align: 'left', field: 'name', sortable: true, visible: true },
{ name: 'status', align: 'center', label: 'Status', field: 'status', sortable: true, visible: true },
{ name: 'proxied', align: 'center', label: 'Proxy', field: 'proxied', sortable: true, visible: true },
{ name: 'type', required: true, label: 'Tipo', align: 'left', field: 'type', sortable: true, visible: true },
];
const columnsDNS = [
{ name: 'id', required: false, label: 'Id', align: 'left', field: 'id', sortable: false, visible: false },
{ name: 'name', required: true, label: 'Nome', align: 'left', field: 'name', sortable: true, visible: true },
{ name: 'type', required: true, label: 'Tipo', align: 'left', field: 'type', sortable: true, visible: true },
{ name: 'proxied', required: true, align: 'center', label: 'Proxy', field: 'proxied', sortable: true, visible: true },
{ name: 'content', required: true, label: 'Valore', align: 'left', field: 'content', sortable: true, visible: true },
];
const viscolumnsDNS = [
{ name: 'name', required: true, label: 'Nome', align: 'left', field: 'name', sortable: true, visible: true, editable: true },
{ name: 'type', required: true, label: 'Tipo', align: 'left', field: 'type', sortable: true, visible: true, editable: true },
{ name: 'proxied', required: true, align: 'center', label: 'Proxy', field: 'proxied', sortable: true, visible: true, editable: true },
{ name: 'content', required: true, label: 'Valore', align: 'left', field: 'content', sortable: true, visible: true, editable: true },
];
const pagination = {
rowsPerPage: 10,
}
watch(() => selectedApi.value, async (to: any, from: any) => {
if (selectedApi.value) {
incaricamento.value = true
tools.setCookie('CF_API_SEL', selectedApi.value)
arrZones.value = await globalStore.getCloudFlareTok("getzones", selectedApi.value, "")
incaricamento.value = false
selZoneId.value = tools.getCookie('CF_API_ZONE_ID_' + selectedApi.value, '')
optZones.value = []
for (let i = 0; i < arrZones.value.length; i++) {
optZones.value.push({ label: arrZones.value[i].name, value: arrZones.value[i].id })
}
}
})
watch(() => selZoneId.value, async (to: any, from: any) => {
if (selZoneId.value) {
incaricamento.value = true
arrDNS.value = await globalStore.getCloudFlareTok("getDNS", selectedApi.value, selZoneId.value)
incaricamento.value = false
tools.setCookie('CF_API_ZONE_ID_' + selectedApi.value, selZoneId.value)
/*optDNS.value = []
for (let i = 0; i < arrZones.value.length; i++) {
optDNS.value.push({ label: arrZones.value[i].name, value: arrZones.value[i].id })
}*/
}
})
watch(() => mydir.value, async (to: any, from: any) => { watch(() => mydir.value, async (to: any, from: any) => {
// ... // ...
@@ -64,9 +143,21 @@ export default defineComponent({
myarrscript.value = [] myarrscript.value = []
if (mydir.value) dnsPageActive.value = (mydir.value === '2_DNS')
myarrscript.value = await getArrayByScript('ls "admin_scripts/' + mydir.value + '/"', 'sh')
incaricamento.value = true
tools.setCookie('CF_API_DIR', mydir.value)
if (dnsPageActive.value) {
// get the Tokens
optionsApi.value = await globalStore.getCloudFlareTok("gettok", selectedApi.value, "")
} else {
if (mydir.value)
myarrscript.value = await getArrayByScript('ls "admin_scripts/' + mydir.value + '/"', 'sh')
}
incaricamento.value = false
}) })
watch(() => messages.value, async (to: any, from: any) => { watch(() => messages.value, async (to: any, from: any) => {
@@ -88,8 +179,12 @@ export default defineComponent({
withinput withinput
} }
incaricamento.value = true
const risfunz = await globalStore.execScript({ mydata }) const risfunz = await globalStore.execScript({ mydata })
incaricamento.value = false
if (ritornaout) { if (ritornaout) {
if (listafiles) { if (listafiles) {
return risfunz.arrout return risfunz.arrout
@@ -134,6 +229,9 @@ export default defineComponent({
scrollToBottom() scrollToBottom()
mydir.value = tools.getCookie('CF_API_DIR')
selectedApi.value = tools.getCookie('CF_API_SEL', '')
} }
const scrollToBottom = () => { const scrollToBottom = () => {
@@ -237,7 +335,7 @@ export default defineComponent({
let timenowstr = '<br><span style="font-style: italic; color: gray;">✅ Eseguito alle ' + tools.getstrTimeAll(Date.now()) + ' -> ' + '</span><br>' let timenowstr = '<br><span style="font-style: italic; color: gray;">✅ Eseguito alle ' + tools.getstrTimeAll(Date.now()) + ' -> ' + '</span><br>'
messages.value += timenowstr messages.value += timenowstr
ws.send(JSON.stringify({ type: 'start_script', scriptName, dir: mydir.value })); ws.send(JSON.stringify({ user_id: userStore.my._id, type: 'start_script', scriptName, dir: mydir.value }));
} }
}; };
@@ -250,6 +348,75 @@ export default defineComponent({
} }
}; };
// get the label of the selectedApi (value)
const getLabelSelApi = () => {
const myrec = optionsApi.value.find((opt: any) => opt.value === selectedApi.value)
return myrec ? myrec.label : ''
};
const getNameBySelZoneinId = () => {
const myrec = arrZones.value.find((zone: any) => zone.id === selZoneId.value)
return myrec ? myrec.name : ''
};
const getSelectedString = () => {
return selected.value.length === 0 ? '' : `${selected.value[0].name} selezionata.`
}
const toggleSelect = (row: any) => {
if (selected.value.length > 0 && selected.value[0].id === row.id) {
selected.value = [];
} else {
selected.value = [row];
}
}
const saveContentDNS = async (content: string, initialValue: string) => {
console.log('record da salvare su CF:', content)
if (selected.value && selected.value.length > 0 && selected.value[0].id) {
const indrec = arrDNS.value.findIndex((rec: any) => rec.id === selected.value[0].id)
arrDNS.value[indrec].content = content
await saveRecordDNS(arrDNS.value[indrec])
}
}
const saveNameDNS = async (name: string, initialValue: string) => {
if (selected.value && selected.value.length > 0 && selected.value[0].id) {
const indrec = arrDNS.value.findIndex((rec: any) => rec.id === selected.value[0].id)
arrDNS.value[indrec].name = name
await saveRecordDNS(arrDNS.value[indrec])
}
}
const saveTypeDNS = async (type: string, initialValue: string) => {
if (selected.value && selected.value.length > 0 && selected.value[0].id) {
const indrec = arrDNS.value.findIndex((rec: any) => rec.id === selected.value[0].id)
arrDNS.value[indrec].type = type
await saveRecordDNS(arrDNS.value[indrec])
}
}
const saveRecordDNS = async (row: any) => {
console.log('record da salvare su CF:', row)
const recupdated = await globalStore.getCloudFlareTok("setRecordDNS", selectedApi.value, selZoneId.value, row.id, row)
if (recupdated) {
const indrec = arrDNS.value.findIndex((rec: any) => rec.id === recupdated.id)
// update record
arrDNS.value[indrec] = recupdated
tools.showPositiveNotif($q, t('db.recupdated'))
} else {
tools.showNegativeNotif($q, t('db.recfailed'))
}
}
onMounted(mounted) onMounted(mounted)
return { return {
@@ -281,6 +448,26 @@ export default defineComponent({
inputPrompt, inputPrompt,
statusWs, statusWs,
scrollArea, scrollArea,
selectedApi,
dnsPageActive,
optionsApi,
arrZones,
getLabelSelApi,
columnsZones,
pagination,
selected,
getSelectedString,
toggleSelect,
optZones,
selZoneId,
arrDNS,
columnsDNS,
getNameBySelZoneinId,
viscolumnsDNS,
saveRecordDNS,
saveContentDNS,
saveNameDNS,
saveTypeDNS,
} }
}, },
}) })

View File

@@ -27,6 +27,7 @@
<div class="q-ma-sm button-container"> <div class="q-ma-sm button-container">
<div class="" v-for="(script, index) in myarrscript" :key="index"> <div class="" v-for="(script, index) in myarrscript" :key="index">
<q-btn <q-btn
v-if="!script.sock"
class="" class=""
:label="script.label" :label="script.label"
color="primary" color="primary"
@@ -38,6 +39,7 @@
> >
</q-btn> </q-btn>
<q-btn <q-btn
v-if="script.sock"
class="" class=""
:label="'SOCK: ' + script.label" :label="'SOCK: ' + script.label"
color="positive" color="positive"
@@ -60,7 +62,132 @@
<br /> <br />
</div> </div>
</div> </div>
<div>
<div v-if="dnsPageActive" class="">
<div>
<q-select
v-model="selectedApi"
:options="optionsApi"
label="Seleziona un Token"
emit-value
map-options
filled
class="q-ma-md"
/>
<q-select
v-if="optZones && optZones.length > 0"
v-model="selZoneId"
:options="optZones"
label="Seleziona un Dominio"
emit-value
map-options
class="q-ma-md"
/>
<q-table
v-if="arrDNS && selZoneId"
:title="`Zona di ${getNameBySelZoneinId()}`"
:rows="arrDNS"
:columns="columnsDNS"
row-key="id"
:loading="incaricamento"
:pagination="pagination"
:selected-rows-label="getSelectedString"
selection="single"
v-model:selected="selected"
:visible-columns="viscolumnsDNS"
>
<template v-slot:loading>
<q-inner-loading showing color="primary" />
</template>
<template v-slot:body="props">
<q-tr
:props="props"
:class="{ 'selected-row': props.selected }"
@click="toggleSelect(props.row)"
>
<q-td auto-width class="tdclass">
<q-checkbox
dense
v-model="props.selected"
@click.stop="toggleSelect(props.row)"
></q-checkbox>
</q-td>
<q-td v-for="col in viscolumnsDNS" :key="col.name" :props="props">
<q-popup-edit
v-if="col.name === 'content'"
v-model="props.row.content"
v-slot="scope"
buttons
transition-show="scale"
transition-hide="scale"
:max-width="200"
@save="saveContentDNS"
>
<q-input
type="textarea"
v-model="scope.value"
dense
autofocus
:maxlength="255"
autogrow
/>
</q-popup-edit>
<q-popup-edit
v-if="col.name === 'name'"
v-model="props.row.name"
v-slot="scope"
buttons
@save="saveNameDNS"
>
<q-input
type="textarea"
v-model="scope.value"
autofocus
autogrow
/>
</q-popup-edit>
<!--<q-popup-edit
v-if="col.name === 'type'"
v-model="props.row.type"
v-slot="scope"
buttons
@save="saveTypeDNS"
>
<q-input
type="textarea"
v-model="scope.value"
autofocus
autogrow
/>
</q-popup-edit>-->
<q-toggle
v-if="col.name === 'proxied'"
v-model="props.row.proxied"
label="Proxy"
:disable="props.row.proxiable !== true"
@click.stop="
props.row.proxiable === true
? saveRecordDNS(props.row)
: null
"
>
</q-toggle>
<span v-else>
{{ props.row[col.field] }}
</span>
</q-td>
</q-tr>
</template>
</q-table>
<!--<div v-if="selectedApi">Hai selezionato: {{ getLabelSelApi() }}</div>-->
</div>
</div>
<div v-if="!dnsPageActive">
<div :class="statusWs === 'OPEN' ? 'bg-green' : 'bg-red'"> <div :class="statusWs === 'OPEN' ? 'bg-green' : 'bg-red'">
STATO WS: {{ statusWs }} STATO WS: {{ statusWs }}
</div> </div>

View File

@@ -0,0 +1 @@
export { default as servermysql } from './servermysql.vue'

View File

@@ -0,0 +1,47 @@
$button-margin: 5px;
.button-container {
margin: $button-margin;
text-transform: none;
}
.container {
position: relative;
height: 45vh;
/* Per riempire tutto lo schermo */
}
.scroll-area {
position: absolute;
bottom: 0;
/* Posiziona l'area di scorrimento in basso */
left: 0;
/* Allinea a sinistra */
width: 100%;
/* Larghezza al 100% */
height: 340px;
/* Imposta l'altezza desiderata */
max-width: 800px;
/* Imposta la larghezza massima desiderata */
border: 1px solid #ccc;
/* Opzionale: per aggiungere un bordo */
background: #fff;
/* Sfondo bianco */
overflow-y: auto;
/* Abilita lo scorrimento verticale */
}
.custom-field {
height: 35px;
/* Imposta l'altezza fissa a 30px */
overflow: hidden;
/* Nasconde ciò che esce dai limiti del campo */
text-overflow: ellipsis;
/* Mostra i puntini di sospensione se il testo è troppo lungo (opzionale) */
white-space: nowrap;
/* Impedisce il wrapping della riga (opzionale) */
}
.selected-row {
background-color: #e3f2fd !important;
}

View File

@@ -0,0 +1,52 @@
import { defineComponent, onMounted, ref, watch, onUnmounted, nextTick } from 'vue'
import { CTitleBanner } from '../../../components/CTitleBanner'
import { CDateTime } from '../../../components/CDateTime'
import { CMyFieldDb } from '../../../components/CMyFieldDb'
import { useQuasar } from 'quasar'
import { useI18n } from '@/boot/i18n'
import { useUserStore } from '@store/UserStore'
import { useGlobalStore } from '@store/globalStore'
import { useCircuitStore } from '@store/CircuitStore'
import { tools } from '@store/Modules/tools'
import { costanti } from '@costanti'
import { shared_consts } from '@src/common/shared_vuejs'
export default defineComponent({
name: 'servermysql',
components: { CTitleBanner, CDateTime, CMyFieldDb },
props: {},
setup() {
const $q = useQuasar()
const { t } = useI18n()
const circuitStore = useCircuitStore()
const userStore = useUserStore()
const globalStore = useGlobalStore()
function mounted() {
}
const serverData = ref({
NameServer: '',
IPServer: '',
Attivo: false,
VersioneServer: '',
LastBackupServer: ''
});
async function submitForm() {
await globalStore.saveServerMysql(serverData.value)
}
onMounted(mounted)
return {
tools,
costanti,
serverData,
submitForm,
}
},
})

View File

@@ -0,0 +1,38 @@
<template>
<div>
<CTitleBanner title="Operazioni sul Server:"></CTitleBanner>
<q-separator></q-separator>
<q-form @submit="submitForm">
<q-input v-model="serverData.NameServer" label="Nome Server" filled />
<q-input v-model="serverData.IPServer" label="IP Server" filled />
<q-toggle v-model="serverData.Attivo" label="Attivo" />
<q-input
v-model="serverData.VersioneServer"
label="Versione Server"
filled
/>
<q-input
v-model="serverData.LastBackupServer"
label="Ultimo Backup"
type="date"
filled
/>
<q-btn label="Invia" type="submit" color="primary" class="q-mt-md" />
</q-form>
</div>
</template>
<script lang="ts" src="./servermysql.ts">
</script>
<style lang="scss" scoped>
@import './servermysql';
</style>

View File

@@ -28,7 +28,7 @@ export default defineComponent({
const filter = ref(costanti.FIND_PEOPLE) const filter = ref(costanti.FIND_PEOPLE)
function mounted() { function mounted() {
console.log('mounted')
searchList.value = [ searchList.value = [
{ {
label: 'Regione', label: 'Regione',