pezcurrel 4 years ago
parent
commit
a37efa448e

+ 109 - 0
web/admin/imgs/carica.svg

@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="22"
+   height="22"
+   viewBox="0 0 5.8208332 5.8208335"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="carica.svg">
+  <defs
+     id="defs2">
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd"
+       inkscape:isstock="true">
+      <g
+         id="g2301"
+         style="stroke:#000000;stroke-opacity:1;fill:#ffffff;fill-opacity:1">
+        <path
+           style="fill:#ffffff;stroke:#000000;stroke-width:1.15;stroke-linecap:square;stroke-opacity:1;fill-opacity:1"
+           d="M 0,0 L -2,0"
+           id="path2316" />
+        <path
+           style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-opacity:1;fill-opacity:1"
+           d="M 0,0 L -13,4 L -9,0 -13,-4 L 0,0 z "
+           id="path2312" />
+        <path
+           style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-opacity:1;fill-opacity:1"
+           d="M 0,-4 L 0,40"
+           id="path2314" />
+      </g>
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="45.254834"
+     inkscape:cx="4.2945831"
+     inkscape:cy="10.274574"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:snap-page="true"
+     inkscape:bbox-nodes="true"
+     inkscape:window-width="3840"
+     inkscape:window-height="2037"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Livello 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-291.17916)">
+    <rect
+       style="opacity:1;vector-effect:none;fill:#3088d4;fill-opacity:1;stroke:none;stroke-width:0.37526914;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
+       id="rect861"
+       width="5.8208332"
+       height="5.8208265"
+       x="-1.110223e-16"
+       y="291.17917"
+       ry="0.78214943" />
+    <rect
+       style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
+       id="rect4521"
+       width="1.5827367"
+       height="4.2721367"
+       x="2.0668476"
+       y="292.41998"
+       ry="0.4608396" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.23701932;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 2.9026735,291.48711 c -0.051063,0.002 -0.097206,0.0195 -0.1224421,0.0473 l -1.87802118,2.0275 c -0.0584756,0.0623 0.0135137,0.1407 0.12934038,0.14082 h 3.7577667 c 0.1157814,-1.3e-4 0.1877481,-0.0784 0.1293403,-0.14078 l -1.8780211,-2.0275 c -0.027985,-0.0307 -0.08135,-0.049 -0.137963,-0.0473 z"
+       id="path4529"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+  </g>
+</svg>

BIN
web/admin/imgs/loading.gif


+ 110 - 0
web/admin/imgs/salva.svg

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="22"
+   height="22"
+   viewBox="0 0 5.8208332 5.8208335"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="salva.svg">
+  <defs
+     id="defs2">
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd"
+       inkscape:isstock="true">
+      <g
+         id="g2301"
+         style="stroke:#000000;stroke-opacity:1;fill:#ffffff;fill-opacity:1">
+        <path
+           style="fill:#ffffff;stroke:#000000;stroke-width:1.15;stroke-linecap:square;stroke-opacity:1;fill-opacity:1"
+           d="M 0,0 L -2,0"
+           id="path2316" />
+        <path
+           style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-opacity:1;fill-opacity:1"
+           d="M 0,0 L -13,4 L -9,0 -13,-4 L 0,0 z "
+           id="path2312" />
+        <path
+           style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-opacity:1;fill-opacity:1"
+           d="M 0,-4 L 0,40"
+           id="path2314" />
+      </g>
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="45.254834"
+     inkscape:cx="4.2945831"
+     inkscape:cy="10.274574"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:snap-page="true"
+     inkscape:bbox-nodes="true"
+     inkscape:window-width="3840"
+     inkscape:window-height="2037"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Livello 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-291.17916)">
+    <rect
+       style="opacity:1;vector-effect:none;fill:#3088d4;fill-opacity:1;stroke:none;stroke-width:0.37526914;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
+       id="rect861"
+       width="5.8208332"
+       height="5.8208265"
+       x="-1.110223e-16"
+       y="291.17917"
+       ry="0.78214943" />
+    <rect
+       style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
+       id="rect4521"
+       width="1.5827367"
+       height="4.2721367"
+       x="2.0668476"
+       y="-295.75919"
+       ry="0.4608396"
+       transform="scale(1,-1)" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.23701932;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 2.9026735,296.69205 c -0.051063,-0.002 -0.097206,-0.0195 -0.1224421,-0.0473 l -1.87802118,-2.0275 c -0.0584756,-0.0623 0.0135137,-0.1407 0.12934038,-0.14082 h 3.7577667 c 0.1157814,1.3e-4 0.1877481,0.0784 0.1293403,0.14078 l -1.8780211,2.0275 c -0.027985,0.0307 -0.08135,0.049 -0.137963,0.0473 z"
+       id="path4529"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+  </g>
+</svg>

+ 132 - 0
web/admin/imgs/salvacome.svg

@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="22"
+   height="22"
+   viewBox="0 0 5.8208332 5.8208335"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="salvacome.svg">
+  <defs
+     id="defs2">
+    <marker
+       style="overflow:visible"
+       id="DistanceEnd"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="DistanceEnd"
+       inkscape:isstock="true">
+      <g
+         id="g2301"
+         style="stroke:#000000;stroke-opacity:1;fill:#ffffff;fill-opacity:1">
+        <path
+           style="fill:#ffffff;stroke:#000000;stroke-width:1.15;stroke-linecap:square;stroke-opacity:1;fill-opacity:1"
+           d="M 0,0 L -2,0"
+           id="path2316" />
+        <path
+           style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-opacity:1;fill-opacity:1"
+           d="M 0,0 L -13,4 L -9,0 -13,-4 L 0,0 z "
+           id="path2312" />
+        <path
+           style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-opacity:1;fill-opacity:1"
+           d="M 0,-4 L 0,40"
+           id="path2314" />
+      </g>
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="128"
+     inkscape:cx="15.505395"
+     inkscape:cy="14.672595"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:snap-page="true"
+     inkscape:bbox-nodes="true"
+     inkscape:window-width="3840"
+     inkscape:window-height="2037"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Livello 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-291.17916)">
+    <rect
+       style="opacity:1;vector-effect:none;fill:#3088d4;fill-opacity:1;stroke:none;stroke-width:0.37526914;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
+       id="rect861"
+       width="5.8208332"
+       height="5.8208265"
+       x="-1.110223e-16"
+       y="291.17917"
+       ry="0.78214943" />
+    <rect
+       style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
+       id="rect4521"
+       width="1.5827367"
+       height="4.2721367"
+       x="2.0668476"
+       y="-295.75919"
+       ry="0.4608396"
+       transform="scale(1,-1)" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.23701932;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 2.9026735,296.69205 c -0.051063,-0.002 -0.097206,-0.0195 -0.1224421,-0.0473 l -1.87802118,-2.0275 c -0.0584756,-0.0623 0.0135137,-0.1407 0.12934038,-0.14082 h 3.7577667 c 0.1157814,1.3e-4 0.1877481,0.0784 0.1293403,0.14078 l -1.8780211,2.0275 c -0.027985,0.0307 -0.08135,0.049 -0.137963,0.0473 z"
+       id="path4529"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <g
+       id="g836"
+       transform="matrix(0.45915813,0,0,0.45915611,5.6734009,158.05177)"
+       style="fill:#ffffff">
+      <rect
+         ry="0.5610584"
+         y="290.60983"
+         x="-2.5985863"
+         height="4.4471259"
+         width="1.1221168"
+         id="rect817"
+         style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458335;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <rect
+         transform="rotate(90)"
+         ry="0.5610584"
+         y="-0.18603504"
+         x="292.27234"
+         height="4.4471259"
+         width="1.1221168"
+         id="rect817-9"
+         style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458335;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+    </g>
+  </g>
+</svg>

