<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:"Segoe UI";
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
h1
{mso-style-priority:9;
mso-style-link:"Otsikko 1 Char";
mso-margin-top-alt:auto;
margin-right:0cm;
mso-margin-bottom-alt:auto;
margin-left:0cm;
font-size:24.0pt;
font-family:"Calibri",sans-serif;
font-weight:bold;}
h2
{mso-style-priority:9;
mso-style-link:"Otsikko 2 Char";
mso-margin-top-alt:auto;
margin-right:0cm;
mso-margin-bottom-alt:auto;
margin-left:0cm;
font-size:18.0pt;
font-family:"Calibri",sans-serif;
font-weight:bold;}
h3
{mso-style-priority:9;
mso-style-link:"Otsikko 3 Char";
mso-margin-top-alt:auto;
margin-right:0cm;
mso-margin-bottom-alt:auto;
margin-left:0cm;
font-size:13.5pt;
font-family:"Calibri",sans-serif;
font-weight:bold;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
code
{mso-style-priority:99;
font-family:"Courier New";}
pre
{mso-style-priority:99;
mso-style-link:"HTML-esimuotoiltu Char";
margin:0cm;
font-size:10.0pt;
font-family:"Courier New";}
span.Shkpostityyli17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
span.Otsikko1Char
{mso-style-name:"Otsikko 1 Char";
mso-style-priority:9;
mso-style-link:"Otsikko 1";
font-family:"Calibri",sans-serif;
mso-fareast-language:FI;
font-weight:bold;}
span.Otsikko2Char
{mso-style-name:"Otsikko 2 Char";
mso-style-priority:9;
mso-style-link:"Otsikko 2";
font-family:"Calibri",sans-serif;
mso-fareast-language:FI;
font-weight:bold;}
span.Otsikko3Char
{mso-style-name:"Otsikko 3 Char";
mso-style-priority:9;
mso-style-link:"Otsikko 3";
font-family:"Calibri",sans-serif;
mso-fareast-language:FI;
font-weight:bold;}
span.HTML-esimuotoiltuChar
{mso-style-name:"HTML-esimuotoiltu Char";
mso-style-priority:99;
mso-style-link:HTML-esimuotoiltu;
font-family:"Courier New";
mso-fareast-language:FI;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 2.0cm 70.85pt 2.0cm;}
div.WordSection1
{page:WordSection1;}
/* List Definitions */
@list l0
{mso-list-id:139884943;
mso-list-template-ids:1447737560;}
@list l0:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l0:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l0:level3
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level4
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level5
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level6
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level7
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level8
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level9
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1
{mso-list-id:880090595;
mso-list-template-ids:2067148412;}
@list l1:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l1:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l1:level3
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level4
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level5
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level6
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level7
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level8
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level9
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2
{mso-list-id:1258713111;
mso-list-template-ids:-98640968;}
@list l2:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l2:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l2:level3
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level4
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level5
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level6
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level7
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level8
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level9
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l3
{mso-list-id:1510363481;
mso-list-template-ids:180547362;}
@list l3:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l3:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l3:level3
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l3:level4
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l3:level5
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l3:level6
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l3:level7
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l3:level8
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l3:level9
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4
{mso-list-id:1556550747;
mso-list-template-ids:1196971720;}
@list l4:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l4:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l4:level3
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level4
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level5
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level6
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level7
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level8
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level9
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5
{mso-list-id:1695498071;
mso-list-template-ids:1653650800;}
@list l5:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l5:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l5:level3
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level4
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level5
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level6
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level7
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level8
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level9
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l6
{mso-list-id:1869443336;
mso-list-template-ids:155507638;}
@list l6:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l6:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l6:level3
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l6:level4
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l6:level5
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l6:level6
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l6:level7
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l6:level8
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l6:level9
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l7
{mso-list-id:1885944283;
mso-list-template-ids:-2132388030;}
@list l7:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l7:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l7:level3
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l7:level4
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l7:level5
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l7:level6
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l7:level7
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l7:level8
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l7:level9
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="FI" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Segoe UI",sans-serif">Good news everyone,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Segoe UI",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Segoe UI",sans-serif">Fresh from the oven! The version 2.10.0 of Oskari has just been released! It is now available on GitHub (<a href="https://github.com/oskariorg">https://github.com/oskariorg</a>)
and Oskari.org Maven repository. The sample application package has been updated on the download link in Oskari.org (<a href="https://oskari.org/download">https://oskari.org/download</a>) and
<a href="http://download.osgeo.org/oskari/">http://download.osgeo.org/oskari/</a>. As always you can take a peek at the latest release at
<a href="https://demo.oskari.org/">https://demo.oskari.org/</a>.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Segoe UI",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Segoe UI",sans-serif">This time we have done some huge changes under the hood to improve maintainability and in preparation for an upcoming UI change. We have polished the controls that are on the
map with a new coat of paint (and scraped off some of the older layers in the process). This also allowed us to do more with theming and now users can customize their embedded maps with a new set of bells and whistles added to the publisher tool. Same for
the geoportal but with less bells and/or whistles and more Java-code migrations and JSON content on the database. Anyways, it has been a while since the last release so buckle in for the wild ride of release notes below (also take a look at the
<a href="https://github.com/oskariorg/oskari-server/blob/master/MigrationGuide.md">
https://github.com/oskariorg/oskari-server/blob/master/MigrationGuide.md</a> when updating).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Segoe UI",sans-serif"><o:p> </o:p></span></p>
<h1 style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white">
<span lang="EN-US" style="font-size:22.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Release Notes<o:p></o:p></span></h1>
<h2 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);border-bottom:var(--color-border-muted);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:16.5pt;font-family:"Segoe UI",sans-serif;color:#24292F">Oskari-frontend<o:p></o:p></span></h2>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">For a full list of changes see: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-frontend/milestone/40?closed=1"><span lang="EN-US">https://github.com/oskariorg/oskari-frontend/milestone/40?closed=1</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Base HTML structure improvements<o:p></o:p></span></h3>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">A set of new helper functions have been added for referencing "base elements" on the page and add CSS classes for styling these elements.
</span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">All of this is about:<o:p></o:p></span></p>
<ul type="disc">
<li class="MsoNormal" style="color:#24292F;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l3 level1 lfo1;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">ground work for an upcoming UI improvement<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l3 level1 lfo1;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">making it easier to document things<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l3 level1 lfo1;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">documenting the base elements to make it easier to customize<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l3 level1 lfo1;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">cleaning of the base HTML (unnecessary elements have been removed from the base HTML on the sample-server-extension)<o:p></o:p></span></li></ul>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" style="background:white;border-collapse:collapse;box-sizing: border-box;border-spacing: 0px;width:max-content;max-width:100%;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;overflow:auto;word-spacing:0px">
<thead>
<tr style="box-sizing: border-box;background-color:var(--color-canvas-default);border-top:var(--color-border-muted)">
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt">
<p class="MsoNormal" align="center" style="margin-bottom:12.0pt;text-align:center">
<b><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Prev. selector<o:p></o:p></span></b></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt">
<p class="MsoNormal" align="center" style="margin-bottom:12.0pt;text-align:center">
<b><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">JS-getter<o:p></o:p></span></b></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt">
<p class="MsoNormal" align="center" style="margin-bottom:12.0pt;text-align:center">
<b><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">New selector for styling<o:p></o:p></span></b></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt">
<p class="MsoNormal" align="center" style="margin-bottom:12.0pt;text-align:center">
<b><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Role<o:p></o:p></span></b></p>
</td>
</tr>
</thead>
<tbody>
<tr style="box-sizing: border-box;background-color:var(--color-canvas-default);border-top:var(--color-border-muted)">
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><code><span style="font-size:10.0pt;font-family:Consolas;color:#24292F">body</span></code><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><code><span style="font-size:10.0pt;font-family:Consolas;color:#24292F">Oskari.dom.getRootEl()</span></code><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><code><span style="font-size:10.0pt;font-family:Consolas;color:#24292F">.oskari-root-el</span></code><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Everything Oskari generates goes under here<o:p></o:p></span></p>
</td>
</tr>
<tr style="box-sizing: border-box;background-color:var(--color-canvas-subtle);border-top:var(--color-border-muted)">
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><code><span style="font-size:10.0pt;font-family:Consolas;color:#24292F">#contentMap</span></code><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><code><span style="font-size:10.0pt;font-family:Consolas;color:#24292F">Oskari.dom.getMapContainerEl()</span></code><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><code><span style="font-size:10.0pt;font-family:Consolas;color:#24292F">.oskari-map-container-el</span></code><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Container for the Oskari map<o:p></o:p></span></p>
</td>
</tr>
<tr style="box-sizing: border-box;background-color:var(--color-canvas-default);border-top:var(--color-border-muted)">
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><code><span style="font-size:10.0pt;font-family:Consolas;color:#24292F">#mapdiv</span></code><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><code><span style="font-size:10.0pt;font-family:Consolas;color:#24292F">Oskari.dom.getMapImplEl()</span></code><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><code><span style="font-size:10.0pt;font-family:Consolas;color:#24292F">.oskari-map-impl-el</span></code><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
</td>
<td style="padding:4.5pt 9.75pt 4.5pt 9.75pt;box-sizing: border-box;border:var(--color-border-default)">
<p class="MsoNormal"><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Container for map engine/impl (inside "contentMap")<o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The root element now defaults to element with id </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> or
the </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">body</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> tag when not available. The </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> id
can be used when the elements need to be controlled more tightly to work with other content on the page and Oskari should not take control of the page fully. Using the custom root element means that the size of the root element need to be set/controlled as
well (is NOT handled by Oskari though we might introduce min-size in the future). If the whole page is controlled by Oskari the size is set to cover the whole browser window by assuming the root is the body tag.<o:p></o:p></span></p>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The elements with ids </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">contentMap</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> and </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">mapdiv</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> are
created under the root element if they are not present. The new CSS classes are attached automatically and have styling attached to them. The old id's have been kept for compatibility reasons and are no longer used by code under </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari-frontend</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">.
The JS getters should be used for referencing the elements (instead of the old id's) and CSS classes for styling. A helper </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">Oskari.dom.isEmbedded()</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> was
also added for detecting if the app is an embedded map as some tools use this information.<o:p></o:p></span></p>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">For now the navigation bar that holds toolbar and tile/menu items of Oskari is assumed to be a </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F"><nav></span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> element
directly under the root element. The map elements are appended after it by default, but having for example the </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">#contentMap</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> element
on the page before the </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">nav</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> controls which side of the map
the navigation is. The Oskari flyouts now use this information to determine initial the Flyout location instead of hard coded values. The navigation element creation and content is planned to be moved to code as well as there are future requirements for making
the navigation element more dynamic.<o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">For more details see: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-frontend/pull/2042"><span lang="EN-US">#2042</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">This change makes the map size handling much simpler:<o:p></o:p></span></p>
<ul type="disc">
<li class="MsoNormal" style="color:#24292F;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l6 level1 lfo2;background:white;box-sizing: border-box">
<code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">.oskari-map-container-el</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> defines maximum size that the map can have<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;mso-margin-bottom-alt:auto;mso-list:l6 level1 lfo2;background:white;box-sizing: border-box">
<code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">.oskari-map-impl-el</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> defines the size of the map itself (can be smaller than </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">.oskari-map-container-el</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> but
not bigger. </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Used for example to preview publisher size setting)<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;mso-margin-bottom-alt:auto;mso-list:l6 level1 lfo2;background:white;box-sizing: border-box">
<code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">mapmodule</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> bundle now monitors its own element size for changes without external notifications
required<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;mso-margin-bottom-alt:auto;mso-list:l6 level1 lfo2;background:white;box-sizing: border-box">
<code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">MapSizeChangedEvent</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> is still sent when the map size changes so other parts of the code base can
react to size changes<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;mso-margin-bottom-alt:auto;mso-list:l6 level1 lfo2;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">This makes the following requests unnecessary and they have been removed from the code base: </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">MapFull.MapResizeEnabledRequest</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">, </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">MapFull.MapSizeUpdateRequest</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">, </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">MapFull.MapWindowFullScreenRequest</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><o:p></o:p></span></li></ul>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Theme<o:p></o:p></span></h3>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-frontend/blob/2.10.0/src/react/theme/ThemeHelper.js"><span lang="EN-US">ThemeHelper</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> now
has a function for easily getting theme selections that can be used for navigational elements like the buttons on the map: </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">ThemeHelper.getNavigationTheme({...theme})</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> in
a similar way that </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">ThemeHelper.getHeaderTheme({...theme})</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> was
previously used for windowing elements. The helper is still work-in-progress and comments about it are welcome. The idea is to provide getters that can try several settings from the theme JSON before returning a value for given theme variable. This way we
can offer specific choices for theme setting but also provide fallbacks so a simple theme JSON could be given instead of giving a setting for every little detail in the theme.<o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Theme now also injects global style overrides to enable jQuery-based windowing elements have theming support and add initial theming support for the main navigation
menu. See details in: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-frontend/pull/2100"><span lang="EN-US">#2100</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> This
is similar to what Oskari-based applications do to override the default colors.<o:p></o:p></span></p>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Map theme<o:p></o:p></span></h3>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Handling for a new subobject named "map" was added to the theme enabling the map controls to use similar theme structure as the rest of Oskari application but individual
toggles that can be adjusted just for the map. An example would be a case where the buttons on the map and the popups they open need to have a different color scheme as the rest of the geoportal. This was the case before theming support where the default UI
on Oskari had yellow colored flyouts/popups, but similar components opened by buttons on the map had dark headers instead.<o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The way the "map" theme works is it can have the same structure as a normal theme JSON, but the mapmodule generates a theme for itself by combining the geoportal theme
and overriding it with keys from the map subobject. As an example:<o:p></o:p></span></p>
<pre style="background:white;box-sizing: border-box;overflow-wrap: normal;background-color:var(--color-canvas-subtle);border-radius: 6px;overflow:auto"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm">{<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"> color: {<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"> primary: 'yellow',<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"> accent: 'red'<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"> },<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"> map: {<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"> color: {<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"> primary: 'gray'<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"> }<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"> }<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm">}<o:p></o:p></span></code></pre>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The mapmodule uses its own ThemeProvider context for its components. The map components would (in the example above) get a theme where the primary color is gray while
non-map components would see the primary color as yellow. Both types of components would see the accent color as 'red' as it's not overridden under the map key. The mapmodule has </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">set/getMapTheme()</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> methods
and it listens to changes on the geoportal theme to update the theme for map components.<o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Some of these are listed in </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-frontend/pull/2069"><span lang="EN-US">#2069</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> and
this will be documented in more detail in oskari.org.<o:p></o:p></span></p>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Publisher functionality<o:p></o:p></span></h3>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Enabled by the new theme support the publisher functionality now includes an initial theme editor for the embedded maps. This allows the end user to select for example
colors that affect the controls on the map and the popups they open. The visual options that were previously offered have been changed to preset values for the new theme editor so they can be used as a starting point for more customized theme.<o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The tool placement/dragging mode in publisher now shows handles for tools as a visual reminder that tools can be dragged. Most restraints for plugin placement have been
removed so they can be moved more freely.<o:p></o:p></span></p>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Draw tools<o:p></o:p></span></h3>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The drawtools bundle has been rewritten to make it easier to read and maintain. When requesting buffered features for drawing, they are now generated for all features
in a multi feature collection. An issue has been fixed on perimeter/outer ring length measurements for polygons. The measurement tooltips no longer block clicks on the map so it's easier to edit measurements. Updated StopDrawingRequest documentation to match
implementation.<o:p></o:p></span></p>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Map controls<o:p></o:p></span></h3>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">All of the map controls (buttons on top of map etc) that are included in </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari-frontend</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> have
been rewritten as React-based components. They can now be styled using theme variables and have icons changed to SVG enabling hovering and more flexible styling options. The popups they open are theme-aware as well and some of the controls gained new functionalities:<o:p></o:p></span></p>
<ul type="disc">
<li class="MsoNormal" style="color:#24292F;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l7 level1 lfo3;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Search can now be minimized to a smaller icon when clicked on the map<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l7 level1 lfo3;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">The previous pan buttons tool now only shows the reset button by default but it can be configured (using publisher UI) to show the arrows when required<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l7 level1 lfo3;background:white;box-sizing: border-box">
<strong><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">The concept of "mobile mode" with the toolbar on top of the map has been removed</span></strong><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l7 level1 lfo3;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Tools now modify their own UI to fit a smaller screen more properly. As an example the zoombar hides its slider and makes its buttons bigger.<o:p></o:p></span></li></ul>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">To make it easier to migrate any customized plugins to the new plugin structure the deprecated methods in </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">BasicMapModulePlugin.js</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> have
been kept as no-op functions with logging to tell developers they should migrate a plugin that uses them:<o:p></o:p></span></p>
<ul type="disc">
<li class="MsoNormal" style="color:#24292F;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo4;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">getMobileDefs()<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo4;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">removeToolbarButtons()<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo4;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">addToolbarButtons()<o:p></o:p></span></li></ul>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">For details see: <a href="https://github.com/oskariorg/oskari-frontend/pull/2082">#2082</a><o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Also documentation about customization for some common cases can be found in:<o:p></o:p></span></p>
<ul type="disc">
<li class="MsoNormal" style="color:#24292F;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l4 level1 lfo5;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><a href="https://oskari.org/documentation/customize/logo"><span lang="EN-US">https://oskari.org/documentation/customize/logo</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l4 level1 lfo5;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><a href="https://oskari.org/documentation/customize/indexmap"><span lang="EN-US">https://oskari.org/documentation/customize/indexmap</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><o:p></o:p></span></li></ul>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Build scripts<o:p></o:p></span></h3>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Parameters can now be passed on command line in another way (</span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-frontend/pull/2064"><span lang="EN-US">#2064</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">)
Both of these work with version 2.10:<o:p></o:p></span></p>
<pre style="background:white;box-sizing: border-box;overflow-wrap: normal;background-color:var(--color-canvas-subtle);border-radius: 6px;overflow:auto"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm">npm run build -- --env.appdef=applications<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm">npm run build --appdef=applications<o:p></o:p></span></code></pre>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Build script now allows generating builds to non-default domain with parameter: </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">--env.domain=https://cdn.domain.org</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">.<o:p></o:p></span></p>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">New React components<o:p></o:p></span></h3>
<ul type="disc">
<li class="MsoNormal" style="color:#24292F;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo6;background:white;box-sizing: border-box">
<code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">MapButton</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> under </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">oskari-ui</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> for
generic button on the map<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo6;background:white;box-sizing: border-box">
<code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">MapModuleButton</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> under </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">mapmodule</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> uses
MapButton and adds theme handling<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo6;background:white;box-sizing: border-box">
<code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">SidePanel</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> under </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">oskari-ui</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> is
currently used for printout options panel (publisher and others will be migrated to this in future release)<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo6;background:white;box-sizing: border-box">
<code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">Tooltip</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> component should now clear from the screen properly when the element they are attached
to is not shown<o:p></o:p></span></li></ul>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Other improvements<o:p></o:p></span></h3>
<ul type="disc">
<li class="MsoNormal" style="color:#24292F;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">VectorTileLayerPlugin now receives the actual map resolutions array instead of using OpenLayers defaults.
</span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">This might affect styling of vector tile layers: <a href="https://github.com/oskariorg/oskari-frontend/pull/2115">#2115</a><o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Thematic map now allows classification with 2 values if method is not </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">jenks</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> and
histogram view has been improved<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Fixed issues with layer list in embedded map: layers are now listed in correct/reversed order and style select is no longer shown if there is only one style to select from<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Added bundle documentation for </span><code><span style="font-size:10.0pt;font-family:Consolas">mydata</span></code><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Fixed a visual issue with infobox title<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Fixed an issue with opacity setting and vector layer features in 3D<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">My places now checks polygon feature validity so users can't save a self-intersecting polygon<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Fixed an issue with userlayer import: input for providing missing projection information is now shown when required<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Printout options panel has been rewritten with React<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Added a workaround for OpenLayers issue with features having a property named </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">geometry</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><a href="https://github.com/oskariorg/oskari-frontend/pull/2110"><span lang="EN-US">#2110</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Metadata search (</span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">metadatacatalogue</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">)
bundle can now function without the </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas">search</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"> bundle being present in the application. It
now creates its own tile/menu item if it can't inject itself into the normal search UI.<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l5 level1 lfo7;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Library updates:<o:p></o:p></span></li><ul type="circle">
<li class="MsoNormal" style="color:#24292F;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l5 level2 lfo7;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">OpenLayers 7.1.0 -> 7.2.2<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l5 level2 lfo7;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">moment.js 2.29.1 -> 2.29.4<o:p></o:p></span></li></ul>
</ul>
<h2 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white">
<span style="font-size:16.5pt;font-family:"Segoe UI",sans-serif;color:#24292F">oskari-server<o:p></o:p></span></h2>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">For a full list of changes see: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-server/milestone/44?closed=1"><span lang="EN-US">https://github.com/oskariorg/oskari-server/milestone/44?closed=1</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Service customization<o:p></o:p></span></h3>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Appsetups can now have a </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">theme JSON</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> in
the database table </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari_maplayer.metadata</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> under the key </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">theme</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">.
This enables embedded maps with user defined theme and it can also be used to customize the geoportal views. On the same note, the map tools no longer have "toolStyle" or "font" config and the previous selections made in publisher for embedded maps have been
migrated to theme JSON in the database.<o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The theme can now be provided as part of an initial appsetup JSON when initializing an Oskari-based application programmatically: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-server/pull/909"><span lang="EN-US">#909</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> (See
sample-server-extension </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/sample-server-extension/blob/7f499fc51147be981108ef2536788c5cc811417c/app-resources/src/main/resources/json/apps/geoportal-3067.json#L12-L50"><span lang="EN-US">https://github.com/oskariorg/sample-server-extension/blob/7f499fc51147be981108ef2536788c5cc811417c/app-resources/src/main/resources/json/apps/geoportal-3067.json#L12-L50</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">).<o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">See migration notes for more information about theming changes.<o:p></o:p></span></p>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">A centralized helper class </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">org.oskari.util.Customization</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> was
added for getting markers and service logo and make customization easier. The logo can be customized for Oskari instance using </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari-ext.properties</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> and
we could enable overriding the markers in a similar way in the future. Previously markers were duplicated on the server code for frontend and printouts and service logo was also usually duplicated in frontend code as well. Added a new action route </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">Logo</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> that
is used by frontend to get the service logo from server so customizing it doesn't require frontend modifications and CSS overrides. See details: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-server/pull/901"><span lang="EN-US">#901</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Added initial implementation for frontend code versioning. The main audience for this are maintainers of RPC-based applications, but it can be used on geoportal as well.
This allows the maintainer of an Oskari instance to provide parallel frontend code support on an Oskari instance that can be toggled with url-parameter. This could be used to provide more flexible update schedule for RPC-based applications. See: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-docs/issues/32"><span lang="EN-US">oskariorg/oskari-docs#32</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> & </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-server/pull/897"><span lang="EN-US">#897</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The domain (/cdn where static code is hosted) for client code can be configured using </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari-ext.properties</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">.
This enables running the same server-side code in environments using frontend code from a CDN/another domain and for example local dev environment: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/sample-server-extension/pull/33"><span lang="EN-US">oskariorg/sample-server-extension#33</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The link back to geoportal on the embedded map logo can now be disabled by configuring </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">plugin.logo.geoportalLink=false</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> in </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari-ext.properties</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">.<o:p></o:p></span></p>
<h1 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);border-bottom:var(--color-border-muted);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Metadata search improvements<o:p></o:p></span></h1>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The search is now requesting the result (</span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">ElementSetName</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">)
as </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">summary</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> instead of </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">full</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> so
it contains less data to parse (and for the CSW-service to respond with). Also the query fields can now be configured to make the queries even lighter for the CSW-service (</span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">csw:anyText</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> seems
to be very heavy if there is a lot of data on the service): </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-server/pull/912"><span lang="EN-US">#912</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
<pre style="background:white;box-sizing: border-box;overflow-wrap: normal;background-color:var(--color-canvas-subtle);border-radius: 6px;overflow:auto"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"># Valid values: summary, brief, full (defaults to "summary")<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm">search.channel.METADATA_CATALOGUE_CHANNEL.queryType=summary<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"># comma-separated list - defaults to csw:anyText<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm">search.channel.METADATA_CATALOGUE_CHANNEL.queryFields=Title, Abstract<o:p></o:p></span></code></pre>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">brief</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> setting
is even lighter, but by using it the search results won't include the date or organization on them as it's not included in that data set. Setting the query fields seems to be more effective way of getting more performance if it is an issue for the search.<o:p></o:p></span></p>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The search configuration has been streamlined with just </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">service.metadata.url</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> in </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari-ext.properties</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> used
to configure the CSW endpoint. Many of the duplicated properties can be cleaned up/removed from </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari-ext.properties</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> as
listed in </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-server/pull/910"><span lang="EN-US">#910</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The search result parsing code has been rewritten to reduce dependencies and improve maintainability. Sanity checks have been added for data as some services might have
invalid data for example on the bounding boxes: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-server/pull/917"><span lang="EN-US">#917</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Cloud compatibility improvements<o:p></o:p></span></h3>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">The database connection/pool is no longer using JNDI by default. Connection pool can still be passed through JNDI, but the code doesn't try creating a context if it's
not available. Previously Oskari tried adding the database JNDI config to the context if it was not there to begin with. This led to problems with for example Tomcat environments where the JNDI-context is read-only. This forced using JNDI configuration on
environments using Tomcat. Using JNDI in context required the JDBC driver to be on Tomcat classpath and the driver could not be bundled inside the webapp war-file which makes cloud deployment in for example Azure App Service more painful than it needs to be.<o:p></o:p></span></p>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Now the JDBC driver can be bundled in the war-file and the database configuration passed in </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari-ext.properties</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> can
be used to connect to the database even on Tomcat: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-server/pull/916"><span lang="EN-US">#916</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><o:p></o:p></span></p>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">New Redis integration configuration options have been added for </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">oskari-ext.properties</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">:<o:p></o:p></span></p>
<pre style="background:white;box-sizing: border-box;overflow-wrap: normal;background-color:var(--color-canvas-subtle);border-radius: 6px;overflow:auto"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"># Can be used to set password if connection requires one<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm">redis.password={your password or remove config to leave empty}<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"># When using SSL-connections (defaults to false like previously)<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm">redis.ssl=true<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm"># Timeout for connection (2000ms is the default timeout in Jedis)<o:p></o:p></span></code></pre>
<pre style="background:white"><code><span lang="EN-US" style="font-family:Consolas;color:#24292F;border:none windowtext 1.0pt;padding:0cm">redis.timeout.connect=2000<o:p></o:p></span></code></pre>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Redis-config </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">redis.pool.size</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> is
now passed to connection pool </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">max-total</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> as expected. Previously
it was only used to calculate and set the </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">max-idle</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">.<o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Caching in clustered environment has been improved by implementing the "flush all" command for cluster cache communication: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-server/pull/902"><span lang="EN-US">#902</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">.
This fixes an issue where updates to map layers were not always reflected on all the nodes of a cluster until reboot.<o:p></o:p></span></p>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Reduced noise on logs<o:p></o:p></span></h3>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">OskariComponent subclasses can now use </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">org.oskari.component.ComponentSkippedRuntimeException</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> (in </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">service-base</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> module)
on the init method instead of using some other exception to signal that they are not configured properly to work/need to be skipped based on the instance config. This is used in </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">What3WordsSearchChannel</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> (in </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">service-search-opendata</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> module)
as most instances don't use the channel (or don't have an apikey for it) it's unnecessary to log the stack trace for the channel just so we can disable it based on missing configuration. Now the startup of oskari-server has less misleading stack traces that
the admin doesn't need to care about. See </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"><a href="https://github.com/oskariorg/oskari-server/pull/888"><span lang="EN-US">#888</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> for
details.<o:p></o:p></span></p>
<p style="margin:0cm;background:white;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Also moved some common/spammy informational logging from log level </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">info</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F"> to </span><code><span lang="EN-US" style="font-size:10.0pt;font-family:Consolas;color:#24292F">debug</span></code><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">.<o:p></o:p></span></p>
<h3 style="mso-margin-top-alt:18.0pt;margin-right:0cm;margin-bottom:12.0pt;margin-left:0cm;background:white;box-sizing: border-box;font-weight:var(--base-text-weight-semibold, 600);font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span style="font-size:14.0pt;font-family:"Segoe UI",sans-serif;color:#24292F">Other improvements<o:p></o:p></span></h3>
<ul style="margin-top:0cm;box-sizing: border-box;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px" type="disc">
<li style="color:#24292F;margin-top:12.0pt;margin-bottom:12.0pt;mso-list:l1 level1 lfo8;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Service logo configured for printouts can now be non-square. The scalebar in printout makes space for logo when required.<o:p></o:p></span></li><li style="color:#24292F;margin-top:12.0pt;margin-bottom:12.0pt;mso-list:l1 level1 lfo8;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Fixed an issue with map legends for proxied map layers without legends<o:p></o:p></span></li><li style="color:#24292F;margin-top:12.0pt;margin-bottom:12.0pt;mso-list:l1 level1 lfo8;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Fixed an issue with WTMS coordinate order: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><a href="https://github.com/oskariorg/oskari-server/pull/920"><span lang="EN-US">#920</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><o:p></o:p></span></li><li style="color:#24292F;margin-top:12.0pt;margin-bottom:12.0pt;mso-list:l1 level1 lfo8;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Allow hyphen/dash in email domain name </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><a href="https://github.com/oskariorg/oskari-server/pull/924"><span lang="EN-US">#924</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><o:p></o:p></span></li><li style="color:#24292F;margin-top:12.0pt;margin-bottom:12.0pt;mso-list:l1 level1 lfo8;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Automatically disable the "no status available" tooltip for layers when the statuses are not available at all on an instance: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><a href="https://github.com/oskariorg/oskari-server/pull/922"><span lang="EN-US">#922</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><o:p></o:p></span></li><li style="color:#24292F;margin-top:12.0pt;margin-bottom:12.0pt;mso-list:l1 level1 lfo8;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Allow list of bundles that can be part of an embedded map is now fully on server-side code. This makes it easier to enable custom bundles as part of publisher options: </span><span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><a href="https://github.com/oskariorg/oskari-server/pull/921"><span lang="EN-US">#921</span></a></span><span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif"><o:p></o:p></span></li><li style="color:#24292F;margin-top:12.0pt;margin-bottom:12.0pt;mso-list:l1 level1 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Library updates:<o:p></o:p></span></li><ul type="circle">
<li class="MsoNormal" style="color:#24292F;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Spring 5.3.18 -> 5.3.20<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Spring security 5.6.2 -> 5.7.0<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Spring session BOM 2021.1.2 -> 2021.2.0<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">commons-lang3 3.11 -> 3.12.0<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">commons-text 1.9 -> 1.10.0<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">commons-code 1.7 -> 1.15<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">commons-dbcp2 2.8.0 -> 2.9.0<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">PostgreSQL JDBC 42.5.0 -> 42.5.1<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">MyBatis 3.5.7 -> 3.5.11<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Jackson 2.13.2 -> 2.13.4<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Jackson databind 2.13.4 -> 2.13.4.2<o:p></o:p></span></li></ul>
<li style="color:#24292F;margin-top:12.0pt;margin-bottom:12.0pt;mso-list:l1 level1 lfo8;background:white;box-sizing: border-box">
<span lang="EN-US" style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">Removed unused dependencies from managed dependencies (code using these have been removed/rewritten):<o:p></o:p></span></li><ul type="circle">
<li class="MsoNormal" style="color:#24292F;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">org.apache.xmlbeans.xmlbeans<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">org.codehaus.woodstox.stax2-api<o:p></o:p></span></li><li class="MsoNormal" style="color:#24292F;margin-top:3.0pt;mso-margin-bottom-alt:auto;mso-list:l1 level2 lfo8;background:white;box-sizing: border-box">
<span style="font-size:12.0pt;font-family:"Segoe UI",sans-serif">com.fasterxml.woodstox.woodstox-core<o:p></o:p></span></li></ul>
</ul>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Segoe UI",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Segoe UI",sans-serif">Cheers,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Segoe UI",sans-serif"> Sami<o:p></o:p></span></p>
</div>
</body>
</html>