+ 137 - 47
web/admin/instances.php

@@ -146,9 +146,9 @@ $cols=array(
 
 	'Languages.NameIT'=>array('field'=>'Languages%.NameIT','name'=>'Una lingua dichiarata','type'=>'joini','join'=>array('InstLangs AS InstLangs% ON InstLangs%.InstID=Instances.ID','Languages AS Languages% ON Languages%.ID=InstLangs%.LangID'),'subtype'=>'text','ord'=>true,'ordname'=>'Lingue dichiarate','ordjoin'=>array('InstLangs AS OrdInstLangs ON OrdInstLangs.InstID=Instances.ID','Languages AS OrdLanguages ON OrdLanguages.ID=OrdInstLangs.LangID'),'ordselmore'=>'GROUP_CONCAT(OrdLanguages.NameIT ORDER BY OrdInstLangs.Pos ASC SEPARATOR \'\') AS xOrdLangs','ordby'=>'xOrdLangs'),
 
-	'InstLangs.LangID.First'=>array('field'=>'InstLangs%.LangID','name'=>'Lingua primaria dichiarata ⮞','type'=>'join','join'=>array('InstLangs AS InstLangs% ON InstLangs%.InstID=Instances.ID AND InstLangs%.Pos=1'),'ord'=>false),
+	'InstLangs.LangID.First'=>array('field'=>'InstLangs.LangID','name'=>'Lingua primaria dichiarata ⮞','type'=>'join','join'=>array('InstLangs AS InstLangs ON InstLangs.InstID=Instances.ID AND InstLangs.Pos=1'),'ord'=>false),
 
-	'Languages.NameIT.First'=>array('field'=>'Languages%.NameIT','name'=>'Lingua primaria dichiarata','type'=>'joini','join'=>array('InstLangs AS InstLangs% ON InstLangs%.InstID=Instances.ID AND InstLangs%.Pos=1','Languages AS Languages% ON Languages%.ID=InstLangs%.LangID'),'subtype'=>'text','ord'=>false),
+	'Languages.NameIT.First'=>array('field'=>'Languages.NameIT','name'=>'Lingua primaria dichiarata','type'=>'joini','join'=>array('InstLangs AS InstLangs ON InstLangs.InstID=Instances.ID AND InstLangs.Pos=1','Languages AS Languages ON Languages.ID=InstLangs.LangID'),'subtype'=>'text','ord'=>false),
 
 //--------------------------------
 
@@ -158,9 +158,9 @@ $cols=array(
 
 	'OurLanguages.NameIT'=>array('field'=>'OurLanguages%.NameIT','name'=>'Una lingua impostata da noi','type'=>'joini','join'=>array('InstOurLangs AS InstOurLangs% ON InstOurLangs%.InstID=Instances.ID','Languages AS OurLanguages% ON OurLanguages%.ID=InstOurLangs%.OurLangID'),'subtype'=>'text','ord'=>true,'ordname'=>'Lingue impostate da noi','ordjoin'=>array('InstOurLangs AS OrdInstOurLangs ON OrdInstOurLangs.InstID=Instances.ID','Languages AS OrdOurLanguages ON OrdOurLanguages.ID=OrdInstOurLangs.OurLangID'),'ordselmore'=>'GROUP_CONCAT(OrdOurLanguages.NameIT ORDER BY OrdInstOurLangs.Pos ASC SEPARATOR \'\') AS xOrdOurLangs','ordby'=>'xOrdOurLangs'),
 
-	'InstOurLangs.OurLangID.First'=>array('field'=>'InstOurLangs%.OurLangID','name'=>'Lingua primaria impostata da noi ⮞','type'=>'join','join'=>array('InstOurLangs AS InstOurLangs% ON InstOurLangs%.InstID=Instances.ID AND InstOurLangs%.Pos=1'),'ord'=>false),
+	'InstOurLangs.OurLangID.First'=>array('field'=>'InstOurLangs.OurLangID','name'=>'Lingua primaria impostata da noi ⮞','type'=>'join','join'=>array('InstOurLangs AS InstOurLangs ON InstOurLangs.InstID=Instances.ID AND InstOurLangs.Pos=1'),'ord'=>false),
 
-	'OurLanguages.NameIT.First'=>array('field'=>'OurLanguages%.NameIT','name'=>'Lingua primaria impostata da noi','type'=>'joini','join'=>array('InstOurLangs AS InstOurLangs% ON InstOurLangs%.InstID=Instances.ID AND InstOurLangs%.Pos=1','Languages AS OurLanguages% ON OurLanguages%.ID=InstOurLangs%.OurLangID'),'subtype'=>'text','ord'=>false),
+	'OurLanguages.NameIT.First'=>array('field'=>'OurLanguages.NameIT','name'=>'Lingua primaria impostata da noi','type'=>'joini','join'=>array('InstOurLangs AS InstOurLangs ON InstOurLangs.InstID=Instances.ID AND InstOurLangs.Pos=1','Languages AS OurLanguages ON OurLanguages.ID=InstOurLangs.OurLangID'),'subtype'=>'text','ord'=>false),
 
 //--------------------------------
 
@@ -170,9 +170,9 @@ $cols=array(
 
 	'Financing.Type'=>array('field'=>'Financing%.Type','name'=>'Una modalità di finanziamento','type'=>'joini','join'=>array('InstFinancing AS InstFinancing% ON InstFinancing%.InstID=Instances.ID','Financing AS Financing% ON Financing%.ID=InstFinancing%.FinID'),'subtype'=>'text','ord'=>true,'ordname'=>'Modalità di finanziamento','ordjoin'=>array('InstFinancing AS OrdInstFinancing ON OrdInstFinancing.InstID=Instances.ID','Financing AS OrdFinancing ON OrdFinancing.ID=OrdInstFinancing.FinID'),'ordselmore'=>'GROUP_CONCAT(OrdFinancing.Type ORDER BY OrdInstFinancing.Pos ASC SEPARATOR \'\') AS xOrdFinancing','ordby'=>'xOrdFinancing'),
 
-	'InstFinancing.FinID.First'=>array('field'=>'InstFinancing%.FinID','name'=>'Modalità di finanziamento primaria ⮞','type'=>'join','join'=>array('InstFinancing AS InstFinancing% ON InstFinancing%.InstID=Instances.ID AND InstFinancing%.Pos=1'),'ord'=>false),
+	'InstFinancing.FinID.First'=>array('field'=>'InstFinancing.FinID','name'=>'Modalità di finanziamento primaria ⮞','type'=>'join','join'=>array('InstFinancing AS InstFinancing ON InstFinancing.InstID=Instances.ID AND InstFinancing.Pos=1'),'ord'=>false),
 
-	'Financing.Type.First'=>array('field'=>'Financing%.Type','name'=>'Modalità di finanziamento primaria','type'=>'joini','join'=>array('InstFinancing AS InstFinancing% ON InstFinancing%.InstID=Instances.ID AND InstFinancing%.Pos=1','Financing AS Financing% ON Financing%.ID=InstFinancing%.FinID'),'subtype'=>'text','ord'=>false),
+	'Financing.Type.First'=>array('field'=>'Financing.Type','name'=>'Modalità di finanziamento primaria','type'=>'joini','join'=>array('InstFinancing AS InstFinancing ON InstFinancing.InstID=Instances.ID AND InstFinancing.Pos=1','Financing AS Financing ON Financing.ID=InstFinancing.FinID'),'subtype'=>'text','ord'=>false),
 
 //--------------------------------
 
@@ -182,9 +182,9 @@ $cols=array(
 
 	'Policies.Name'=>array('field'=>'Policies%.Name','name'=>'Una restrizione sui contenuti','type'=>'joini','join'=>array('InstPolicies AS InstPolicies% ON InstPolicies%.InstID=Instances.ID','Policies AS Policies% ON Policies%.ID=InstPolicies%.PolID'),'subtype'=>'text','ord'=>true,'ordname'=>'Restrizioni sui contenuti','ordjoin'=>array('InstPolicies AS OrdInstPolicies ON OrdInstPolicies.InstID=Instances.ID','Policies AS OrdPolicies ON OrdPolicies.ID=OrdInstPolicies.PolID'),'ordselmore'=>'GROUP_CONCAT(OrdPolicies.Name ORDER BY OrdInstPolicies.Pos ASC SEPARATOR \'\') AS xOrdPolicies','ordby'=>'xOrdPolicies'),
 
-	'InstPolicies.PolID.First'=>array('field'=>'InstPolicies%.PolID','name'=>'Restrizione sui contenuti primaria ⮞','type'=>'join','join'=>array('InstPolicies AS InstPolicies% ON InstPolicies%.InstID=Instances.ID AND InstPolicies%.Pos=1'),'ord'=>false),
+	'InstPolicies.PolID.First'=>array('field'=>'InstPolicies.PolID','name'=>'Restrizione sui contenuti primaria ⮞','type'=>'join','join'=>array('InstPolicies AS InstPolicies ON InstPolicies.InstID=Instances.ID AND InstPolicies.Pos=1'),'ord'=>false),
 
-	'Policies.Name.First'=>array('field'=>'Policies%.Name','name'=>'Restrizione sui contenuti primaria','type'=>'joini','join'=>array('InstPolicies AS InstPolicies% ON InstPolicies%.InstID=Instances.ID AND InstPolicies%.Pos=1','Policies AS Policies% ON Policies%.ID=InstPolicies%.PolID'),'subtype'=>'text','ord'=>false),
+	'Policies.Name.First'=>array('field'=>'Policies.Name','name'=>'Restrizione sui contenuti primaria','type'=>'joini','join'=>array('InstPolicies AS InstPolicies ON InstPolicies.InstID=Instances.ID AND InstPolicies.Pos=1','Policies AS Policies ON Policies.ID=InstPolicies.PolID'),'subtype'=>'text','ord'=>false),
 
 //--------------------------------
 
@@ -194,9 +194,9 @@ $cols=array(
 
 	'Tags.Name'=>array('field'=>'Tags%.Name','name'=>'Una tag','type'=>'joini','join'=>array('InstTags AS InstTags% ON InstTags%.InstID=Instances.ID','Tags AS Tags% ON Tags%.ID=InstTags%.TagID'),'subtype'=>'text','ord'=>true,'ordname'=>'Tags','ordjoin'=>array('InstTags AS OrdInstTags ON OrdInstTags.InstID=Instances.ID','Tags AS OrdTags ON OrdTags.ID=OrdInstTags.TagID'),'ordselmore'=>'GROUP_CONCAT(OrdTags.Name ORDER BY OrdInstTags.Pos ASC SEPARATOR \'\') AS xOrdTags','ordby'=>'xOrdTags'),
 
-	'InstTags.TagID.First'=>array('field'=>'InstTags%.TagID','name'=>'Tag primaria ⮞','type'=>'join','join'=>array('InstTags AS InstTags% ON InstTags%.InstID=Instances.ID AND InstTags%.Pos=1'),'ord'=>false),
+	'InstTags.TagID.First'=>array('field'=>'InstTags.TagID','name'=>'Tag primaria ⮞','type'=>'join','join'=>array('InstTags AS InstTags ON InstTags.InstID=Instances.ID AND InstTags.Pos=1'),'ord'=>false),
 
-	'Tags.Name.First'=>array('field'=>'Tags%.Name','name'=>'Tag primaria','type'=>'joini','join'=>array('InstTags AS InstTags% ON InstTags%.InstID=Instances.ID AND InstTags%.Pos=1','Tags AS Tags% ON Tags%.ID=InstTags%.TagID'),'subtype'=>'text','ord'=>false),
+	'Tags.Name.First'=>array('field'=>'Tags.Name','name'=>'Tag primaria','type'=>'joini','join'=>array('InstTags AS InstTags ON InstTags.InstID=Instances.ID AND InstTags.Pos=1','Tags AS Tags ON Tags.ID=InstTags.TagID'),'subtype'=>'text','ord'=>false),
 
 //--------------------------------
 
@@ -566,11 +566,19 @@ if (mysqli_num_rows($res)<1) {
 	$out.='<div class="bigtabfoot"></div>';
 }
 
-$filtpresopts='<option value="null"></option>'.N;
-$res=mysqli_query($link,'SELECT * FROM FilterPresets')
+
+$presid=0;
+if (array_key_exists('presets',$_POST) && preg_match('/^[0-9]+$/',$_POST['presets'])===1)
+	$presid=$_POST['presets'];
+$presopts='<option value="null"></option>'.N;
+$res=mysqli_query($link,'SELECT * FROM Presets ORDER BY Name ASC')
 	or muoribene(mysqli_error($link),true);
-while ($row=mysqli_fetch_assoc($res))
-	$filtpresopts.='<option value="'.$row['ID'].'">'.hspech($row['Name']).'</option>'.N;
+while ($row=mysqli_fetch_assoc($res)) {
+	if ($row['ID']!=$presid)
+		$presopts.='<option value="'.$row['ID'].'">'.hspech($row['Name']).'</option>'.N;
+	else
+		$presopts.='<option value="'.$row['ID'].'" selected>'.hspech($row['Name']).'</option>'.N;
+}
 
 mysqli_close($link);
 
@@ -735,7 +743,8 @@ function popusels(index,valselval) {
 			pupwait(false);
 		};
 		xhr.onerror=function() {
-			alert('Request failed');
+			pupwait(false);
+			alert('La richiesta è fallita.');
 		};
 	} else {
 		alert('Attenziò: non so che farmene del tipo "'+type+'": diglielo, al programmatore.');
@@ -1003,51 +1012,130 @@ function pupwait(on) {
 }
 
 //function setrow(index,openparv,fieldselv,condselv,valueselv,valueinpv,closeparv,andorv)
-function loadfiltpres() {
-	pupwait(true);
-	truncfil();
-	let formdata=new FormData();
-	formdata.append('act','loadfil');
-	formdata.append('fid',document.getElementById('filtpres').value);
-	let xhr=new XMLHttpRequest();
-	xhr.open('POST','loadsavepres.php');
-	xhr.responseType='json';
-	xhr.send(formdata);
-	xhr.onload=function() {
-		let jarr=xhr.response;
-		for (i=0; i<jarr.length; i++) {
-			console.log(jarr[i]);
-			addrow(i+1,false);
-		}
-		synctai();
-		for (i=0; i<jarr.length; i++) {
-			setrow(i+1, jarr[i]['OpenPar'], jarr[i]['Field'], jarr[i]['Cond'], jarr[i]['ValueSel'], jarr[i]['ValueInp'], jarr[i]['ClosePar'], jarr[i]['AndOr']);
-		}
-		if (jarr.length>0)
-			document.getElementById('filbut').value='Rimuovi tutti i criteri di ricerca';
-		pupwait(false);
-	};
-	xhr.onerror=function() {
-		alert('Request failed');
-	};
+function loadpres() {
+	let pres=document.getElementById('presets');
+	if (pres.value!='null') {
+		pupwait(true);
+		let formdata=new FormData();
+		formdata.append('act','load');
+		formdata.append('pid',pres.value);
+		let xhr=new XMLHttpRequest();
+		xhr.open('POST','loadsavepres.php');
+		xhr.responseType='json';
+		xhr.send(formdata);
+		xhr.onload=function() {
+			let jarr=xhr.response;
+			truncfil();
+			for (i=0; i<jarr['f'].length; i++) {
+				console.log(jarr['f'][i]);
+				addrow(i+1,false);
+			}
+			synctai();
+			for (i=0; i<jarr['f'].length; i++) {
+				setrow(i+1, jarr['f'][i]['OpenPar'], jarr['f'][i]['Field'], jarr['f'][i]['Cond'], jarr['f'][i]['ValueSel'], jarr['f'][i]['ValueInp'], jarr['f'][i]['ClosePar'], jarr['f'][i]['AndOr']);
+			}
+			if (jarr['f'].length>0)
+				document.getElementById('filbut').value='Rimuovi tutti i criteri di ricerca';
+			truncord();
+			for (i=0; i<jarr['o'].length; i++) {
+				console.log(jarr['o'][i]);
+				ordaddrow(i+1,false);
+			}
+			synctoi();
+			for (i=0; i<jarr['o'].length; i++) {
+				ordsetrow(i+1, jarr['o'][i]['Field'], jarr['o'][i]['Sort']);
+			}
+			if (jarr['o'].length>0)
+				document.getElementById('ordbut').value='Rimuovi tutti i criteri di ordinamento';
+			pupwait(false);
+		};
+		xhr.onerror=function() {
+			pupwait(false);
+			alert('La richiesta è fallita.');
+		};
+	} else {
+		alerta('<p>Non hai selezionato alcun preset ;)</p>');
+	}
 }
-function savefiltpres() {
+function savepres(txt,asnew) {
 	pupwait(true);
+	let pres=document.getElementById('presets');
 	let formdata=new FormData(document.forms.f);
-	formdata.append('act','savefil');
-	formdata.append('fid',document.getElementById('filtpres').value);
+	formdata.append('act','save');
+	formdata.append('txt',txt);
+	if (!asnew)
+		formdata.append('pid',pres.value);
 	let xhr=new XMLHttpRequest();
 	xhr.open('POST','loadsavepres.php');
 	xhr.responseType='json';
 	xhr.send(formdata);
 	xhr.onload=function() {
 		console.log(xhr.response);
+		if (!asnew) {
+			pres.options[pres.selectedIndex].text=txt;
+		} else {
+			let jarr=xhr.response;
+			pres.add(new Option(txt,jarr['pid']));
+			pres.selectedIndex=pres.options.length-1;
+		}
 		pupwait(false);
 	};
 	xhr.onerror=function() {
-		alert('Request failed');
+		pupwait(false);
+		alert('La richiesta è fallita.');
 	};
 }
+function pupsavepres(asnew) {
+	var pres=document.getElementById('presets');
+	if (pres.value!='null' || asnew) {
+		var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
+		var prestext=pres.options[pres.selectedIndex].text;
+		var pre='<p>Se vuoi puoi modificare il nome del preset che stai per sovrascrivere</p>';
+		if (asnew) pre='<p>Dai un nuovo nome al nuovo preset che stai per salvare</p>';
+		inpup.innerHTML='<div class="loadsavepresbub">'+pre+'<input type="text" maxlength="256" value="'+prestext.replace(/"/g,'&quot;')+'" id="presname"><input type="button" value="Salva" onClick="ckpresname('+asnew+');"><input type="button" value="Annulla" onClick="pupoff();"><div id="ckmsg"></div></div>';
+		pup.style.display='table';
+	} else {
+		alerta('<p>Non hai selezionato alcun preset ;)</p>');
+	}
+}
+function ckpresname(asnew) {
+	var pres=document.getElementById('presets');
+	var presname=document.getElementById('presname').value;
+	var ckmsg=document.getElementById('ckmsg');
+	var ok=true;
+	var i;
+	if (presname.trim=='') {
+		presname='';
+		ok=false;
+		ckmsg.innerHTML='Non puoi salvare un preset senza nome';
+	}
+	if (!asnew) {
+		for (i=0; i<pres.options.length; i++) {
+			if (i!=pres.selectedIndex && presname==pres.options[i].text) {
+				ok=false;
+				ckmsg.innerHTML='<p>Esiste già un altro preset con questo nome</p>';
+				break;
+			}
+		}
+	} else {
+		for (i=0; i<pres.options.length; i++) {
+			if (presname==pres.options[i].text) {
+				ok=false;
+				ckmsg.innerHTML='<p>Esiste già un preset con questo nome</p>';
+				break;
+			}
+		}
+	}
+	if (ok) {
+		pupoff();
+		savepres(presname,asnew);
+	}
+}
+function pupoff() {
+	var pup=document.getElementById('popup'), inpup=document.getElementById('inpopup');
+	inpup.innerHTML='<div id="popupcont">...</div>';
+	pup.style.display='none';
+}
 
 //-->
 </script>
@@ -1073,11 +1161,13 @@ function savefiltpres() {
 </div>
 </div>
 
+<!--
 <div id="footer">
 <form action="edinst.php" name="addinst" method="post">
 <table><tr><td>Aggiungi un’istanza:</td><td><input type="text" name="URI" maxlength="512"></td><td><input type="button" value="Vai" onClick="ckaif();"></td></tr></table>
 </form>
 </div>
+-->
 
 <div id="debug">
 <?php echo($dbg); ?>
@@ -1088,10 +1178,10 @@ function savefiltpres() {
 <table id="planciafil" class="planciatab">
 <tr><td colspan="8"><input type="button" id="filbut" value="Aggiungi criteri di ricerca" class="ctrlbut" onclick="manfil();"></td></tr>
 </table>
-<table class="planciatab"><tr><td style="width:1%">Preset&nbsp;di&nbsp;ricerca:&nbsp;</td><td style="width:96%"><select name="filtpres" id="filtpres" class="preset" onchange="loadfiltpres();"><?php echo($filtpresopts); ?></select></td><td style="width:1%"><img src="imgs/salva.svg" class="lilbut" onclick="savefiltpres(false);" title="Salva i criteri impostati nel preset selezionato sovrascrivendolo"></td><td style="width:1%"><img src="imgs/salvacome.svg" class="lilbut" onclick="savefiltpres(true);" title="Salva i criteri impostati come nuovo preset ..."></td><td style="width:1%"><img src="imgs/minus.svg" class="lilbut" onclick="remfiltpres();" title="Elimina il preset selezionato"></td></tr></table>
 <table id="planciaord" class="planciatab">
 <tr><td colspan="4"><input type="button" id="ordbut" value="Aggiungi criteri di ordinamento" class="ctrlbut" onclick="manord();"></td></tr>
 </table>
+<table class="planciatab"><tr><td style="width:1%">Preset: </td><td style="width:95%"><select name="presets" id="presets" class="presets"><?php echo($presopts); ?></select></td><td style="width:1%"><img src="imgs/carica.svg" class="lilbut" onclick="loadpres();" title="Carica i criteri dal preset selezionato"></td><td style="width:1%"><img src="imgs/salva.svg" class="lilbut" onclick="pupsavepres(false);" title="Salva i criteri impostati nel preset selezionato sovrascrivendolo"></td><td style="width:1%"><img src="imgs/salvacome.svg" class="lilbut" onclick="pupsavepres(true);" title="Salva i criteri impostati come nuovo preset ..."></td><td style="width:1%"><img src="imgs/minus.svg" class="lilbut" onclick="rempres();" title="Elimina il preset selezionato"></td></tr></table>
 <table id="planciaothers" class="planciatab">
 <tr><td><input type="button" id="subbut" value="Applica" class="ctrlbut" onclick="ckf();"></td></tr>
 </table>

+ 117 - 0
web/admin/loadsavepres.php

@@ -0,0 +1,117 @@
+<?php
+
+header('Content-Type: application/json; charset=utf-8');
+
+require('include/glob.php');
+require('include/muoribene.php');
+require('include/sessionstart.php');
+require('include/myconn.php');
+
+use function mysqli_real_escape_string as myesc;
+
+if (array_key_exists('act',$_POST)) {
+	if ($_POST['act']=='load' && array_key_exists('pid',$_POST) && preg_match('/^[0-9]+$/',$_POST['pid'])===1) {
+		$res=mysqli_query($link,'SELECT * FROM PresFiltConds WHERE PresID='.$_POST['pid'].' ORDER BY Pos ASC')
+			or muoribene(mysqli_error($link),true);
+		$buf=array('f'=>array(),'o'=>array());
+		while ($row=mysqli_fetch_assoc($res))
+			$buf['f'][]=$row;
+		$res=mysqli_query($link,'SELECT * FROM PresOrdConds WHERE PresID='.$_POST['pid'].' ORDER BY Pos ASC')
+			or muoribene(mysqli_error($link),true);
+		while ($row=mysqli_fetch_assoc($res))
+			$buf['o'][]=$row;
+		echo(json_encode($buf));
+	} elseif ($_POST['act']=='save' && array_key_exists('txt',$_POST)) {
+		$fi=-1;
+		$oi=-1;
+		$fqueries=array(array());
+		$oqueries=array(array());
+		foreach ($_POST as $key=>$val) {
+			if (preg_match('/^openpar-\d+$/',$key)===1) {
+				$fi++;
+				if ($val=='null')
+					$val='NULL';
+				else
+					$val="'".myesc($link,$val)."'";
+				$fqueries[$fi]['OpenPar']=$val;
+			}
+			if (preg_match('/^fieldsel-\d+$/',$key)===1) {
+				$fqueries[$fi]['Field']="'".myesc($link,$val)."'";
+			}
+			if (preg_match('/^condsel-\d+$/',$key)===1) {
+				$fqueries[$fi]['Cond']="'".myesc($link,$val)."'";
+			}
+			if (preg_match('/^valuesel-\d+$/',$key)===1) {
+				$fqueries[$fi]['ValueSel']="'".myesc($link,$val)."'";
+			}
+			if (preg_match('/^valueinp-\d+$/',$key)===1) {
+				$fqueries[$fi]['ValueInp']="'".myesc($link,$val)."'";
+			}
+			if (preg_match('/^closepar-\d+$/',$key)===1) {
+				if ($val=='null')
+					$val='NULL';
+				else
+					$val="'".myesc($link,$val)."'";
+				$fqueries[$fi]['ClosePar']=$val;
+			}
+			if (preg_match('/^andor-\d+$/',$key)===1) {
+				$fqueries[$fi]['AndOr']="'".myesc($link,$val)."'";
+			}
+			if (preg_match('/^ordfieldsel-\d+$/',$key)===1) {
+				$oi++;
+				$oqueries[$oi]['Field']="'".myesc($link,$val)."'";
+			}
+			if (preg_match('/^ascdesc-\d+$/',$key)===1) {
+				$oqueries[$oi]['Sort']="'".myesc($link,$val)."'";
+			}
+		}
+//		print_r($fqueries).N;
+//		print_r($oqueries).N;
+		if (array_key_exists('pid',$_POST) && preg_match('/^[0-9]+$/',$_POST['pid'])===1) {
+			$pid=$_POST['pid'];
+			mysqli_query($link,'DELETE FROM PresFiltConds WHERE PresID='.$pid)
+				or muoribene(mysqli_error($link),true);
+			mysqli_query($link,'DELETE FROM PresOrdConds WHERE PresID='.$pid)
+				or muoribene(mysqli_error($link),true);
+			mysqli_query($link,'UPDATE Presets SET Name=\''.myesc($link,$_POST['txt']).'\' WHERE ID='.$pid)
+				or muoribene(mysqli_error($link),true);
+		} else {
+			mysqli_query($link,'INSERT INTO Presets SET Name=\''.myesc($link,$_POST['txt']).'\'')
+				or muoribene(mysqli_error($link),true);
+			$pid=mysqli_insert_id($link);
+			echo('{ "pid": '.$pid.' }'.N);
+		}
+		$fi=0;
+		foreach ($fqueries as $row) {
+			$fi++;
+			$query='INSERT INTO PresFiltConds SET PresID='.$pid.', OpenPar='.$row['OpenPar'].', Field='.$row['Field'].', Cond='.$row['Cond'].', ';
+			if (array_key_exists('ValueSel',$row))
+				$query.='ValueSel='.$row['ValueSel'].', ';
+			if (array_key_exists('ValueInp',$row))
+				$query.='ValueInp='.$row['ValueInp'].', ';
+			$query.='ClosePar='.$row['ClosePar'];
+			if (array_key_exists('AndOr',$row))
+				$query.=', AndOr='.$row['AndOr'];
+			$query.=', Pos='.$fi;
+//			echo($query.N);
+			mysqli_query($link,$query)
+				or muoribene(mysqli_error($link),true);
+		}
+		$oi=0;
+		foreach ($oqueries as $row) {
+			$oi++;
+			$query='INSERT INTO PresOrdConds SET PresID='.$pid.', Field='.$row['Field'].', Sort='.$row['Sort'].', Pos='.$oi;
+//			echo($query.N);
+			mysqli_query($link,$query)
+				or muoribene(mysqli_error($link),true);
+		}
+	} elseif ($_POST['act']=='remove' && array_key_exists('pid',$_POST) && preg_match('/^[0-9]+$/',$_POST['pid'])===1) {
+		echo(json_encode($_POST));
+	}
+}
+
+mysqli_close($link);
+
+exit(0);
+
+?>

+ 21 - 2
web/admin/theme.css

@@ -254,6 +254,25 @@ input {
 	margin-left: auto;
 	margin-right: auto;
 }
+#inpopup .loadsavepresbub {
+	background-color: black;
+	color: #78b1e2;
+	padding: 16px;
+	border-radius: 20px;
+	width: 320px;
+	margin-left: auto;
+	margin-right: auto;
+}
+#inpopup .loadsavepresbub input {
+	font-size: 8pt;
+	height: 24px;
+}
+#inpopup .loadsavepresbub #ckmsg p {
+	color: red;
+	margin: 0;
+	padding: 0;
+	margin-top: 16px;
+}
 #popupcont {
 	position: relative;
 	margin-left: auto;
@@ -420,11 +439,11 @@ input {
 	width: 120px;
 }
 /* questi li definisco e li applico solo per avere qualcosa su cui fare "querySelectorAll" */
-#plancia .openpar, #plancia .fieldsel, #plancia .condsel, #plancia .valuesel, #plancia .valueinp, #plancia .andor, #plancia .closepar, #plancia .ordfieldsel, #plancia .ascdesc, #plancia .preset { min-width: 100%; }
+#plancia .openpar, #plancia .fieldsel, #plancia .condsel, #plancia .valuesel, #plancia .valueinp, #plancia .andor, #plancia .closepar, #plancia .ordfieldsel, #plancia .ascdesc, #plancia .presets { min-width: 100%; }
 #plancia .valuesel:disabled, #plancia .valueinp:disabled {
 	opacity: 0.5;
 }
-#plancia .preset {
+#plancia .presets {
 	max-width: 400px;
 }
 #plancia .minus, #plancia .plus, #plancia .lilbut {

+ 151 - 27
web/admin/zzz-materiali/mastostart.sql

@@ -3,9 +3,9 @@
 -- https://www.phpmyadmin.net/
 --
 -- Host: localhost
--- Creato il: Gen 11, 2020 alle 19:59
+-- Creato il: Gen 27, 2020 alle 17:23
 -- Versione del server: 10.4.11-MariaDB
--- Versione PHP: 7.4.1
+-- Versione PHP: 7.4.2
 
 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
 SET AUTOCOMMIT = 0;
@@ -75,7 +75,8 @@ CREATE TABLE `InstActivity` (
   `Week` int(10) UNSIGNED NOT NULL,
   `Statuses` int(10) UNSIGNED NOT NULL,
   `Logins` int(10) UNSIGNED NOT NULL,
-  `Registrations` int(10) UNSIGNED NOT NULL
+  `Registrations` int(10) UNSIGNED NOT NULL,
+  `Pos` tinyint(3) UNSIGNED NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 -- --------------------------------------------------------
@@ -96,7 +97,7 @@ CREATE TABLE `Instances` (
   `ShortDesc` text COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `LongDesc` text COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `OurDesc` varchar(8192) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-  `PlaceID` int(10) UNSIGNED DEFAULT NULL,
+  `LocalityID` int(10) UNSIGNED DEFAULT NULL,
   `Email` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `Software` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `Version` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
@@ -223,6 +224,18 @@ CREATE TABLE `Languages` (
 -- --------------------------------------------------------
 
 --
+-- Struttura della tabella `Localities`
+--
+
+CREATE TABLE `Localities` (
+  `ID` int(10) UNSIGNED NOT NULL,
+  `Locality` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+  `ProvinceID` int(10) UNSIGNED NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
 -- Struttura della tabella `Notifications`
 --
 
@@ -237,37 +250,89 @@ CREATE TABLE `Notifications` (
 -- --------------------------------------------------------
 
 --
--- Struttura della tabella `Places`
+-- Struttura della tabella `Platforms`
 --
 
-CREATE TABLE `Places` (
+CREATE TABLE `Platforms` (
+  `ID` mediumint(8) UNSIGNED NOT NULL,
+  `Name` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Struttura della tabella `Policies`
+--
+
+CREATE TABLE `Policies` (
   `ID` int(10) UNSIGNED NOT NULL,
-  `State` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-  `Region` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-  `Province` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-  `Locality` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL
+  `Name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 -- --------------------------------------------------------
 
 --
--- Struttura della tabella `Platforms`
+-- Struttura della tabella `Presets`
 --
 
-CREATE TABLE `Platforms` (
-  `ID` mediumint(8) UNSIGNED NOT NULL,
-  `Name` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL
+CREATE TABLE `Presets` (
+  `ID` int(10) UNSIGNED NOT NULL,
+  `Name` varchar(256) COLLATE utf8mb4_unicode_ci NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 -- --------------------------------------------------------
 
 --
--- Struttura della tabella `Policies`
+-- Struttura della tabella `PresFiltConds`
 --
 
-CREATE TABLE `Policies` (
+CREATE TABLE `PresFiltConds` (
+  `PresID` int(10) UNSIGNED NOT NULL,
+  `OpenPar` varchar(3) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+  `Field` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
+  `Cond` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
+  `ValueSel` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+  `ValueInp` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+  `ClosePar` varchar(3) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+  `AndOr` varchar(3) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+  `Pos` tinyint(3) UNSIGNED NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Struttura della tabella `PresOrdConds`
+--
+
+CREATE TABLE `PresOrdConds` (
+  `PresID` int(10) UNSIGNED NOT NULL,
+  `Field` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
+  `Sort` varchar(4) COLLATE utf8mb4_unicode_ci NOT NULL,
+  `Pos` tinyint(3) UNSIGNED NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Struttura della tabella `Provinces`
+--
+
+CREATE TABLE `Provinces` (
   `ID` int(10) UNSIGNED NOT NULL,
-  `Name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL
+  `Province` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
+  `RegionID` int(10) UNSIGNED NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Struttura della tabella `Regions`
+--
+
+CREATE TABLE `Regions` (
+  `ID` int(10) UNSIGNED NOT NULL,
+  `Region` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
+  `StateID` int(10) UNSIGNED NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 -- --------------------------------------------------------
@@ -284,6 +349,17 @@ CREATE TABLE `StartNodes` (
 -- --------------------------------------------------------
 
 --
+-- Struttura della tabella `States`
+--
+
+CREATE TABLE `States` (
+  `ID` int(10) UNSIGNED NOT NULL,
+  `State` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
 -- Struttura della tabella `Tags`
 --
 
@@ -338,15 +414,15 @@ ALTER TABLE `Languages`
   ADD PRIMARY KEY (`ID`);
 
 --
--- Indici per le tabelle `Notifications`
+-- Indici per le tabelle `Localities`
 --
-ALTER TABLE `Notifications`
+ALTER TABLE `Localities`
   ADD PRIMARY KEY (`ID`);
 
 --
--- Indici per le tabelle `Places`
+-- Indici per le tabelle `Notifications`
 --
-ALTER TABLE `Places`
+ALTER TABLE `Notifications`
   ADD PRIMARY KEY (`ID`);
 
 --
@@ -362,12 +438,36 @@ ALTER TABLE `Policies`
   ADD PRIMARY KEY (`ID`);
 
 --
+-- Indici per le tabelle `Presets`
+--
+ALTER TABLE `Presets`
+  ADD PRIMARY KEY (`ID`);
+
+--
+-- Indici per le tabelle `Provinces`
+--
+ALTER TABLE `Provinces`
+  ADD PRIMARY KEY (`ID`);
+
+--
+-- Indici per le tabelle `Regions`
+--
+ALTER TABLE `Regions`
+  ADD PRIMARY KEY (`ID`);
+
+--
 -- Indici per le tabelle `StartNodes`
 --
 ALTER TABLE `StartNodes`
   ADD PRIMARY KEY (`ID`);
 
 --
+-- Indici per le tabelle `States`
+--
+ALTER TABLE `States`
+  ADD PRIMARY KEY (`ID`);
+
+--
 -- Indici per le tabelle `Tags`
 --
 ALTER TABLE `Tags`
@@ -414,16 +514,16 @@ ALTER TABLE `Languages`
   MODIFY `ID` int(11) UNSIGNED NOT NULL AUTO_INCREMENT;
 
 --
--- AUTO_INCREMENT per la tabella `Notifications`
+-- AUTO_INCREMENT per la tabella `Localities`
 --
-ALTER TABLE `Notifications`
-  MODIFY `ID` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+ALTER TABLE `Localities`
+  MODIFY `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
 
 --
--- AUTO_INCREMENT per la tabella `Places`
+-- AUTO_INCREMENT per la tabella `Notifications`
 --
-ALTER TABLE `Places`
-  MODIFY `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
+ALTER TABLE `Notifications`
+  MODIFY `ID` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
 
 --
 -- AUTO_INCREMENT per la tabella `Platforms`
@@ -438,12 +538,36 @@ ALTER TABLE `Policies`
   MODIFY `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
 
 --
+-- AUTO_INCREMENT per la tabella `Presets`
+--
+ALTER TABLE `Presets`
+  MODIFY `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT per la tabella `Provinces`
+--
+ALTER TABLE `Provinces`
+  MODIFY `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT per la tabella `Regions`
+--
+ALTER TABLE `Regions`
+  MODIFY `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
 -- AUTO_INCREMENT per la tabella `StartNodes`
 --
 ALTER TABLE `StartNodes`
   MODIFY `ID` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT;
 
 --
+-- AUTO_INCREMENT per la tabella `States`
+--
+ALTER TABLE `States`
+  MODIFY `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
 -- AUTO_INCREMENT per la tabella `Tags`
 --
 ALTER TABLE `Tags`

+ 7 - 7
web/home_it.php

@@ -92,20 +92,20 @@
 
 <section>
 <h3><a name="Introduction" id="Introduction" class="anchor"></a>Introduzione</h3>
-<p>Mastodon è una innovativa piattaforma di microblogging open source le cui funzionalità possono ricordare Twitter o Tumblr. Lo sviluppo inizia nel 2016 da parte dello sviluppatore Eugen Rochko e da allora Mastodon ha continuato a crescere grazie a sempre più comunità che lo adottano in cerca di un ambiente social indipendente, slegato da grandi compagnie e libero da censura.</p>
+<p>Mastodon è una innovativa piattaforma di microblogging open source le cui funzionalità possono ricordare Twitter o Tumblr. Eugen Rochko ne inizia lo sviluppo nel 2016 e da allora Mastodon continua ad attrarre nuovi utenti e comunità in cerca di un ambiente social indipendente, slegato da grandi compagnie e libero da censura.</p>
 <p>Ma Mastodon non è un clone di Twitter: per concetto, struttura e funzionalità è qualcosa di totalmente diverso e molto più interessante!</p>
-<p>Questo sito è unintroduzione a funzionalità e concetti base che permettono di comprendere e apprezzare appieno il funzionamento di Mastodon. È concepito come una serie di capitoli indipendenti selezionabili da menù (clicca su “Guida” per visualizzare l’indice dei capitoli), ma può essere tranquillamente letto come un testo unico. Contiene inoltre un <a href="instances/it">elenco di Istanze Mastodon</a> suggerite tra cui scegliere quella che meglio si addice alle tue esigenze.</p>
+<p>Questo sito è un'introduzione a funzionalità e concetti base che permettono di comprendere ed apprezzare appieno il funzionamento di Mastodon. È concepito come una serie di capitoli indipendenti selezionabili da menù (clicca su "Guida" per visualizzare l'indice dei capitoli), ma può esser tranquillamente letto come un testo unico. Contiene inoltre un <a href="instances/it">elenco di Istanze Mastodon</a> suggerite tra cui scegliere quella che meglio si addice alle tue esigenze.</p>
 </section>
 
 <section class="lev1sect">
-<h2><a name="WhatIsMastodon" id="WhatIsMastodon" class="anchor"></a>Cos’è mastodon?</h2>
+<h2><a name="WhatIsMastodon" id="WhatIsMastodon" class="anchor"></a>Cos’è Mastodon?</h2>
 </section>
 
 <section>
 <h3><a name="MastodonIsNotASocial" id="MastodonIsNotASocial" class="anchor"></a>Mastodon non è <em>un</em> social network</h3>
 <p>Non c’è <em>un</em> social network chiamato Mastodon! Ci sono, invece, migliaia di social network indipendenti chiamati Istanze Mastodon.</p>
 <p>Ogni Istanza ha il proprio server indipendente, la sua homepage, comunità, regole e persone responsabili dell’amministrazione e moderazione.</p>
-<p>Da ogni Istanza puoi interagire con persone che si trovano sulle altre Istanze. Funziona un po’ come l’e-mail (si può spedire un’e-mail da Gmail a un indirizzo Yahoo, giusto?). Questo perché tutte le Istanze possono connettersi tra loro.</p>
+<p>Da ogni Istanza puoi interagire con persone che si trovano sulle altre Istanze. Funziona un po’ come l’e-mail (si può spedire un’e-mail da Gmail a un indirizzo Yahoo, giusto? Stessa cosa!). Questo perché tutte le Istanze possono connettersi tra loro.</p>
 <p>Chi amministra un’Istanza può silenziare o bloccare utenti della sua Istanza ma anche quelli di Istanze diverse e questi blocchi avranno però effetto solo sull’Istanza che amministra. Può anche decidere di bloccare completamente un’altra Istanza (per esempio perché permette la pubblicazione di contenuti offensivi o perché non è moderata adeguatamente).</p>
 </section>
 
@@ -118,9 +118,9 @@
 
 <section>
 <h3><a name="WhoOwnsMastodon" id="WhoOwnsMastodon" class="anchor"></a>Di chi è Mastodon?</h3>
-<p>Del mondo intero! Poiché Mastodon è una piattaforma libera, gratuita e open source, chiunque può usarla, modificarla e, volendo, installarla su un proprio server per creare un’Istanza. Chi ne porta avanti lo sviluppo non ha alcun copyright sul software che realizza e mette a disposizione gratuitamente. Questo è un classico esempio della filosofia alla base del software libero: realizzare e condividere senza alcuna restrizione strumenti software aperti affinché chiunque possa utilizzarli come preferisce e collaborare al loro miglioramento.</p>
-<p><img src="<?php echo($prepath); ?>imgs/WhoOwnsMastodon.jpg" class="image" alt="Una ragazza con le braccia aperte davanti a un cielo azzurro. Foto di Jess Hall." title="Foto di Jess Hall."></p>
-<p>I tuoi dati personali e i contenuti che pubblichi si trovano materialmente sul server dell’Istanza su cui ti registri. Questo significa che oltre a te solo chi amministra la tua Istanza ha la possibilità di accedervi, esattamente come su qualsiasi piattaforma commerciale e non.</p>
+<p>Di tutti! Poiché Mastodon è una piattaforma libera, gratuita e open source, chiunque può usarla, modificarla e, volendo, installarla su un proprio server per creare un’Istanza. Chi ne porta avanti lo sviluppo non ha alcun copyright sul software che realizza e mette a disposizione gratuitamente. Questo è un classico esempio della filosofia alla base del software libero: realizzare e condividere senza alcuna restrizione strumenti software aperti affinché chiunque possa utilizzarli come preferisce e collaborare al loro miglioramento.</p>
+<p><img src="<?php echo($prepath); ?>imgs/WhoOwnsMastodon.png" class="image" alt="Quattro mani che si stringono a vicenda."></p>
+<p>I tuoi dati personali e i contenuti che pubblichi si trovano materialmente sul server dell’Istanza su cui ti registri. Questo significa che oltre a te, solo gli amministratori dell’Istanza su cui sei registrato hanno la possibilità di accedervi, esattamente come su qualsiasi piattaforma commerciale e non.</p>
 </section>
 
 <section class="lev1sect">

BIN
web/imgs/WhoOwnsMastodon.png