@digitransit-component/digitransit-component-favourite-editing-modal 9.0.1 → 10.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react"),require("prop-types"),require("react-i18next"),require("react-sortablejs"),require("lodash/isEmpty"),require("lodash/isEqual"),require("lodash/omit"),require("@hsl-fi/loading-indicators"),require("@hsl-fi/dialog"),require("@digitransit-component/digitransit-component-dialog-modal"),require("@hsl-fi/layout-primitives"),require("@digitransit-component/digitransit-component-icon"),require("lodash/uniqWith"),require("lodash/memoize"),require("lodash/escapeRegExp"),require("lodash/cloneDeep"),require("i18next"),require("react/jsx-runtime")):"function"==typeof define&&define.amd?define(["exports","react","prop-types","react-i18next","react-sortablejs","lodash/isEmpty","lodash/isEqual","lodash/omit","@hsl-fi/loading-indicators","@hsl-fi/dialog","@digitransit-component/digitransit-component-dialog-modal","@hsl-fi/layout-primitives","@digitransit-component/digitransit-component-icon","lodash/uniqWith","lodash/memoize","lodash/escapeRegExp","lodash/cloneDeep","i18next","react/jsx-runtime"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self)["@digitransit-component/digitransit-component-favourite-editing-modal"]={},e.React,e.PropTypes,e.reactI18next,e.reactSortablejs,e.isEmpty,e.isEqual,e.omit,e.LoadingIndicators,e.dialog,e.DialogModal,e.layoutPrimitives,e.Icon,e.uniqWith,e.memoize,e.escapeRegExp,e.cloneDeep,e.i18next,e.jsxRuntime)}(this,function(e,n,t,a,s,i,l,o,r,d,c,u,p,f,m,_,g,h,y){"use strict";function x(e){return e&&e.__esModule?e:{default:e}}var v=x(t),b=x(i),j=x(l),w=x(o),k=x(c),C=x(p),R=x(m),q=x(_),E=x(g);const I=e=>e.localadmin||e.localadmin||e.address&&e.address.lastIndexOf(",")<e.address.length-2&&e.address.substring(e.address.lastIndexOf(",")+2)||"",N=({id:e,code:n})=>n||(void 0!==e&&void 0!==e.indexOf&&-1!==e.indexOf("#")?e.substring(e.indexOf("#")+1):void 0),D=(e,n)=>[e||n&&n.split(",")[0],"string"==typeof n?n.replace(new RegExp(`${q.default(e)}([ ,]|$)+`),""):""];R.default((e,n=!1)=>{switch(e.layer){case"currentPosition":return[e.labelId,e.address];case"selectFromMap":case"ownLocations":case"back":return[e.labelId];case"favouritePlace":return D(e.name,e.address);case"favouriteVehicleRentalStation":case"bikestation":return[e.name];case"favouriteRoute":case"route-BUS":case"route-TRAM":case"route-RAIL":case"route-SUBWAY":case"route-FERRY":case"route-FUNICULAR":case"route-AIRPLANE":return!n&&e.shortName?[e.gtfsId,e.mode.toLowerCase(),e.longName]:[e.shortName,e.longName,e.agency?e.agency.name:void 0];case"venue":case"address":case"street":return[e.name,e.label.replace(new RegExp(`${q.default(e.name)}(,)?( )?`),"")];case"favouriteStop":case"stop":return n?[e.name||e.label||e.address&&e.address.split(",")[0],I(e)]:[e.name,e.id,N(e),I(e)];default:return[e.name||e.label||e.address&&e.address.split(",")[0],I(e)]}},(e,n)=>{const t=E.default(e);return t.plain=n,t});var T="styles_modalContent__DPecW",B="styles_listContainer__BE6HY",M="styles_list__xeRy9",S="styles_item__DbRsI",F="styles_ghost__Zi5Ln",L="styles_fallback__mrveX",O="styles_dragHandle__kplvR",P="styles_ellipsis__Gma55",A="styles_placeIcon__-6soL",W="styles_arrow__lYXD3",U="styles_text__al7Br",Y="styles_name__en71y",z="styles_address__-cd84",H="styles_actionButton__y-oae",X="styles_overlay__TtXTn";!function(e,n){void 0===n&&(n={});var t=n.insertAt;if("undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],s=document.createElement("style");s.type="text/css","top"===t&&a.firstChild?a.insertBefore(s,a.firstChild):a.appendChild(s),s.styleSheet?s.styleSheet.cssText=e:s.appendChild(document.createTextNode(e))}}(".styles_modalContent__DPecW.styles_modalContent__DPecW:focus, .styles_modalContent__DPecW.styles_modalContent__DPecW:focus-visible {\n outline: none;\n}\n\n.styles_listContainer__BE6HY {\n position: relative;\n width: 100%;\n}\n@media (max-width: 499px) {\n .styles_listContainer__BE6HY {\n margin-top: 24px;\n }\n}\n@media (min-width: 500px) {\n .styles_listContainer__BE6HY {\n min-height: 286px;\n }\n}\n\n.styles_list__xeRy9 {\n display: flex;\n flex-direction: column;\n gap: var(--space-fixed-xs, 8px);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.styles_item__DbRsI {\n display: flex;\n align-items: center;\n min-height: 50px;\n background: var(--color-surface-default, #fff);\n border: 1px solid var(--color-border-weak, #ddd);\n border-radius: var(--radius-m, 8px);\n box-sizing: border-box;\n}\n\n.styles_ghost__Zi5Ln {\n opacity: 0;\n}\n\n.styles_fallback__mrveX {\n opacity: 1 !important;\n}\n\n.styles_dragHandle__kplvR {\n display: flex;\n align-items: center;\n flex: none;\n align-self: stretch;\n cursor: move;\n color: var(--color-icon-accent, #0074bf);\n}\n\n.styles_ellipsis__Gma55 {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 37px;\n color: var(--color-icon-weakest, #888);\n}\n.styles_ellipsis__Gma55 svg {\n height: 20px;\n transform: rotate(90deg);\n}\n\n.styles_placeIcon__-6soL {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n margin-right: var(--space-fixed-xs, 8px);\n}\n.styles_placeIcon__-6soL svg {\n width: 20px;\n height: 20px;\n}\n\n.styles_arrow__lYXD3:not(:focus, :active) {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.styles_arrow__lYXD3 {\n font-weight: var(--font-weight-medium, 500);\n}\n\n.styles_text__al7Br {\n flex: 1 1 0;\n min-width: 0;\n padding-left: var(--space-fixed-xs, 8px);\n}\n\n.styles_name__en71y,\n.styles_address__-cd84 {\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.styles_address__-cd84:empty {\n display: none;\n}\n\n.styles_actionButton__y-oae {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 48px;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n cursor: pointer;\n color: var(--color-icon-weakest, #888);\n}\n.styles_actionButton__y-oae:hover, .styles_actionButton__y-oae:focus-visible {\n color: var(--color-icon-accent, #0074bf);\n}\n.styles_actionButton__y-oae svg {\n width: 18px;\n height: 18px;\n}\n\n.styles_overlay__TtXTn {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n inset: 0;\n background: var(--color-surface-default, #fff);\n}");const $=h.createInstance({fallbackLng:"fi",resources:{de:{translation:{cancel:"Abbrechen",delete:"Löschen","delete-place-header":"Wollen Sie den Favoriten löschen?","delete-place-name":"Lösche Favorit: {{favourite.name}}","edit-place-name":"Bearbeite Favorit: {{favourite.name}}","edit-places":"Bearbeite Favoriten"}},en:{translation:{cancel:"Cancel",delete:"Delete","delete-place-header":"Do you want to delete the place?","delete-place-name":"Delete place: {{favourite.name}}",down:"Move favourite down","edit-place-name":"Edit place: {{favourite.name}}","edit-places":"Edit places",up:"Move favourite up"}},fi:{translation:{cancel:"Peruuta",delete:"Poista","delete-place-header":"Haluatko poistaa paikan?","delete-place-name":"Poista paikka: {{favourite.name}}",down:"Siirrä suosikkisijaintia alaspäin","edit-place-name":"Muokkaa paikkaa: {{favourite.name}}","edit-places":"Muokkaa paikkoja",up:"Siirrä suosikkisijaintia ylöpäin"}},pl:{translation:{cancel:"Anuluj",delete:"Usuń","delete-place-header":"Czy na pewno chcesz usunąć to miejsce?","delete-place-name":"Usuń miejsce: {{favourite.name}}",down:"Przenieś ulubione niżej","edit-place-name":"Edytuj miejsce: {{favourite.name}}","edit-places":"Edytuj miejsca",up:"Przenieś ulubione wyżej"}},sv:{translation:{cancel:"Avbryt",delete:"Ta bort","delete-place-header":"Vill du ta bort platsen?","delete-place-name":"Ta bort platsen: {{favourite.name}}",down:"Flytta favoriten nedåt","edit-place-name":"Edit place: {{favourite.name}}","edit-places":"Redigera platser",up:"Flytta favoriten uppåt"}}},defaultNS:"translation",react:{useSuspense:!0}});$.init();const V=O;function G({favourite:e,lang:n,onMoveUp:t=null,onMoveDown:s=null,onEdit:i,onDelete:l}){const{t:o}=a.useTranslation("translation",{i18n:$}),r=(e=>{const n=e?e.indexOf("icon_"):-1;return n>0?e.substring(n+5):"place"})(e.selectedIconId),[d,c]=D(e.name,e.address);return y.jsxs("li",{className:S,children:[y.jsxs("div",{className:O,children:[t&&y.jsx("button",{type:"button",className:W,"aria-label":o("up",{lng:n}),onClick:t,children:"↑"}),s&&y.jsx("button",{type:"button",className:W,"aria-label":o("down",{lng:n}),onClick:s,children:"↓"}),y.jsx("span",{className:P,children:y.jsx(C.default,{img:"ellipsis",color:"currentColor"})}),y.jsx("span",{className:A,children:y.jsx(C.default,{img:r,color:"currentColor"})})]}),y.jsxs(u.FlexColumn,{className:U,children:[y.jsx(u.Text,{variant:"text-xs-bold",as:"p",className:Y,children:d}),y.jsx(u.Text,{variant:"text-xs",as:"p",color:"weak",className:z,children:c})]}),y.jsxs(u.FlexRow,{alignItems:"center",flexShrink:0,children:[y.jsx("button",{type:"button",className:H,"aria-label":o("edit-place-name",{lng:n,favourite:e}),onClick:i,children:y.jsx(C.default,{img:"edit",color:"currentColor"})}),y.jsx("button",{type:"button",className:H,"aria-label":o("delete-place-name",{lng:n,favourite:e}),onClick:l,children:y.jsx(C.default,{img:"trash",color:"currentColor"})})]})]})}function Z({isModalOpen:e,handleClose:t,updateFavourites:i,deleteFavourite:l,onEditSelected:o,favourites:c,isLoading:u,lang:p="fi"}){const{t:f}=a.useTranslation("translation",{i18n:$}),[m,_]=n.useState(c),[g,h]=n.useState(null),[x,v]=n.useState(null),C=n.useRef(c);j.default(m,c)||(_(c),h(null));const R=g||c;n.useEffect(()=>{C.current!==c&&!j.default(C.current,c)&&b.default(c)&&t(),C.current=c},[c,t]);const q=(e,n)=>{const t=[...R];[t[e],t[e+n]]=[t[e+n],t[e]],h(t)},E=()=>v(null);return y.jsxs(y.Fragment,{children:[y.jsx(k.default,{headerText:f("delete-place-header",{lng:p}),handleClose:()=>{E(),t()},isModalOpen:null!==x,dialogContent:x?`${x.name}: ${x.address}`:"",primaryButtonText:f("delete",{lng:p}),primaryButtonOnClick:()=>{l(x),E()},secondaryButtonText:f("cancel",{lng:p}),secondaryButtonOnClick:E,lang:p}),y.jsx(d.Modal,{open:e&&null===x,onOpenChange:e=>{e||(()=>{t();const e=R.map(e=>w.default(e,["chosen","selected"]));j.default(e,c)||i(e)})()},children:y.jsx(d.ModalContent,{lang:p,title:f("edit-places",{lng:p}),className:T,"aria-describedby":void 0,children:y.jsxs("div",{className:B,children:[y.jsx(s.ReactSortable,{className:M,tag:"ul",list:R,setList:e=>{e.length===R.length&&e.every((e,n)=>e.favouriteId===R[n].favouriteId)||h(e)},animation:200,handle:`.${V}`,forceFallback:!0,ghostClass:F,fallbackClass:L,children:R.map((e,n)=>y.jsx(G,{favourite:e,lang:p,onMoveUp:n>0?()=>q(n,-1):null,onMoveDown:n<R.length-1?()=>q(n,1):null,onEdit:()=>o(e),onDelete:()=>v(e)},e.favouriteId))}),u&&y.jsx("div",{className:X,children:y.jsx(r.Spinner,{})})]})})})]})}"production"!==process.env.NODE_ENV&&(G.propTypes={favourite:v.default.shape({name:v.default.string,address:v.default.string,selectedIconId:v.default.string}).isRequired,lang:v.default.string.isRequired,onEdit:v.default.func.isRequired,onDelete:v.default.func.isRequired,onMoveUp:v.default.func,onMoveDown:v.default.func}),"production"!==process.env.NODE_ENV&&(Z.propTypes={isModalOpen:v.default.bool.isRequired,handleClose:v.default.func.isRequired,updateFavourites:v.default.func.isRequired,deleteFavourite:v.default.func.isRequired,onEditSelected:v.default.func.isRequired,isLoading:v.default.bool.isRequired,favourites:v.default.arrayOf(v.default.shape({type:v.default.string,address:v.default.string,gtfsId:v.default.string,gid:v.default.string,lat:v.default.number,lon:v.default.number,name:v.default.string,selectedIconId:v.default.string,favouriteId:v.default.string,layer:v.default.string})).isRequired,lang:v.default.string}),e.default=Z,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react"),require("prop-types"),require("react-i18next"),require("@dnd-kit/react"),require("lodash/isEmpty"),require("lodash/isEqual"),require("lodash/omit"),require("@hsl-fi/loading-indicators"),require("@hsl-fi/dialog"),require("@digitransit-component/digitransit-component-dialog-modal"),require("@hsl-fi/layout-primitives"),require("@dnd-kit/react/sortable"),require("@digitransit-component/digitransit-component-icon"),require("lodash/uniqWith"),require("lodash/memoize"),require("lodash/escapeRegExp"),require("lodash/cloneDeep"),require("i18next"),require("react/jsx-runtime")):"function"==typeof define&&define.amd?define(["exports","react","prop-types","react-i18next","@dnd-kit/react","lodash/isEmpty","lodash/isEqual","lodash/omit","@hsl-fi/loading-indicators","@hsl-fi/dialog","@digitransit-component/digitransit-component-dialog-modal","@hsl-fi/layout-primitives","@dnd-kit/react/sortable","@digitransit-component/digitransit-component-icon","lodash/uniqWith","lodash/memoize","lodash/escapeRegExp","lodash/cloneDeep","i18next","react/jsx-runtime"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self)["@digitransit-component/digitransit-component-favourite-editing-modal"]={},e.React,e.PropTypes,e.reactI18next,e.dndKitReact,e.isEmpty,e.isEqual,e.omit,e.LoadingIndicators,e.dialog,e.DialogModal,e.layoutPrimitives,e.dndKitReactSortable,e.Icon,e.uniqWith,e.memoize,e.escapeRegExp,e.cloneDeep,e.i18next,e.jsxRuntime)}(this,function(e,n,t,a,i,s,l,o,r,d,c,u,p,f,m,g,_,h,x,y){"use strict";function v(e){return e&&e.__esModule?e:{default:e}}var b=v(t),j=v(s),w=v(l),k=v(o),R=v(c),q=v(f),E=v(g),C=v(_),I=v(h);const D=e=>e.localadmin||e.localadmin||e.address&&e.address.lastIndexOf(",")<e.address.length-2&&e.address.substring(e.address.lastIndexOf(",")+2)||"",N=({id:e,code:n})=>n||(void 0!==e&&void 0!==e.indexOf&&-1!==e.indexOf("#")?e.substring(e.indexOf("#")+1):void 0),T=(e,n)=>[e||n&&n.split(",")[0],"string"==typeof n?n.replace(new RegExp(`${C.default(e)}([ ,]|$)+`),""):""];E.default((e,n=!1)=>{switch(e.layer){case"currentPosition":return[e.labelId,e.address];case"selectFromMap":case"ownLocations":case"back":return[e.labelId];case"favouritePlace":return T(e.name,e.address);case"favouriteVehicleRentalStation":case"bikestation":return[e.name];case"favouriteRoute":case"route-BUS":case"route-TRAM":case"route-RAIL":case"route-SUBWAY":case"route-FERRY":case"route-FUNICULAR":case"route-AIRPLANE":return!n&&e.shortName?[e.gtfsId,e.mode.toLowerCase(),e.longName]:[e.shortName,e.longName,e.agency?e.agency.name:void 0];case"venue":case"address":case"street":return[e.name,e.label.replace(new RegExp(`${C.default(e.name)}(,)?( )?`),"")];case"favouriteStop":case"stop":return n?[e.name||e.label||e.address&&e.address.split(",")[0],D(e)]:[e.name,e.id,N(e),D(e)];default:return[e.name||e.label||e.address&&e.address.split(",")[0],D(e)]}},(e,n)=>{const t=I.default(e);return t.plain=n,t});var B="styles_modalContent__DPecW",M="styles_listContainer__BE6HY",S="styles_list__xeRy9",P="styles_item__DbRsI",F="styles_dragHandle__kplvR",O="styles_ellipsis__Gma55",L="styles_placeIcon__-6soL",A="styles_arrow__lYXD3",W="styles_text__al7Br",U="styles_name__en71y",Y="styles_address__-cd84",z="styles_actionButton__y-oae",H="styles_overlay__TtXTn";!function(e,n){void 0===n&&(n={});var t=n.insertAt;if("undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],i=document.createElement("style");i.type="text/css","top"===t&&a.firstChild?a.insertBefore(i,a.firstChild):a.appendChild(i),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(document.createTextNode(e))}}(".styles_modalContent__DPecW.styles_modalContent__DPecW:focus, .styles_modalContent__DPecW.styles_modalContent__DPecW:focus-visible {\n outline: none;\n}\n\n.styles_listContainer__BE6HY {\n position: relative;\n width: 100%;\n}\n@media (max-width: 499px) {\n .styles_listContainer__BE6HY {\n margin-top: 24px;\n }\n}\n@media (min-width: 500px) {\n .styles_listContainer__BE6HY {\n min-height: 286px;\n }\n}\n\n.styles_list__xeRy9 {\n display: flex;\n flex-direction: column;\n gap: var(--space-fixed-xs, 8px);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.styles_item__DbRsI {\n display: flex;\n align-items: center;\n min-height: 50px;\n background: var(--color-surface-default, #fff);\n border: 1px solid var(--color-border-weak, #ddd);\n border-radius: var(--radius-m, 8px);\n box-sizing: border-box;\n}\n\n.styles_dragHandle__kplvR {\n display: flex;\n align-items: center;\n flex: none;\n align-self: stretch;\n cursor: move;\n color: var(--color-icon-accent, #0074bf);\n}\n\n.styles_ellipsis__Gma55 {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 37px;\n color: var(--color-icon-weakest, #888);\n}\n.styles_ellipsis__Gma55 svg {\n height: 20px;\n transform: rotate(90deg);\n}\n\n.styles_placeIcon__-6soL {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n margin-right: var(--space-fixed-xs, 8px);\n}\n.styles_placeIcon__-6soL svg {\n width: 20px;\n height: 20px;\n}\n\n.styles_arrow__lYXD3:not(:focus, :active) {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.styles_arrow__lYXD3 {\n font-weight: var(--font-weight-medium, 500);\n}\n\n.styles_text__al7Br {\n flex: 1 1 0;\n min-width: 0;\n padding-left: var(--space-fixed-xs, 8px);\n}\n\n.styles_name__en71y,\n.styles_address__-cd84 {\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.styles_address__-cd84:empty {\n display: none;\n}\n\n.styles_actionButton__y-oae {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 48px;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n cursor: pointer;\n color: var(--color-icon-weakest, #888);\n}\n.styles_actionButton__y-oae:hover, .styles_actionButton__y-oae:focus-visible {\n color: var(--color-icon-accent, #0074bf);\n}\n.styles_actionButton__y-oae svg {\n width: 18px;\n height: 18px;\n}\n\n.styles_overlay__TtXTn {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n inset: 0;\n background: var(--color-surface-default, #fff);\n}");const X=x.createInstance({fallbackLng:"fi",resources:{de:{translation:{cancel:"Abbrechen",delete:"Löschen","delete-place-header":"Wollen Sie den Favoriten löschen?","delete-place-name":"Lösche Favorit: {{favourite.name}}","edit-place-name":"Bearbeite Favorit: {{favourite.name}}","edit-places":"Bearbeite Favoriten"}},en:{translation:{cancel:"Cancel",delete:"Delete","delete-place-header":"Do you want to delete the place?","delete-place-name":"Delete place: {{favourite.name}}",down:"Move favourite down","edit-place-name":"Edit place: {{favourite.name}}","edit-places":"Edit places",up:"Move favourite up"}},fi:{translation:{cancel:"Peruuta",delete:"Poista","delete-place-header":"Haluatko poistaa paikan?","delete-place-name":"Poista paikka: {{favourite.name}}",down:"Siirrä suosikkisijaintia alaspäin","edit-place-name":"Muokkaa paikkaa: {{favourite.name}}","edit-places":"Muokkaa paikkoja",up:"Siirrä suosikkisijaintia ylöpäin"}},pl:{translation:{cancel:"Anuluj",delete:"Usuń","delete-place-header":"Czy na pewno chcesz usunąć to miejsce?","delete-place-name":"Usuń miejsce: {{favourite.name}}",down:"Przenieś ulubione niżej","edit-place-name":"Edytuj miejsce: {{favourite.name}}","edit-places":"Edytuj miejsca",up:"Przenieś ulubione wyżej"}},sv:{translation:{cancel:"Avbryt",delete:"Ta bort","delete-place-header":"Vill du ta bort platsen?","delete-place-name":"Ta bort platsen: {{favourite.name}}",down:"Flytta favoriten nedåt","edit-place-name":"Edit place: {{favourite.name}}","edit-places":"Redigera platser",up:"Flytta favoriten uppåt"}}},defaultNS:"translation",react:{useSuspense:!0}});X.init();function $({favourite:e,lang:n,onMoveUp:t=null,onMoveDown:i=null,onEdit:s,onDelete:l,index:o}){const{t:r}=a.useTranslation("translation",{i18n:X}),{ref:d}=p.useSortable({id:e.favouriteId,index:o}),c=(e=>{const n=e?e.indexOf("icon_"):-1;return n>0?e.substring(n+5):"place"})(e.selectedIconId),[f,m]=T(e.name,e.address);return y.jsxs("li",{ref:d,className:P,children:[y.jsxs("div",{className:F,children:[t&&y.jsx("button",{type:"button",className:A,"aria-label":r("up",{lng:n}),onClick:t,children:"↑"}),i&&y.jsx("button",{type:"button",className:A,"aria-label":r("down",{lng:n}),onClick:i,children:"↓"}),y.jsx("span",{className:O,children:y.jsx(q.default,{img:"ellipsis",color:"currentColor"})}),y.jsx("span",{className:L,children:y.jsx(q.default,{img:c,color:"currentColor"})})]}),y.jsxs(u.FlexColumn,{className:W,children:[y.jsx(u.Text,{variant:"text-xs-bold",as:"p",className:U,children:f}),y.jsx(u.Text,{variant:"text-xs",as:"p",color:"weak",className:Y,children:m})]}),y.jsxs(u.FlexRow,{alignItems:"center",flexShrink:0,children:[y.jsx("button",{type:"button",className:z,"aria-label":r("edit-place-name",{lng:n,favourite:e}),onClick:s,children:y.jsx(q.default,{img:"edit",color:"currentColor"})}),y.jsx("button",{type:"button",className:z,"aria-label":r("delete-place-name",{lng:n,favourite:e}),onClick:l,children:y.jsx(q.default,{img:"trash",color:"currentColor"})})]})]})}function V({isModalOpen:e,handleClose:t,updateFavourites:s,deleteFavourite:l,onEditSelected:o,favourites:c,isLoading:u,lang:p="fi"}){const{t:f}=a.useTranslation("translation",{i18n:X}),[m,g]=n.useState(c),[_,h]=n.useState(null),[x,v]=n.useState(null),b=n.useRef(c);w.default(m,c)||(g(c),h(null));const q=_||c;n.useEffect(()=>{b.current!==c&&!w.default(b.current,c)&&j.default(c)&&t(),b.current=c},[c,t]);const E=(e,n)=>{const t=[...q];[t[e],t[e+n]]=[t[e+n],t[e]],h(t)},C=()=>v(null);return y.jsxs(y.Fragment,{children:[y.jsx(R.default,{headerText:f("delete-place-header",{lng:p}),handleClose:()=>{C(),t()},isModalOpen:null!==x,dialogContent:x?`${x.name}: ${x.address}`:"",primaryButtonText:f("delete",{lng:p}),primaryButtonOnClick:()=>{l(x),C()},secondaryButtonText:f("cancel",{lng:p}),secondaryButtonOnClick:C,lang:p}),y.jsx(d.Modal,{open:e&&null===x,onOpenChange:e=>{e||(()=>{t();const e=q.map(e=>k.default(e,["chosen","selected"]));w.default(e,c)||s(e)})()},children:y.jsx(d.ModalContent,{lang:p,title:f("edit-places",{lng:p}),className:B,"aria-describedby":void 0,children:y.jsxs("div",{className:M,children:[y.jsx(i.DragDropProvider,{onDragEnd:e=>{if(e.canceled)return;const{initialIndex:n,index:t}=e.operation.source?.sortable||{};if(void 0===n||n===t)return;const a=[...q],[i]=a.splice(n,1);a.splice(t,0,i),h(a)},children:y.jsx("ul",{className:S,children:q.map((e,n)=>y.jsx($,{index:n,favourite:e,lang:p,onMoveUp:n>0?()=>E(n,-1):null,onMoveDown:n<q.length-1?()=>E(n,1):null,onEdit:()=>o(e),onDelete:()=>v(e)},e.favouriteId))})}),u&&y.jsx("div",{className:H,children:y.jsx(r.Spinner,{})})]})})})]})}"production"!==process.env.NODE_ENV&&($.propTypes={favourite:b.default.shape({favouriteId:b.default.string,name:b.default.string,address:b.default.string,selectedIconId:b.default.string}).isRequired,lang:b.default.string.isRequired,onEdit:b.default.func.isRequired,onDelete:b.default.func.isRequired,onMoveUp:b.default.func,onMoveDown:b.default.func,index:b.default.number.isRequired}),"production"!==process.env.NODE_ENV&&(V.propTypes={isModalOpen:b.default.bool.isRequired,handleClose:b.default.func.isRequired,updateFavourites:b.default.func.isRequired,deleteFavourite:b.default.func.isRequired,onEditSelected:b.default.func.isRequired,isLoading:b.default.bool.isRequired,favourites:b.default.arrayOf(b.default.shape({type:b.default.string,address:b.default.string,gtfsId:b.default.string,gid:b.default.string,lat:b.default.number,lon:b.default.number,name:b.default.string,selectedIconId:b.default.string,favouriteId:b.default.string,layer:b.default.string})).isRequired,lang:b.default.string}),e.default=V,Object.defineProperty(e,"__esModule",{value:!0})});
2
2
  //# sourceMappingURL=index.cjs.map
package/lib/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../digitransit-search-util/packages/digitransit-search-util-uniq-by-label/index.js","../../../../node_modules/style-inject/dist/style-inject.es.js","../src/helpers/translations.js","../src/helpers/i18n.js","../src/helpers/FavouriteListItem.jsx","../src/index.jsx"],"sourcesContent":["import uniqWith from 'lodash/uniqWith';\nimport isEqual from 'lodash/isEqual';\nimport memoize from 'lodash/memoize';\nimport escapeRegExp from 'lodash/escapeRegExp';\nimport cloneDeep from 'lodash/cloneDeep';\n\n/**\n * Location properties.\n * @typedef {LocationProperties}\n * @property {string} layer Suggestion layer.\n * @property {lat} [number]\n * @property {lon} [number]\n * @property {string} address Address.\n */\n\n/**\n * Returns localadmin (city name) for suggestions\n *\n * @name getLocaladmin\n * @param {Object} suggestion suggestion's properties from geocoding or a favourite stop/station.\n * Expects last part of an address (after ',') to contain the city name of the suggestion location.\n * @returns {String} City name or empty string\n */\nconst getLocaladmin = suggestion =>\n suggestion.localadmin ||\n suggestion.localadmin ||\n (suggestion.address &&\n suggestion.address.lastIndexOf(',') < suggestion.address.length - 2 &&\n suggestion.address.substring(suggestion.address.lastIndexOf(',') + 2)) ||\n '';\n\nexport const getStopCode = ({ id, code }) => {\n if (code) {\n return code;\n }\n if (\n id === undefined ||\n typeof id.indexOf === 'undefined' ||\n id.indexOf('#') === -1\n ) {\n return undefined;\n }\n // id from pelias\n return id.substring(id.indexOf('#') + 1);\n};\n\nexport const formatFavouritePlaceLabel = (name, address) => [\n name || (address && address.split(',')[0]),\n typeof address === 'string'\n ? address.replace(new RegExp(`${escapeRegExp(name)}([ ,]|$)+`), '')\n : '',\n];\n\n/**\n * Format suggestion-pair [name, address] by `suggestion.layer`.\n *\n * @name getNameLabel\n * @param {LocationProperties} suggestion\n * @param {boolean} [plain]\n *\n * @returns {Array.<string>} Formatted label.\n */\nexport const getNameLabel = memoize(\n (suggestion, plain = false) => {\n switch (suggestion.layer) {\n case 'currentPosition':\n return [suggestion.labelId, suggestion.address];\n case 'selectFromMap':\n case 'ownLocations':\n case 'back':\n return [suggestion.labelId];\n case 'favouritePlace':\n return formatFavouritePlaceLabel(suggestion.name, suggestion.address);\n case 'favouriteVehicleRentalStation':\n case 'bikestation':\n return [suggestion.name];\n case 'favouriteRoute':\n case 'route-BUS':\n case 'route-TRAM':\n case 'route-RAIL':\n case 'route-SUBWAY':\n case 'route-FERRY':\n case 'route-FUNICULAR':\n case 'route-AIRPLANE':\n return !plain && suggestion.shortName\n ? [\n suggestion.gtfsId,\n suggestion.mode.toLowerCase(),\n suggestion.longName,\n ]\n : [\n suggestion.shortName,\n suggestion.longName,\n suggestion.agency ? suggestion.agency.name : undefined,\n ];\n case 'venue':\n case 'address':\n case 'street':\n return [\n suggestion.name,\n suggestion.label.replace(\n new RegExp(`${escapeRegExp(suggestion.name)}(,)?( )?`),\n '',\n ),\n ];\n case 'favouriteStop':\n case 'stop':\n return plain\n ? [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ]\n : [\n suggestion.name,\n suggestion.id,\n getStopCode(suggestion),\n getLocaladmin(suggestion),\n ];\n case 'favouriteStation':\n case 'station':\n default:\n return [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ];\n }\n },\n (item, plain) => {\n const i = cloneDeep(item);\n i.plain = plain;\n return i;\n },\n);\n\n/**\n * Checks that features are unique by label\n *\n * @name uniqByLabel\n * @param {Array} features Array of features\n * @returns {Array} Array of unique features\n * @example\n * digitransit-search-util.uniqByLabel(features);\n * //= Array(2)\n */\nexport default function uniqByLabel(features) {\n return uniqWith(features, (feat1, feat2) => {\n if (feat1.type === 'FutureRoute' || feat2.type === 'FutureRoute') {\n return false;\n }\n return (\n isEqual(getNameLabel(feat1.properties), getNameLabel(feat2.properties)) &&\n feat1.properties.layer === feat2.properties.layer\n );\n });\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","/* eslint sort-keys: \"error\" */\nconst translations = {\n de: {\n translation: {\n cancel: 'Abbrechen',\n delete: 'Löschen',\n 'delete-place-header': 'Wollen Sie den Favoriten löschen?',\n 'delete-place-name': 'Lösche Favorit: {{favourite.name}}',\n 'edit-place-name': 'Bearbeite Favorit: {{favourite.name}}',\n 'edit-places': 'Bearbeite Favoriten',\n },\n },\n en: {\n translation: {\n cancel: 'Cancel',\n delete: 'Delete',\n 'delete-place-header': 'Do you want to delete the place?',\n 'delete-place-name': 'Delete place: {{favourite.name}}',\n down: 'Move favourite down',\n 'edit-place-name': 'Edit place: {{favourite.name}}',\n 'edit-places': 'Edit places',\n up: 'Move favourite up',\n },\n },\n fi: {\n translation: {\n cancel: 'Peruuta',\n delete: 'Poista',\n 'delete-place-header': 'Haluatko poistaa paikan?',\n 'delete-place-name': 'Poista paikka: {{favourite.name}}',\n down: 'Siirrä suosikkisijaintia alaspäin',\n 'edit-place-name': 'Muokkaa paikkaa: {{favourite.name}}',\n 'edit-places': 'Muokkaa paikkoja',\n up: 'Siirrä suosikkisijaintia ylöpäin',\n },\n },\n pl: {\n translation: {\n cancel: 'Anuluj',\n delete: 'Usuń',\n 'delete-place-header': 'Czy na pewno chcesz usunąć to miejsce?',\n 'delete-place-name': 'Usuń miejsce: {{favourite.name}}',\n down: 'Przenieś ulubione niżej',\n 'edit-place-name': 'Edytuj miejsce: {{favourite.name}}',\n 'edit-places': 'Edytuj miejsca',\n up: 'Przenieś ulubione wyżej',\n },\n },\n sv: {\n translation: {\n cancel: 'Avbryt',\n delete: 'Ta bort',\n 'delete-place-header': 'Vill du ta bort platsen?',\n 'delete-place-name': 'Ta bort platsen: {{favourite.name}}',\n down: 'Flytta favoriten nedåt',\n 'edit-place-name': 'Edit place: {{favourite.name}}',\n 'edit-places': 'Redigera platser',\n up: 'Flytta favoriten uppåt',\n },\n },\n};\n\nexport default translations;\n","import { createInstance } from 'i18next';\nimport translations from './translations';\n\nconst i18n = createInstance({\n fallbackLng: 'fi',\n // debug: true,\n resources: translations,\n defaultNS: 'translation',\n react: {\n useSuspense: true,\n },\n});\n\ni18n.init();\n\nexport default i18n;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useTranslation } from 'react-i18next';\nimport { FlexColumn, FlexRow, Text } from '@hsl-fi/layout-primitives';\nimport Icon from '@digitransit-component/digitransit-component-icon';\nimport { formatFavouritePlaceLabel } from '@digitransit-search-util/digitransit-search-util-uniq-by-label';\nimport styles from './styles.scss';\nimport i18n from './i18n';\n\nexport const DRAG_HANDLE_CLASS = styles.dragHandle;\n\nconst getIconId = selectedIconId => {\n const prefixPos = selectedIconId ? selectedIconId.indexOf('icon_') : -1;\n return prefixPos > 0 ? selectedIconId.substring(prefixPos + 5) : 'place';\n};\n\n/**\n * One row of the favourites list. The visually hidden arrow buttons are a\n * keyboard alternative to dragging.\n */\nfunction FavouriteListItem({\n favourite,\n lang,\n onMoveUp = null,\n onMoveDown = null,\n onEdit,\n onDelete,\n}) {\n const { t } = useTranslation('translation', { i18n });\n const iconId = getIconId(favourite.selectedIconId);\n const [name, address] = formatFavouritePlaceLabel(\n favourite.name,\n favourite.address,\n );\n\n return (\n <li className={styles.item}>\n <div className={styles.dragHandle}>\n {onMoveUp && (\n <button\n type=\"button\"\n className={styles.arrow}\n aria-label={t('up', { lng: lang })}\n onClick={onMoveUp}\n >\n &uarr;\n </button>\n )}\n {onMoveDown && (\n <button\n type=\"button\"\n className={styles.arrow}\n aria-label={t('down', { lng: lang })}\n onClick={onMoveDown}\n >\n &darr;\n </button>\n )}\n <span className={styles.ellipsis}>\n <Icon img=\"ellipsis\" color=\"currentColor\" />\n </span>\n <span className={styles.placeIcon}>\n <Icon img={iconId} color=\"currentColor\" />\n </span>\n </div>\n <FlexColumn className={styles.text}>\n <Text variant=\"text-xs-bold\" as=\"p\" className={styles.name}>\n {name}\n </Text>\n <Text variant=\"text-xs\" as=\"p\" color=\"weak\" className={styles.address}>\n {address}\n </Text>\n </FlexColumn>\n <FlexRow alignItems=\"center\" flexShrink={0}>\n <button\n type=\"button\"\n className={styles.actionButton}\n aria-label={t('edit-place-name', { lng: lang, favourite })}\n onClick={onEdit}\n >\n <Icon img=\"edit\" color=\"currentColor\" />\n </button>\n <button\n type=\"button\"\n className={styles.actionButton}\n aria-label={t('delete-place-name', { lng: lang, favourite })}\n onClick={onDelete}\n >\n <Icon img=\"trash\" color=\"currentColor\" />\n </button>\n </FlexRow>\n </li>\n );\n}\n\nFavouriteListItem.propTypes = {\n favourite: PropTypes.shape({\n name: PropTypes.string,\n address: PropTypes.string,\n selectedIconId: PropTypes.string,\n }).isRequired,\n lang: PropTypes.string.isRequired,\n onEdit: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n onMoveUp: PropTypes.func,\n onMoveDown: PropTypes.func,\n};\n\nexport default FavouriteListItem;\n","import React, { useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useTranslation } from 'react-i18next';\nimport { ReactSortable } from 'react-sortablejs';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqual from 'lodash/isEqual';\nimport omit from 'lodash/omit';\nimport { Spinner } from '@hsl-fi/loading-indicators';\nimport { Modal, ModalContent } from '@hsl-fi/dialog';\nimport DialogModal from '@digitransit-component/digitransit-component-dialog-modal';\nimport FavouriteListItem, {\n DRAG_HANDLE_CLASS,\n} from './helpers/FavouriteListItem';\nimport i18n from './helpers/i18n';\nimport styles from './helpers/styles.scss';\n\n/**\n * A dialog for reordering, editing and deleting favourite places, built on\n * the HSL design system's Modal. Colors, typography and the mobile/desktop\n * layout are handled by the design system, so the dialog follows the active\n * deployment's theme.\n *\n * @example\n * <FavouriteEditingModal\n * isModalOpen={modalOpen}\n * handleClose={handleClose}\n * favourites={favourites}\n * updateFavourites={onUpdateFavourites}\n * deleteFavourite={onDeleteFavourite}\n * onEditSelected={onEditSelected}\n * isLoading={false}\n * lang=\"fi\"\n * />\n */\nfunction FavouriteEditingModal({\n isModalOpen,\n handleClose,\n updateFavourites,\n deleteFavourite,\n onEditSelected,\n favourites,\n isLoading,\n lang = 'fi',\n}) {\n const { t } = useTranslation('translation', { i18n });\n const [source, setSource] = useState(favourites);\n const [reordered, setReordered] = useState(null);\n const [selectedFavourite, setSelectedFavourite] = useState(null);\n const previousFavourites = useRef(favourites);\n\n // Drop the local order when the favourites change from outside\n if (!isEqual(source, favourites)) {\n setSource(favourites);\n setReordered(null);\n }\n const items = reordered || favourites;\n\n useEffect(() => {\n if (\n previousFavourites.current !== favourites &&\n !isEqual(previousFavourites.current, favourites) &&\n isEmpty(favourites)\n ) {\n handleClose();\n }\n previousFavourites.current = favourites;\n }, [favourites, handleClose]);\n\n const move = (index, direction) => {\n const copy = [...items];\n [copy[index], copy[index + direction]] = [\n copy[index + direction],\n copy[index],\n ];\n setReordered(copy);\n };\n\n // ReactSortable also calls setList on mount and on selection changes without reordering\n const setList = newList => {\n const sameOrder =\n newList.length === items.length &&\n newList.every((item, i) => item.favouriteId === items[i].favouriteId);\n if (!sameOrder) {\n setReordered(newList);\n }\n };\n\n const closeModal = () => {\n handleClose();\n const omitted = items.map(item => omit(item, ['chosen', 'selected']));\n if (!isEqual(omitted, favourites)) {\n updateFavourites(omitted);\n }\n };\n\n const closeDeleteDialog = () => setSelectedFavourite(null);\n\n return (\n <>\n <DialogModal\n headerText={t('delete-place-header', { lng: lang })}\n handleClose={() => {\n closeDeleteDialog();\n handleClose();\n }}\n isModalOpen={selectedFavourite !== null}\n dialogContent={\n selectedFavourite\n ? `${selectedFavourite.name}: ${selectedFavourite.address}`\n : ''\n }\n primaryButtonText={t('delete', { lng: lang })}\n primaryButtonOnClick={() => {\n deleteFavourite(selectedFavourite);\n closeDeleteDialog();\n }}\n secondaryButtonText={t('cancel', { lng: lang })}\n secondaryButtonOnClick={closeDeleteDialog}\n lang={lang}\n />\n <Modal\n open={isModalOpen && selectedFavourite === null}\n onOpenChange={open => {\n if (!open) {\n closeModal();\n }\n }}\n >\n <ModalContent\n lang={lang}\n title={t('edit-places', { lng: lang })}\n className={styles.modalContent}\n aria-describedby={undefined}\n >\n <div className={styles.listContainer}>\n <ReactSortable\n className={styles.list}\n tag=\"ul\"\n list={items}\n setList={setList}\n animation={200}\n handle={`.${DRAG_HANDLE_CLASS}`}\n forceFallback\n ghostClass={styles.ghost}\n fallbackClass={styles.fallback}\n >\n {items.map((favourite, index) => (\n <FavouriteListItem\n key={favourite.favouriteId}\n favourite={favourite}\n lang={lang}\n onMoveUp={index > 0 ? () => move(index, -1) : null}\n onMoveDown={\n index < items.length - 1 ? () => move(index, 1) : null\n }\n onEdit={() => onEditSelected(favourite)}\n onDelete={() => setSelectedFavourite(favourite)}\n />\n ))}\n </ReactSortable>\n {isLoading && (\n <div className={styles.overlay}>\n <Spinner />\n </div>\n )}\n </div>\n </ModalContent>\n </Modal>\n </>\n );\n}\n\nFavouriteEditingModal.propTypes = {\n /** Required. Whether the dialog is open.\n * @type {boolean} */\n isModalOpen: PropTypes.bool.isRequired,\n /** Required. Close modal.\n * @type {function} */\n handleClose: PropTypes.func.isRequired,\n /** Required. Called with the reordered favourites when the dialog is closed.\n * @type {function} */\n updateFavourites: PropTypes.func.isRequired,\n /** Required. Called with the favourite the user confirmed deleting.\n * @type {function} */\n deleteFavourite: PropTypes.func.isRequired,\n /** Required. Function that takes selected favourite object as parameter.\n * @type {function} */\n onEditSelected: PropTypes.func.isRequired,\n /** Required. Whether a save is in progress; shows a spinner over the list.\n * @type {boolean} */\n isLoading: PropTypes.bool.isRequired,\n /** Required.\n * @type {array<object>}\n * @property {string} type\n * @property {string} address\n * @property {string} gtfsId\n * @property {string} gid\n * @property {number} lat\n * @property {number} lon\n * @property {string} name\n * @property {string} selectedIconId\n * @property {string} favouriteId\n * @property {string} layer\n */\n favourites: PropTypes.arrayOf(\n PropTypes.shape({\n type: PropTypes.string,\n address: PropTypes.string,\n gtfsId: PropTypes.string,\n gid: PropTypes.string,\n lat: PropTypes.number,\n lon: PropTypes.number,\n name: PropTypes.string,\n selectedIconId: PropTypes.string,\n favouriteId: PropTypes.string,\n layer: PropTypes.string,\n }),\n ).isRequired,\n /** Optional. Language, fi, en or sv. Defaults to fi.\n * @type {string} */\n lang: PropTypes.string,\n};\n\nexport default FavouriteEditingModal;\n"],"names":["getLocaladmin","suggestion","localadmin","address","lastIndexOf","length","substring","getStopCode","id","code","undefined","indexOf","formatFavouritePlaceLabel","name","split","replace","RegExp","escapeRegExp","memoize","plain","layer","labelId","shortName","gtfsId","mode","toLowerCase","longName","agency","label","item","i","cloneDeep","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","i18n","createInstance","fallbackLng","resources","de","translation","cancel","delete","en","down","up","fi","pl","sv","defaultNS","react","useSuspense","init","DRAG_HANDLE_CLASS","styles","FavouriteListItem","favourite","lang","onMoveUp","onMoveDown","onEdit","onDelete","t","useTranslation","iconId","selectedIconId","prefixPos","getIconId","_jsxs","className","children","_jsx","lng","onClick","Icon","img","color","FlexColumn","Text","variant","as","FlexRow","alignItems","flexShrink","FavouriteEditingModal","isModalOpen","handleClose","updateFavourites","deleteFavourite","onEditSelected","favourites","isLoading","source","setSource","useState","reordered","setReordered","selectedFavourite","setSelectedFavourite","previousFavourites","useRef","isEqual","items","useEffect","current","isEmpty","move","index","direction","copy","closeDeleteDialog","_Fragment","DialogModal","headerText","dialogContent","primaryButtonText","primaryButtonOnClick","secondaryButtonText","secondaryButtonOnClick","Modal","open","onOpenChange","closeModal","omitted","map","omit","ModalContent","title","ReactSortable","tag","list","setList","newList","every","favouriteId","animation","handle","forceFallback","ghostClass","fallbackClass","Spinner","process","env","NODE_ENV","propTypes","PropTypes","shape","string","isRequired","func","bool","arrayOf","gid","lat","number","lon"],"mappings":"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","x_google_ignoreList":[1]}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../digitransit-search-util/packages/digitransit-search-util-uniq-by-label/index.js","../../../../node_modules/style-inject/dist/style-inject.es.js","../src/helpers/translations.js","../src/helpers/i18n.js","../src/helpers/FavouriteListItem.jsx","../src/index.jsx"],"sourcesContent":["import uniqWith from 'lodash/uniqWith';\nimport isEqual from 'lodash/isEqual';\nimport memoize from 'lodash/memoize';\nimport escapeRegExp from 'lodash/escapeRegExp';\nimport cloneDeep from 'lodash/cloneDeep';\n\n/**\n * Location properties.\n * @typedef {LocationProperties}\n * @property {string} layer Suggestion layer.\n * @property {lat} [number]\n * @property {lon} [number]\n * @property {string} address Address.\n */\n\n/**\n * Returns localadmin (city name) for suggestions\n *\n * @name getLocaladmin\n * @param {Object} suggestion suggestion's properties from geocoding or a favourite stop/station.\n * Expects last part of an address (after ',') to contain the city name of the suggestion location.\n * @returns {String} City name or empty string\n */\nconst getLocaladmin = suggestion =>\n suggestion.localadmin ||\n suggestion.localadmin ||\n (suggestion.address &&\n suggestion.address.lastIndexOf(',') < suggestion.address.length - 2 &&\n suggestion.address.substring(suggestion.address.lastIndexOf(',') + 2)) ||\n '';\n\nexport const getStopCode = ({ id, code }) => {\n if (code) {\n return code;\n }\n if (\n id === undefined ||\n typeof id.indexOf === 'undefined' ||\n id.indexOf('#') === -1\n ) {\n return undefined;\n }\n // id from pelias\n return id.substring(id.indexOf('#') + 1);\n};\n\nexport const formatFavouritePlaceLabel = (name, address) => [\n name || (address && address.split(',')[0]),\n typeof address === 'string'\n ? address.replace(new RegExp(`${escapeRegExp(name)}([ ,]|$)+`), '')\n : '',\n];\n\n/**\n * Format suggestion-pair [name, address] by `suggestion.layer`.\n *\n * @name getNameLabel\n * @param {LocationProperties} suggestion\n * @param {boolean} [plain]\n *\n * @returns {Array.<string>} Formatted label.\n */\nexport const getNameLabel = memoize(\n (suggestion, plain = false) => {\n switch (suggestion.layer) {\n case 'currentPosition':\n return [suggestion.labelId, suggestion.address];\n case 'selectFromMap':\n case 'ownLocations':\n case 'back':\n return [suggestion.labelId];\n case 'favouritePlace':\n return formatFavouritePlaceLabel(suggestion.name, suggestion.address);\n case 'favouriteVehicleRentalStation':\n case 'bikestation':\n return [suggestion.name];\n case 'favouriteRoute':\n case 'route-BUS':\n case 'route-TRAM':\n case 'route-RAIL':\n case 'route-SUBWAY':\n case 'route-FERRY':\n case 'route-FUNICULAR':\n case 'route-AIRPLANE':\n return !plain && suggestion.shortName\n ? [\n suggestion.gtfsId,\n suggestion.mode.toLowerCase(),\n suggestion.longName,\n ]\n : [\n suggestion.shortName,\n suggestion.longName,\n suggestion.agency ? suggestion.agency.name : undefined,\n ];\n case 'venue':\n case 'address':\n case 'street':\n return [\n suggestion.name,\n suggestion.label.replace(\n new RegExp(`${escapeRegExp(suggestion.name)}(,)?( )?`),\n '',\n ),\n ];\n case 'favouriteStop':\n case 'stop':\n return plain\n ? [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ]\n : [\n suggestion.name,\n suggestion.id,\n getStopCode(suggestion),\n getLocaladmin(suggestion),\n ];\n case 'favouriteStation':\n case 'station':\n default:\n return [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ];\n }\n },\n (item, plain) => {\n const i = cloneDeep(item);\n i.plain = plain;\n return i;\n },\n);\n\n/**\n * Checks that features are unique by label\n *\n * @name uniqByLabel\n * @param {Array} features Array of features\n * @returns {Array} Array of unique features\n * @example\n * digitransit-search-util.uniqByLabel(features);\n * //= Array(2)\n */\nexport default function uniqByLabel(features) {\n return uniqWith(features, (feat1, feat2) => {\n if (feat1.type === 'FutureRoute' || feat2.type === 'FutureRoute') {\n return false;\n }\n return (\n isEqual(getNameLabel(feat1.properties), getNameLabel(feat2.properties)) &&\n feat1.properties.layer === feat2.properties.layer\n );\n });\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","/* eslint sort-keys: \"error\" */\nconst translations = {\n de: {\n translation: {\n cancel: 'Abbrechen',\n delete: 'Löschen',\n 'delete-place-header': 'Wollen Sie den Favoriten löschen?',\n 'delete-place-name': 'Lösche Favorit: {{favourite.name}}',\n 'edit-place-name': 'Bearbeite Favorit: {{favourite.name}}',\n 'edit-places': 'Bearbeite Favoriten',\n },\n },\n en: {\n translation: {\n cancel: 'Cancel',\n delete: 'Delete',\n 'delete-place-header': 'Do you want to delete the place?',\n 'delete-place-name': 'Delete place: {{favourite.name}}',\n down: 'Move favourite down',\n 'edit-place-name': 'Edit place: {{favourite.name}}',\n 'edit-places': 'Edit places',\n up: 'Move favourite up',\n },\n },\n fi: {\n translation: {\n cancel: 'Peruuta',\n delete: 'Poista',\n 'delete-place-header': 'Haluatko poistaa paikan?',\n 'delete-place-name': 'Poista paikka: {{favourite.name}}',\n down: 'Siirrä suosikkisijaintia alaspäin',\n 'edit-place-name': 'Muokkaa paikkaa: {{favourite.name}}',\n 'edit-places': 'Muokkaa paikkoja',\n up: 'Siirrä suosikkisijaintia ylöpäin',\n },\n },\n pl: {\n translation: {\n cancel: 'Anuluj',\n delete: 'Usuń',\n 'delete-place-header': 'Czy na pewno chcesz usunąć to miejsce?',\n 'delete-place-name': 'Usuń miejsce: {{favourite.name}}',\n down: 'Przenieś ulubione niżej',\n 'edit-place-name': 'Edytuj miejsce: {{favourite.name}}',\n 'edit-places': 'Edytuj miejsca',\n up: 'Przenieś ulubione wyżej',\n },\n },\n sv: {\n translation: {\n cancel: 'Avbryt',\n delete: 'Ta bort',\n 'delete-place-header': 'Vill du ta bort platsen?',\n 'delete-place-name': 'Ta bort platsen: {{favourite.name}}',\n down: 'Flytta favoriten nedåt',\n 'edit-place-name': 'Edit place: {{favourite.name}}',\n 'edit-places': 'Redigera platser',\n up: 'Flytta favoriten uppåt',\n },\n },\n};\n\nexport default translations;\n","import { createInstance } from 'i18next';\nimport translations from './translations';\n\nconst i18n = createInstance({\n fallbackLng: 'fi',\n // debug: true,\n resources: translations,\n defaultNS: 'translation',\n react: {\n useSuspense: true,\n },\n});\n\ni18n.init();\n\nexport default i18n;\n","import PropTypes from 'prop-types';\nimport { useTranslation } from 'react-i18next';\nimport { FlexColumn, FlexRow, Text } from '@hsl-fi/layout-primitives';\nimport { useSortable } from '@dnd-kit/react/sortable';\nimport Icon from '@digitransit-component/digitransit-component-icon';\nimport { formatFavouritePlaceLabel } from '@digitransit-search-util/digitransit-search-util-uniq-by-label';\nimport styles from './styles.scss';\nimport i18n from './i18n';\n\nconst getIconId = selectedIconId => {\n const prefixPos = selectedIconId ? selectedIconId.indexOf('icon_') : -1;\n return prefixPos > 0 ? selectedIconId.substring(prefixPos + 5) : 'place';\n};\n\n/**\n * One row of the favourites list. The visually hidden arrow buttons are a\n * keyboard alternative to dragging.\n */\nfunction FavouriteListItem({\n favourite,\n lang,\n onMoveUp = null,\n onMoveDown = null,\n onEdit,\n onDelete,\n index,\n}) {\n const { t } = useTranslation('translation', { i18n });\n const { ref } = useSortable({ id: favourite.favouriteId, index });\n const iconId = getIconId(favourite.selectedIconId);\n const [name, address] = formatFavouritePlaceLabel(\n favourite.name,\n favourite.address,\n );\n\n return (\n <li ref={ref} className={styles.item}>\n <div className={styles.dragHandle}>\n {onMoveUp && (\n <button\n type=\"button\"\n className={styles.arrow}\n aria-label={t('up', { lng: lang })}\n onClick={onMoveUp}\n >\n &uarr;\n </button>\n )}\n {onMoveDown && (\n <button\n type=\"button\"\n className={styles.arrow}\n aria-label={t('down', { lng: lang })}\n onClick={onMoveDown}\n >\n &darr;\n </button>\n )}\n <span className={styles.ellipsis}>\n <Icon img=\"ellipsis\" color=\"currentColor\" />\n </span>\n <span className={styles.placeIcon}>\n <Icon img={iconId} color=\"currentColor\" />\n </span>\n </div>\n <FlexColumn className={styles.text}>\n <Text variant=\"text-xs-bold\" as=\"p\" className={styles.name}>\n {name}\n </Text>\n <Text variant=\"text-xs\" as=\"p\" color=\"weak\" className={styles.address}>\n {address}\n </Text>\n </FlexColumn>\n <FlexRow alignItems=\"center\" flexShrink={0}>\n <button\n type=\"button\"\n className={styles.actionButton}\n aria-label={t('edit-place-name', { lng: lang, favourite })}\n onClick={onEdit}\n >\n <Icon img=\"edit\" color=\"currentColor\" />\n </button>\n <button\n type=\"button\"\n className={styles.actionButton}\n aria-label={t('delete-place-name', { lng: lang, favourite })}\n onClick={onDelete}\n >\n <Icon img=\"trash\" color=\"currentColor\" />\n </button>\n </FlexRow>\n </li>\n );\n}\n\nFavouriteListItem.propTypes = {\n favourite: PropTypes.shape({\n favouriteId: PropTypes.string,\n name: PropTypes.string,\n address: PropTypes.string,\n selectedIconId: PropTypes.string,\n }).isRequired,\n lang: PropTypes.string.isRequired,\n onEdit: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n onMoveUp: PropTypes.func,\n onMoveDown: PropTypes.func,\n index: PropTypes.number.isRequired,\n};\n\nexport default FavouriteListItem;\n","import { useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useTranslation } from 'react-i18next';\nimport { DragDropProvider } from '@dnd-kit/react';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqual from 'lodash/isEqual';\nimport omit from 'lodash/omit';\nimport { Spinner } from '@hsl-fi/loading-indicators';\nimport { Modal, ModalContent } from '@hsl-fi/dialog';\nimport DialogModal from '@digitransit-component/digitransit-component-dialog-modal';\nimport FavouriteListItem from './helpers/FavouriteListItem';\nimport i18n from './helpers/i18n';\nimport styles from './helpers/styles.scss';\n\n/**\n * A dialog for reordering, editing and deleting favourite places, built on\n * the HSL design system's Modal. Colors, typography and the mobile/desktop\n * layout are handled by the design system, so the dialog follows the active\n * deployment's theme.\n *\n * @example\n * <FavouriteEditingModal\n * isModalOpen={modalOpen}\n * handleClose={handleClose}\n * favourites={favourites}\n * updateFavourites={onUpdateFavourites}\n * deleteFavourite={onDeleteFavourite}\n * onEditSelected={onEditSelected}\n * isLoading={false}\n * lang=\"fi\"\n * />\n */\nfunction FavouriteEditingModal({\n isModalOpen,\n handleClose,\n updateFavourites,\n deleteFavourite,\n onEditSelected,\n favourites,\n isLoading,\n lang = 'fi',\n}) {\n const { t } = useTranslation('translation', { i18n });\n const [source, setSource] = useState(favourites);\n const [reordered, setReordered] = useState(null);\n const [selectedFavourite, setSelectedFavourite] = useState(null);\n const previousFavourites = useRef(favourites);\n\n // Drop the local order when the favourites change from outside\n if (!isEqual(source, favourites)) {\n setSource(favourites);\n setReordered(null);\n }\n const items = reordered || favourites;\n\n useEffect(() => {\n if (\n previousFavourites.current !== favourites &&\n !isEqual(previousFavourites.current, favourites) &&\n isEmpty(favourites)\n ) {\n handleClose();\n }\n previousFavourites.current = favourites;\n }, [favourites, handleClose]);\n\n const move = (index, direction) => {\n const copy = [...items];\n [copy[index], copy[index + direction]] = [\n copy[index + direction],\n copy[index],\n ];\n setReordered(copy);\n };\n\n const onDragEnd = event => {\n if (event.canceled) {\n return;\n }\n const { initialIndex, index } = event.operation.source?.sortable || {};\n if (initialIndex === undefined || initialIndex === index) {\n return;\n }\n const copy = [...items];\n const [moved] = copy.splice(initialIndex, 1);\n copy.splice(index, 0, moved);\n setReordered(copy);\n };\n\n const closeModal = () => {\n handleClose();\n const omitted = items.map(item => omit(item, ['chosen', 'selected']));\n if (!isEqual(omitted, favourites)) {\n updateFavourites(omitted);\n }\n };\n\n const closeDeleteDialog = () => setSelectedFavourite(null);\n\n return (\n <>\n <DialogModal\n headerText={t('delete-place-header', { lng: lang })}\n handleClose={() => {\n closeDeleteDialog();\n handleClose();\n }}\n isModalOpen={selectedFavourite !== null}\n dialogContent={\n selectedFavourite\n ? `${selectedFavourite.name}: ${selectedFavourite.address}`\n : ''\n }\n primaryButtonText={t('delete', { lng: lang })}\n primaryButtonOnClick={() => {\n deleteFavourite(selectedFavourite);\n closeDeleteDialog();\n }}\n secondaryButtonText={t('cancel', { lng: lang })}\n secondaryButtonOnClick={closeDeleteDialog}\n lang={lang}\n />\n <Modal\n open={isModalOpen && selectedFavourite === null}\n onOpenChange={open => {\n if (!open) {\n closeModal();\n }\n }}\n >\n <ModalContent\n lang={lang}\n title={t('edit-places', { lng: lang })}\n className={styles.modalContent}\n aria-describedby={undefined}\n >\n <div className={styles.listContainer}>\n <DragDropProvider onDragEnd={onDragEnd}>\n <ul className={styles.list}>\n {items.map((favourite, index) => (\n <FavouriteListItem\n key={favourite.favouriteId}\n index={index}\n favourite={favourite}\n lang={lang}\n onMoveUp={index > 0 ? () => move(index, -1) : null}\n onMoveDown={\n index < items.length - 1 ? () => move(index, 1) : null\n }\n onEdit={() => onEditSelected(favourite)}\n onDelete={() => setSelectedFavourite(favourite)}\n />\n ))}\n </ul>\n </DragDropProvider>\n {isLoading && (\n <div className={styles.overlay}>\n <Spinner />\n </div>\n )}\n </div>\n </ModalContent>\n </Modal>\n </>\n );\n}\n\nFavouriteEditingModal.propTypes = {\n /** Required. Whether the dialog is open.\n * @type {boolean} */\n isModalOpen: PropTypes.bool.isRequired,\n /** Required. Close modal.\n * @type {function} */\n handleClose: PropTypes.func.isRequired,\n /** Required. Called with the reordered favourites when the dialog is closed.\n * @type {function} */\n updateFavourites: PropTypes.func.isRequired,\n /** Required. Called with the favourite the user confirmed deleting.\n * @type {function} */\n deleteFavourite: PropTypes.func.isRequired,\n /** Required. Function that takes selected favourite object as parameter.\n * @type {function} */\n onEditSelected: PropTypes.func.isRequired,\n /** Required. Whether a save is in progress; shows a spinner over the list.\n * @type {boolean} */\n isLoading: PropTypes.bool.isRequired,\n /** Required.\n * @type {array<object>}\n * @property {string} type\n * @property {string} address\n * @property {string} gtfsId\n * @property {string} gid\n * @property {number} lat\n * @property {number} lon\n * @property {string} name\n * @property {string} selectedIconId\n * @property {string} favouriteId\n * @property {string} layer\n */\n favourites: PropTypes.arrayOf(\n PropTypes.shape({\n type: PropTypes.string,\n address: PropTypes.string,\n gtfsId: PropTypes.string,\n gid: PropTypes.string,\n lat: PropTypes.number,\n lon: PropTypes.number,\n name: PropTypes.string,\n selectedIconId: PropTypes.string,\n favouriteId: PropTypes.string,\n layer: PropTypes.string,\n }),\n ).isRequired,\n /** Optional. Language, fi, en or sv. Defaults to fi.\n * @type {string} */\n lang: PropTypes.string,\n};\n\nexport default FavouriteEditingModal;\n"],"names":["getLocaladmin","suggestion","localadmin","address","lastIndexOf","length","substring","getStopCode","id","code","undefined","indexOf","formatFavouritePlaceLabel","name","split","replace","RegExp","escapeRegExp","memoize","plain","layer","labelId","shortName","gtfsId","mode","toLowerCase","longName","agency","label","item","i","cloneDeep","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","i18n","createInstance","fallbackLng","resources","de","translation","cancel","delete","en","down","up","fi","pl","sv","defaultNS","react","useSuspense","init","FavouriteListItem","favourite","lang","onMoveUp","onMoveDown","onEdit","onDelete","index","t","useTranslation","useSortable","favouriteId","iconId","selectedIconId","prefixPos","getIconId","_jsxs","className","styles","children","_jsx","lng","onClick","Icon","img","color","FlexColumn","Text","variant","as","FlexRow","alignItems","flexShrink","FavouriteEditingModal","isModalOpen","handleClose","updateFavourites","deleteFavourite","onEditSelected","favourites","isLoading","source","setSource","useState","reordered","setReordered","selectedFavourite","setSelectedFavourite","previousFavourites","useRef","isEqual","items","useEffect","current","isEmpty","move","direction","copy","closeDeleteDialog","_Fragment","DialogModal","headerText","dialogContent","primaryButtonText","primaryButtonOnClick","secondaryButtonText","secondaryButtonOnClick","Modal","open","onOpenChange","closeModal","omitted","map","omit","ModalContent","title","DragDropProvider","onDragEnd","event","canceled","initialIndex","operation","sortable","moved","splice","Spinner","process","env","NODE_ENV","propTypes","PropTypes","shape","string","isRequired","func","number","bool","arrayOf","gid","lat","lon"],"mappings":"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","x_google_ignoreList":[1]}
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('prop-types'), require('react-i18next'), require('react-sortablejs'), require('lodash/isEmpty'), require('lodash/isEqual'), require('lodash/omit'), require('@hsl-fi/loading-indicators'), require('@hsl-fi/dialog'), require('@digitransit-component/digitransit-component-dialog-modal'), require('@hsl-fi/layout-primitives'), require('@digitransit-component/digitransit-component-icon'), require('lodash/uniqWith'), require('lodash/memoize'), require('lodash/escapeRegExp'), require('lodash/cloneDeep'), require('i18next'), require('react/jsx-runtime')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'react', 'prop-types', 'react-i18next', 'react-sortablejs', 'lodash/isEmpty', 'lodash/isEqual', 'lodash/omit', '@hsl-fi/loading-indicators', '@hsl-fi/dialog', '@digitransit-component/digitransit-component-dialog-modal', '@hsl-fi/layout-primitives', '@digitransit-component/digitransit-component-icon', 'lodash/uniqWith', 'lodash/memoize', 'lodash/escapeRegExp', 'lodash/cloneDeep', 'i18next', 'react/jsx-runtime'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@digitransit-component/digitransit-component-favourite-editing-modal"] = {}, global.React, global.PropTypes, global.reactI18next, global.reactSortablejs, global.isEmpty, global.isEqual, global.omit, global.LoadingIndicators, global.dialog, global.DialogModal, global.layoutPrimitives, global.Icon, global.uniqWith, global.memoize, global.escapeRegExp, global.cloneDeep, global.i18next, global.jsxRuntime));
5
- })(this, (function (exports, react, PropTypes, reactI18next, reactSortablejs, isEmpty, isEqual, omit, loadingIndicators, dialog, DialogModal, layoutPrimitives, Icon, uniqWith, memoize, escapeRegExp, cloneDeep, i18next, jsxRuntime) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('prop-types'), require('react-i18next'), require('@dnd-kit/react'), require('lodash/isEmpty'), require('lodash/isEqual'), require('lodash/omit'), require('@hsl-fi/loading-indicators'), require('@hsl-fi/dialog'), require('@digitransit-component/digitransit-component-dialog-modal'), require('@hsl-fi/layout-primitives'), require('@dnd-kit/react/sortable'), require('@digitransit-component/digitransit-component-icon'), require('lodash/uniqWith'), require('lodash/memoize'), require('lodash/escapeRegExp'), require('lodash/cloneDeep'), require('i18next'), require('react/jsx-runtime')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'react', 'prop-types', 'react-i18next', '@dnd-kit/react', 'lodash/isEmpty', 'lodash/isEqual', 'lodash/omit', '@hsl-fi/loading-indicators', '@hsl-fi/dialog', '@digitransit-component/digitransit-component-dialog-modal', '@hsl-fi/layout-primitives', '@dnd-kit/react/sortable', '@digitransit-component/digitransit-component-icon', 'lodash/uniqWith', 'lodash/memoize', 'lodash/escapeRegExp', 'lodash/cloneDeep', 'i18next', 'react/jsx-runtime'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@digitransit-component/digitransit-component-favourite-editing-modal"] = {}, global.React, global.PropTypes, global.reactI18next, global.dndKitReact, global.isEmpty, global.isEqual, global.omit, global.LoadingIndicators, global.dialog, global.DialogModal, global.layoutPrimitives, global.dndKitReactSortable, global.Icon, global.uniqWith, global.memoize, global.escapeRegExp, global.cloneDeep, global.i18next, global.jsxRuntime));
5
+ })(this, (function (exports, react, PropTypes, reactI18next, react$1, isEmpty, isEqual, omit, loadingIndicators, dialog, DialogModal, layoutPrimitives, sortable, Icon, uniqWith, memoize, escapeRegExp, cloneDeep, i18next, jsxRuntime) { 'use strict';
6
6
 
7
7
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
8
 
@@ -125,8 +125,8 @@
125
125
  }
126
126
  }
127
127
 
128
- var css_248z = ".styles_modalContent__DPecW.styles_modalContent__DPecW:focus, .styles_modalContent__DPecW.styles_modalContent__DPecW:focus-visible {\n outline: none;\n}\n\n.styles_listContainer__BE6HY {\n position: relative;\n width: 100%;\n}\n@media (max-width: 499px) {\n .styles_listContainer__BE6HY {\n margin-top: 24px;\n }\n}\n@media (min-width: 500px) {\n .styles_listContainer__BE6HY {\n min-height: 286px;\n }\n}\n\n.styles_list__xeRy9 {\n display: flex;\n flex-direction: column;\n gap: var(--space-fixed-xs, 8px);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.styles_item__DbRsI {\n display: flex;\n align-items: center;\n min-height: 50px;\n background: var(--color-surface-default, #fff);\n border: 1px solid var(--color-border-weak, #ddd);\n border-radius: var(--radius-m, 8px);\n box-sizing: border-box;\n}\n\n.styles_ghost__Zi5Ln {\n opacity: 0;\n}\n\n.styles_fallback__mrveX {\n opacity: 1 !important;\n}\n\n.styles_dragHandle__kplvR {\n display: flex;\n align-items: center;\n flex: none;\n align-self: stretch;\n cursor: move;\n color: var(--color-icon-accent, #0074bf);\n}\n\n.styles_ellipsis__Gma55 {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 37px;\n color: var(--color-icon-weakest, #888);\n}\n.styles_ellipsis__Gma55 svg {\n height: 20px;\n transform: rotate(90deg);\n}\n\n.styles_placeIcon__-6soL {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n margin-right: var(--space-fixed-xs, 8px);\n}\n.styles_placeIcon__-6soL svg {\n width: 20px;\n height: 20px;\n}\n\n.styles_arrow__lYXD3:not(:focus, :active) {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.styles_arrow__lYXD3 {\n font-weight: var(--font-weight-medium, 500);\n}\n\n.styles_text__al7Br {\n flex: 1 1 0;\n min-width: 0;\n padding-left: var(--space-fixed-xs, 8px);\n}\n\n.styles_name__en71y,\n.styles_address__-cd84 {\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.styles_address__-cd84:empty {\n display: none;\n}\n\n.styles_actionButton__y-oae {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 48px;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n cursor: pointer;\n color: var(--color-icon-weakest, #888);\n}\n.styles_actionButton__y-oae:hover, .styles_actionButton__y-oae:focus-visible {\n color: var(--color-icon-accent, #0074bf);\n}\n.styles_actionButton__y-oae svg {\n width: 18px;\n height: 18px;\n}\n\n.styles_overlay__TtXTn {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n inset: 0;\n background: var(--color-surface-default, #fff);\n}";
129
- var styles = {"modalContent":"styles_modalContent__DPecW","listContainer":"styles_listContainer__BE6HY","list":"styles_list__xeRy9","item":"styles_item__DbRsI","ghost":"styles_ghost__Zi5Ln","fallback":"styles_fallback__mrveX","dragHandle":"styles_dragHandle__kplvR","ellipsis":"styles_ellipsis__Gma55","placeIcon":"styles_placeIcon__-6soL","arrow":"styles_arrow__lYXD3","text":"styles_text__al7Br","name":"styles_name__en71y","address":"styles_address__-cd84","actionButton":"styles_actionButton__y-oae","overlay":"styles_overlay__TtXTn"};
128
+ var css_248z = ".styles_modalContent__DPecW.styles_modalContent__DPecW:focus, .styles_modalContent__DPecW.styles_modalContent__DPecW:focus-visible {\n outline: none;\n}\n\n.styles_listContainer__BE6HY {\n position: relative;\n width: 100%;\n}\n@media (max-width: 499px) {\n .styles_listContainer__BE6HY {\n margin-top: 24px;\n }\n}\n@media (min-width: 500px) {\n .styles_listContainer__BE6HY {\n min-height: 286px;\n }\n}\n\n.styles_list__xeRy9 {\n display: flex;\n flex-direction: column;\n gap: var(--space-fixed-xs, 8px);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.styles_item__DbRsI {\n display: flex;\n align-items: center;\n min-height: 50px;\n background: var(--color-surface-default, #fff);\n border: 1px solid var(--color-border-weak, #ddd);\n border-radius: var(--radius-m, 8px);\n box-sizing: border-box;\n}\n\n.styles_dragHandle__kplvR {\n display: flex;\n align-items: center;\n flex: none;\n align-self: stretch;\n cursor: move;\n color: var(--color-icon-accent, #0074bf);\n}\n\n.styles_ellipsis__Gma55 {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 37px;\n color: var(--color-icon-weakest, #888);\n}\n.styles_ellipsis__Gma55 svg {\n height: 20px;\n transform: rotate(90deg);\n}\n\n.styles_placeIcon__-6soL {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n margin-right: var(--space-fixed-xs, 8px);\n}\n.styles_placeIcon__-6soL svg {\n width: 20px;\n height: 20px;\n}\n\n.styles_arrow__lYXD3:not(:focus, :active) {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.styles_arrow__lYXD3 {\n font-weight: var(--font-weight-medium, 500);\n}\n\n.styles_text__al7Br {\n flex: 1 1 0;\n min-width: 0;\n padding-left: var(--space-fixed-xs, 8px);\n}\n\n.styles_name__en71y,\n.styles_address__-cd84 {\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.styles_address__-cd84:empty {\n display: none;\n}\n\n.styles_actionButton__y-oae {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 48px;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n cursor: pointer;\n color: var(--color-icon-weakest, #888);\n}\n.styles_actionButton__y-oae:hover, .styles_actionButton__y-oae:focus-visible {\n color: var(--color-icon-accent, #0074bf);\n}\n.styles_actionButton__y-oae svg {\n width: 18px;\n height: 18px;\n}\n\n.styles_overlay__TtXTn {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n inset: 0;\n background: var(--color-surface-default, #fff);\n}";
129
+ var styles = {"modalContent":"styles_modalContent__DPecW","listContainer":"styles_listContainer__BE6HY","list":"styles_list__xeRy9","item":"styles_item__DbRsI","dragHandle":"styles_dragHandle__kplvR","ellipsis":"styles_ellipsis__Gma55","placeIcon":"styles_placeIcon__-6soL","arrow":"styles_arrow__lYXD3","text":"styles_text__al7Br","name":"styles_name__en71y","address":"styles_address__-cd84","actionButton":"styles_actionButton__y-oae","overlay":"styles_overlay__TtXTn"};
130
130
  styleInject(css_248z);
131
131
 
132
132
  /* eslint sort-keys: "error" */
@@ -202,7 +202,6 @@
202
202
  });
203
203
  i18n.init();
204
204
 
205
- const DRAG_HANDLE_CLASS = styles.dragHandle;
206
205
  const getIconId = selectedIconId => {
207
206
  const prefixPos = selectedIconId ? selectedIconId.indexOf('icon_') : -1;
208
207
  return prefixPos > 0 ? selectedIconId.substring(prefixPos + 5) : 'place';
@@ -218,16 +217,24 @@
218
217
  onMoveUp = null,
219
218
  onMoveDown = null,
220
219
  onEdit,
221
- onDelete
220
+ onDelete,
221
+ index
222
222
  }) {
223
223
  const {
224
224
  t
225
225
  } = reactI18next.useTranslation('translation', {
226
226
  i18n
227
227
  });
228
+ const {
229
+ ref
230
+ } = sortable.useSortable({
231
+ id: favourite.favouriteId,
232
+ index
233
+ });
228
234
  const iconId = getIconId(favourite.selectedIconId);
229
235
  const [name, address] = formatFavouritePlaceLabel(favourite.name, favourite.address);
230
236
  return /*#__PURE__*/jsxRuntime.jsxs("li", {
237
+ ref: ref,
231
238
  className: styles.item,
232
239
  children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
233
240
  className: styles.dragHandle,
@@ -307,6 +314,7 @@
307
314
  }
308
315
  process.env.NODE_ENV !== "production" ? FavouriteListItem.propTypes = {
309
316
  favourite: PropTypes__default.default.shape({
317
+ favouriteId: PropTypes__default.default.string,
310
318
  name: PropTypes__default.default.string,
311
319
  address: PropTypes__default.default.string,
312
320
  selectedIconId: PropTypes__default.default.string
@@ -315,7 +323,8 @@
315
323
  onEdit: PropTypes__default.default.func.isRequired,
316
324
  onDelete: PropTypes__default.default.func.isRequired,
317
325
  onMoveUp: PropTypes__default.default.func,
318
- onMoveDown: PropTypes__default.default.func
326
+ onMoveDown: PropTypes__default.default.func,
327
+ index: PropTypes__default.default.number.isRequired
319
328
  } : void 0;
320
329
 
321
330
  function FavouriteEditingModal({
@@ -355,13 +364,21 @@
355
364
  [copy[index], copy[index + direction]] = [copy[index + direction], copy[index]];
356
365
  setReordered(copy);
357
366
  };
358
-
359
- // ReactSortable also calls setList on mount and on selection changes without reordering
360
- const setList = newList => {
361
- const sameOrder = newList.length === items.length && newList.every((item, i) => item.favouriteId === items[i].favouriteId);
362
- if (!sameOrder) {
363
- setReordered(newList);
367
+ const onDragEnd = event => {
368
+ if (event.canceled) {
369
+ return;
364
370
  }
371
+ const {
372
+ initialIndex,
373
+ index
374
+ } = event.operation.source?.sortable || {};
375
+ if (initialIndex === undefined || initialIndex === index) {
376
+ return;
377
+ }
378
+ const copy = [...items];
379
+ const [moved] = copy.splice(initialIndex, 1);
380
+ copy.splice(index, 0, moved);
381
+ setReordered(copy);
365
382
  };
366
383
  const closeModal = () => {
367
384
  handleClose();
@@ -410,24 +427,20 @@
410
427
  "aria-describedby": undefined,
411
428
  children: /*#__PURE__*/jsxRuntime.jsxs("div", {
412
429
  className: styles.listContainer,
413
- children: [/*#__PURE__*/jsxRuntime.jsx(reactSortablejs.ReactSortable, {
414
- className: styles.list,
415
- tag: "ul",
416
- list: items,
417
- setList: setList,
418
- animation: 200,
419
- handle: `.${DRAG_HANDLE_CLASS}`,
420
- forceFallback: true,
421
- ghostClass: styles.ghost,
422
- fallbackClass: styles.fallback,
423
- children: items.map((favourite, index) => /*#__PURE__*/jsxRuntime.jsx(FavouriteListItem, {
424
- favourite: favourite,
425
- lang: lang,
426
- onMoveUp: index > 0 ? () => move(index, -1) : null,
427
- onMoveDown: index < items.length - 1 ? () => move(index, 1) : null,
428
- onEdit: () => onEditSelected(favourite),
429
- onDelete: () => setSelectedFavourite(favourite)
430
- }, favourite.favouriteId))
430
+ children: [/*#__PURE__*/jsxRuntime.jsx(react$1.DragDropProvider, {
431
+ onDragEnd: onDragEnd,
432
+ children: /*#__PURE__*/jsxRuntime.jsx("ul", {
433
+ className: styles.list,
434
+ children: items.map((favourite, index) => /*#__PURE__*/jsxRuntime.jsx(FavouriteListItem, {
435
+ index: index,
436
+ favourite: favourite,
437
+ lang: lang,
438
+ onMoveUp: index > 0 ? () => move(index, -1) : null,
439
+ onMoveDown: index < items.length - 1 ? () => move(index, 1) : null,
440
+ onEdit: () => onEditSelected(favourite),
441
+ onDelete: () => setSelectedFavourite(favourite)
442
+ }, favourite.favouriteId))
443
+ })
431
444
  }), isLoading && /*#__PURE__*/jsxRuntime.jsx("div", {
432
445
  className: styles.overlay,
433
446
  children: /*#__PURE__*/jsxRuntime.jsx(loadingIndicators.Spinner, {})
@@ -491,4 +504,4 @@
491
504
  Object.defineProperty(exports, '__esModule', { value: true });
492
505
 
493
506
  }));
494
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZGV2ZWxvcG1lbnQuY2pzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kaWdpdHJhbnNpdC1zZWFyY2gtdXRpbC9wYWNrYWdlcy9kaWdpdHJhbnNpdC1zZWFyY2gtdXRpbC11bmlxLWJ5LWxhYmVsL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWluamVjdC9kaXN0L3N0eWxlLWluamVjdC5lcy5qcyIsIi4uL3NyYy9oZWxwZXJzL3RyYW5zbGF0aW9ucy5qcyIsIi4uL3NyYy9oZWxwZXJzL2kxOG4uanMiLCIuLi9zcmMvaGVscGVycy9GYXZvdXJpdGVMaXN0SXRlbS5qc3giLCIuLi9zcmMvaW5kZXguanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB1bmlxV2l0aCBmcm9tICdsb2Rhc2gvdW5pcVdpdGgnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAnbG9kYXNoL21lbW9pemUnO1xuaW1wb3J0IGVzY2FwZVJlZ0V4cCBmcm9tICdsb2Rhc2gvZXNjYXBlUmVnRXhwJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XG5cbi8qKlxuICogTG9jYXRpb24gcHJvcGVydGllcy5cbiAqIEB0eXBlZGVmIHtMb2NhdGlvblByb3BlcnRpZXN9XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbGF5ZXIgU3VnZ2VzdGlvbiBsYXllci5cbiAqIEBwcm9wZXJ0eSB7bGF0fSBbbnVtYmVyXVxuICogQHByb3BlcnR5IHtsb259IFtudW1iZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWRkcmVzcyBBZGRyZXNzLlxuICovXG5cbi8qKlxuICogUmV0dXJucyBsb2NhbGFkbWluIChjaXR5IG5hbWUpIGZvciBzdWdnZXN0aW9uc1xuICpcbiAqIEBuYW1lIGdldExvY2FsYWRtaW5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdWdnZXN0aW9uIHN1Z2dlc3Rpb24ncyBwcm9wZXJ0aWVzIGZyb20gZ2VvY29kaW5nIG9yIGEgZmF2b3VyaXRlIHN0b3Avc3RhdGlvbi5cbiAqIEV4cGVjdHMgbGFzdCBwYXJ0IG9mIGFuIGFkZHJlc3MgKGFmdGVyICcsJykgdG8gY29udGFpbiB0aGUgY2l0eSBuYW1lIG9mIHRoZSBzdWdnZXN0aW9uIGxvY2F0aW9uLlxuICogQHJldHVybnMge1N0cmluZ30gIENpdHkgbmFtZSBvciBlbXB0eSBzdHJpbmdcbiAqL1xuY29uc3QgZ2V0TG9jYWxhZG1pbiA9IHN1Z2dlc3Rpb24gPT5cbiAgc3VnZ2VzdGlvbi5sb2NhbGFkbWluIHx8XG4gIHN1Z2dlc3Rpb24ubG9jYWxhZG1pbiB8fFxuICAoc3VnZ2VzdGlvbi5hZGRyZXNzICYmXG4gICAgc3VnZ2VzdGlvbi5hZGRyZXNzLmxhc3RJbmRleE9mKCcsJykgPCBzdWdnZXN0aW9uLmFkZHJlc3MubGVuZ3RoIC0gMiAmJlxuICAgIHN1Z2dlc3Rpb24uYWRkcmVzcy5zdWJzdHJpbmcoc3VnZ2VzdGlvbi5hZGRyZXNzLmxhc3RJbmRleE9mKCcsJykgKyAyKSkgfHxcbiAgJyc7XG5cbmV4cG9ydCBjb25zdCBnZXRTdG9wQ29kZSA9ICh7IGlkLCBjb2RlIH0pID0+IHtcbiAgaWYgKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoXG4gICAgaWQgPT09IHVuZGVmaW5lZCB8fFxuICAgIHR5cGVvZiBpZC5pbmRleE9mID09PSAndW5kZWZpbmVkJyB8fFxuICAgIGlkLmluZGV4T2YoJyMnKSA9PT0gLTFcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvLyBpZCBmcm9tIHBlbGlhc1xuICByZXR1cm4gaWQuc3Vic3RyaW5nKGlkLmluZGV4T2YoJyMnKSArIDEpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdEZhdm91cml0ZVBsYWNlTGFiZWwgPSAobmFtZSwgYWRkcmVzcykgPT4gW1xuICBuYW1lIHx8IChhZGRyZXNzICYmIGFkZHJlc3Muc3BsaXQoJywnKVswXSksXG4gIHR5cGVvZiBhZGRyZXNzID09PSAnc3RyaW5nJ1xuICAgID8gYWRkcmVzcy5yZXBsYWNlKG5ldyBSZWdFeHAoYCR7ZXNjYXBlUmVnRXhwKG5hbWUpfShbICxdfCQpK2ApLCAnJylcbiAgICA6ICcnLFxuXTtcblxuLyoqXG4gKiBGb3JtYXQgc3VnZ2VzdGlvbi1wYWlyIFtuYW1lLCBhZGRyZXNzXSBieSBgc3VnZ2VzdGlvbi5sYXllcmAuXG4gKlxuICogQG5hbWUgZ2V0TmFtZUxhYmVsXG4gKiBAcGFyYW0ge0xvY2F0aW9uUHJvcGVydGllc30gc3VnZ2VzdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbcGxhaW5dXG4gKlxuICogQHJldHVybnMge0FycmF5LjxzdHJpbmc+fSBGb3JtYXR0ZWQgbGFiZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXROYW1lTGFiZWwgPSBtZW1vaXplKFxuICAoc3VnZ2VzdGlvbiwgcGxhaW4gPSBmYWxzZSkgPT4ge1xuICAgIHN3aXRjaCAoc3VnZ2VzdGlvbi5sYXllcikge1xuICAgICAgY2FzZSAnY3VycmVudFBvc2l0aW9uJzpcbiAgICAgICAgcmV0dXJuIFtzdWdnZXN0aW9uLmxhYmVsSWQsIHN1Z2dlc3Rpb24uYWRkcmVzc107XG4gICAgICBjYXNlICdzZWxlY3RGcm9tTWFwJzpcbiAgICAgIGNhc2UgJ293bkxvY2F0aW9ucyc6XG4gICAgICBjYXNlICdiYWNrJzpcbiAgICAgICAgcmV0dXJuIFtzdWdnZXN0aW9uLmxhYmVsSWRdO1xuICAgICAgY2FzZSAnZmF2b3VyaXRlUGxhY2UnOlxuICAgICAgICByZXR1cm4gZm9ybWF0RmF2b3VyaXRlUGxhY2VMYWJlbChzdWdnZXN0aW9uLm5hbWUsIHN1Z2dlc3Rpb24uYWRkcmVzcyk7XG4gICAgICBjYXNlICdmYXZvdXJpdGVWZWhpY2xlUmVudGFsU3RhdGlvbic6XG4gICAgICBjYXNlICdiaWtlc3RhdGlvbic6XG4gICAgICAgIHJldHVybiBbc3VnZ2VzdGlvbi5uYW1lXTtcbiAgICAgIGNhc2UgJ2Zhdm91cml0ZVJvdXRlJzpcbiAgICAgIGNhc2UgJ3JvdXRlLUJVUyc6XG4gICAgICBjYXNlICdyb3V0ZS1UUkFNJzpcbiAgICAgIGNhc2UgJ3JvdXRlLVJBSUwnOlxuICAgICAgY2FzZSAncm91dGUtU1VCV0FZJzpcbiAgICAgIGNhc2UgJ3JvdXRlLUZFUlJZJzpcbiAgICAgIGNhc2UgJ3JvdXRlLUZVTklDVUxBUic6XG4gICAgICBjYXNlICdyb3V0ZS1BSVJQTEFORSc6XG4gICAgICAgIHJldHVybiAhcGxhaW4gJiYgc3VnZ2VzdGlvbi5zaG9ydE5hbWVcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5ndGZzSWQsXG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb24ubW9kZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICBzdWdnZXN0aW9uLmxvbmdOYW1lLFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW1xuICAgICAgICAgICAgICBzdWdnZXN0aW9uLnNob3J0TmFtZSxcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5sb25nTmFtZSxcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5hZ2VuY3kgPyBzdWdnZXN0aW9uLmFnZW5jeS5uYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgXTtcbiAgICAgIGNhc2UgJ3ZlbnVlJzpcbiAgICAgIGNhc2UgJ2FkZHJlc3MnOlxuICAgICAgY2FzZSAnc3RyZWV0JzpcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBzdWdnZXN0aW9uLm5hbWUsXG4gICAgICAgICAgc3VnZ2VzdGlvbi5sYWJlbC5yZXBsYWNlKFxuICAgICAgICAgICAgbmV3IFJlZ0V4cChgJHtlc2NhcGVSZWdFeHAoc3VnZ2VzdGlvbi5uYW1lKX0oLCk/KCApP2ApLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIGNhc2UgJ2Zhdm91cml0ZVN0b3AnOlxuICAgICAgY2FzZSAnc3RvcCc6XG4gICAgICAgIHJldHVybiBwbGFpblxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICBzdWdnZXN0aW9uLm5hbWUgfHxcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uLmxhYmVsIHx8XG4gICAgICAgICAgICAgICAgKHN1Z2dlc3Rpb24uYWRkcmVzcyAmJiBzdWdnZXN0aW9uLmFkZHJlc3Muc3BsaXQoJywnKVswXSksXG4gICAgICAgICAgICAgIGdldExvY2FsYWRtaW4oc3VnZ2VzdGlvbiksXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5pZCxcbiAgICAgICAgICAgICAgZ2V0U3RvcENvZGUoc3VnZ2VzdGlvbiksXG4gICAgICAgICAgICAgIGdldExvY2FsYWRtaW4oc3VnZ2VzdGlvbiksXG4gICAgICAgICAgICBdO1xuICAgICAgY2FzZSAnZmF2b3VyaXRlU3RhdGlvbic6XG4gICAgICBjYXNlICdzdGF0aW9uJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgc3VnZ2VzdGlvbi5uYW1lIHx8XG4gICAgICAgICAgICBzdWdnZXN0aW9uLmxhYmVsIHx8XG4gICAgICAgICAgICAoc3VnZ2VzdGlvbi5hZGRyZXNzICYmIHN1Z2dlc3Rpb24uYWRkcmVzcy5zcGxpdCgnLCcpWzBdKSxcbiAgICAgICAgICBnZXRMb2NhbGFkbWluKHN1Z2dlc3Rpb24pLFxuICAgICAgICBdO1xuICAgIH1cbiAgfSxcbiAgKGl0ZW0sIHBsYWluKSA9PiB7XG4gICAgY29uc3QgaSA9IGNsb25lRGVlcChpdGVtKTtcbiAgICBpLnBsYWluID0gcGxhaW47XG4gICAgcmV0dXJuIGk7XG4gIH0sXG4pO1xuXG4vKipcbiAqIENoZWNrcyB0aGF0IGZlYXR1cmVzIGFyZSB1bmlxdWUgYnkgbGFiZWxcbiAqXG4gKiBAbmFtZSB1bmlxQnlMYWJlbFxuICogQHBhcmFtIHtBcnJheX0gZmVhdHVyZXMgQXJyYXkgb2YgZmVhdHVyZXNcbiAqIEByZXR1cm5zIHtBcnJheX0gIEFycmF5IG9mIHVuaXF1ZSBmZWF0dXJlc1xuICogQGV4YW1wbGVcbiAqIGRpZ2l0cmFuc2l0LXNlYXJjaC11dGlsLnVuaXFCeUxhYmVsKGZlYXR1cmVzKTtcbiAqIC8vPSBBcnJheSgyKVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1bmlxQnlMYWJlbChmZWF0dXJlcykge1xuICByZXR1cm4gdW5pcVdpdGgoZmVhdHVyZXMsIChmZWF0MSwgZmVhdDIpID0+IHtcbiAgICBpZiAoZmVhdDEudHlwZSA9PT0gJ0Z1dHVyZVJvdXRlJyB8fCBmZWF0Mi50eXBlID09PSAnRnV0dXJlUm91dGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBpc0VxdWFsKGdldE5hbWVMYWJlbChmZWF0MS5wcm9wZXJ0aWVzKSwgZ2V0TmFtZUxhYmVsKGZlYXQyLnByb3BlcnRpZXMpKSAmJlxuICAgICAgZmVhdDEucHJvcGVydGllcy5sYXllciA9PT0gZmVhdDIucHJvcGVydGllcy5sYXllclxuICAgICk7XG4gIH0pO1xufVxuIiwiZnVuY3Rpb24gc3R5bGVJbmplY3QoY3NzLCByZWYpIHtcbiAgaWYgKCByZWYgPT09IHZvaWQgMCApIHJlZiA9IHt9O1xuICB2YXIgaW5zZXJ0QXQgPSByZWYuaW5zZXJ0QXQ7XG5cbiAgaWYgKCFjc3MgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgeyByZXR1cm47IH1cblxuICB2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG5cbiAgaWYgKGluc2VydEF0ID09PSAndG9wJykge1xuICAgIGlmIChoZWFkLmZpcnN0Q2hpbGQpIHtcbiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBoZWFkLmZpcnN0Q2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIH1cblxuICBpZiAoc3R5bGUuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBzdHlsZUluamVjdDtcbiIsIi8qIGVzbGludCBzb3J0LWtleXM6IFwiZXJyb3JcIiAqL1xuY29uc3QgdHJhbnNsYXRpb25zID0ge1xuICBkZToge1xuICAgIHRyYW5zbGF0aW9uOiB7XG4gICAgICBjYW5jZWw6ICdBYmJyZWNoZW4nLFxuICAgICAgZGVsZXRlOiAnTMO2c2NoZW4nLFxuICAgICAgJ2RlbGV0ZS1wbGFjZS1oZWFkZXInOiAnV29sbGVuIFNpZSBkZW4gRmF2b3JpdGVuIGzDtnNjaGVuPycsXG4gICAgICAnZGVsZXRlLXBsYWNlLW5hbWUnOiAnTMO2c2NoZSBGYXZvcml0OiB7e2Zhdm91cml0ZS5uYW1lfX0nLFxuICAgICAgJ2VkaXQtcGxhY2UtbmFtZSc6ICdCZWFyYmVpdGUgRmF2b3JpdDoge3tmYXZvdXJpdGUubmFtZX19JyxcbiAgICAgICdlZGl0LXBsYWNlcyc6ICdCZWFyYmVpdGUgRmF2b3JpdGVuJyxcbiAgICB9LFxuICB9LFxuICBlbjoge1xuICAgIHRyYW5zbGF0aW9uOiB7XG4gICAgICBjYW5jZWw6ICdDYW5jZWwnLFxuICAgICAgZGVsZXRlOiAnRGVsZXRlJyxcbiAgICAgICdkZWxldGUtcGxhY2UtaGVhZGVyJzogJ0RvIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgcGxhY2U/JyxcbiAgICAgICdkZWxldGUtcGxhY2UtbmFtZSc6ICdEZWxldGUgcGxhY2U6IHt7ZmF2b3VyaXRlLm5hbWV9fScsXG4gICAgICBkb3duOiAnTW92ZSBmYXZvdXJpdGUgZG93bicsXG4gICAgICAnZWRpdC1wbGFjZS1uYW1lJzogJ0VkaXQgcGxhY2U6IHt7ZmF2b3VyaXRlLm5hbWV9fScsXG4gICAgICAnZWRpdC1wbGFjZXMnOiAnRWRpdCBwbGFjZXMnLFxuICAgICAgdXA6ICdNb3ZlIGZhdm91cml0ZSB1cCcsXG4gICAgfSxcbiAgfSxcbiAgZmk6IHtcbiAgICB0cmFuc2xhdGlvbjoge1xuICAgICAgY2FuY2VsOiAnUGVydXV0YScsXG4gICAgICBkZWxldGU6ICdQb2lzdGEnLFxuICAgICAgJ2RlbGV0ZS1wbGFjZS1oZWFkZXInOiAnSGFsdWF0a28gcG9pc3RhYSBwYWlrYW4/JyxcbiAgICAgICdkZWxldGUtcGxhY2UtbmFtZSc6ICdQb2lzdGEgcGFpa2thOiB7e2Zhdm91cml0ZS5uYW1lfX0nLFxuICAgICAgZG93bjogJ1NpaXJyw6Qgc3Vvc2lra2lzaWphaW50aWEgYWxhc3DDpGluJyxcbiAgICAgICdlZGl0LXBsYWNlLW5hbWUnOiAnTXVva2thYSBwYWlra2FhOiB7e2Zhdm91cml0ZS5uYW1lfX0nLFxuICAgICAgJ2VkaXQtcGxhY2VzJzogJ011b2trYWEgcGFpa2tvamEnLFxuICAgICAgdXA6ICdTaWlycsOkIHN1b3Npa2tpc2lqYWludGlhIHlsw7Zww6RpbicsXG4gICAgfSxcbiAgfSxcbiAgcGw6IHtcbiAgICB0cmFuc2xhdGlvbjoge1xuICAgICAgY2FuY2VsOiAnQW51bHVqJyxcbiAgICAgIGRlbGV0ZTogJ1VzdcWEJyxcbiAgICAgICdkZWxldGUtcGxhY2UtaGVhZGVyJzogJ0N6eSBuYSBwZXdubyBjaGNlc3ogdXN1bsSFxIcgdG8gbWllanNjZT8nLFxuICAgICAgJ2RlbGV0ZS1wbGFjZS1uYW1lJzogJ1VzdcWEIG1pZWpzY2U6IHt7ZmF2b3VyaXRlLm5hbWV9fScsXG4gICAgICBkb3duOiAnUHJ6ZW5pZcWbIHVsdWJpb25lIG5pxbxlaicsXG4gICAgICAnZWRpdC1wbGFjZS1uYW1lJzogJ0VkeXR1aiBtaWVqc2NlOiB7e2Zhdm91cml0ZS5uYW1lfX0nLFxuICAgICAgJ2VkaXQtcGxhY2VzJzogJ0VkeXR1aiBtaWVqc2NhJyxcbiAgICAgIHVwOiAnUHJ6ZW5pZcWbIHVsdWJpb25lIHd5xbxlaicsXG4gICAgfSxcbiAgfSxcbiAgc3Y6IHtcbiAgICB0cmFuc2xhdGlvbjoge1xuICAgICAgY2FuY2VsOiAnQXZicnl0JyxcbiAgICAgIGRlbGV0ZTogJ1RhIGJvcnQnLFxuICAgICAgJ2RlbGV0ZS1wbGFjZS1oZWFkZXInOiAnVmlsbCBkdSB0YSBib3J0IHBsYXRzZW4/JyxcbiAgICAgICdkZWxldGUtcGxhY2UtbmFtZSc6ICdUYSBib3J0IHBsYXRzZW46IHt7ZmF2b3VyaXRlLm5hbWV9fScsXG4gICAgICBkb3duOiAnRmx5dHRhIGZhdm9yaXRlbiBuZWTDpXQnLFxuICAgICAgJ2VkaXQtcGxhY2UtbmFtZSc6ICdFZGl0IHBsYWNlOiB7e2Zhdm91cml0ZS5uYW1lfX0nLFxuICAgICAgJ2VkaXQtcGxhY2VzJzogJ1JlZGlnZXJhIHBsYXRzZXInLFxuICAgICAgdXA6ICdGbHl0dGEgZmF2b3JpdGVuIHVwcMOldCcsXG4gICAgfSxcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRyYW5zbGF0aW9ucztcbiIsImltcG9ydCB7IGNyZWF0ZUluc3RhbmNlIH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQgdHJhbnNsYXRpb25zIGZyb20gJy4vdHJhbnNsYXRpb25zJztcblxuY29uc3QgaTE4biA9IGNyZWF0ZUluc3RhbmNlKHtcbiAgZmFsbGJhY2tMbmc6ICdmaScsXG4gIC8vIGRlYnVnOiB0cnVlLFxuICByZXNvdXJjZXM6IHRyYW5zbGF0aW9ucyxcbiAgZGVmYXVsdE5TOiAndHJhbnNsYXRpb24nLFxuICByZWFjdDoge1xuICAgIHVzZVN1c3BlbnNlOiB0cnVlLFxuICB9LFxufSk7XG5cbmkxOG4uaW5pdCgpO1xuXG5leHBvcnQgZGVmYXVsdCBpMThuO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnO1xuaW1wb3J0IHsgRmxleENvbHVtbiwgRmxleFJvdywgVGV4dCB9IGZyb20gJ0Boc2wtZmkvbGF5b3V0LXByaW1pdGl2ZXMnO1xuaW1wb3J0IEljb24gZnJvbSAnQGRpZ2l0cmFuc2l0LWNvbXBvbmVudC9kaWdpdHJhbnNpdC1jb21wb25lbnQtaWNvbic7XG5pbXBvcnQgeyBmb3JtYXRGYXZvdXJpdGVQbGFjZUxhYmVsIH0gZnJvbSAnQGRpZ2l0cmFuc2l0LXNlYXJjaC11dGlsL2RpZ2l0cmFuc2l0LXNlYXJjaC11dGlsLXVuaXEtYnktbGFiZWwnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3N0eWxlcy5zY3NzJztcbmltcG9ydCBpMThuIGZyb20gJy4vaTE4bic7XG5cbmV4cG9ydCBjb25zdCBEUkFHX0hBTkRMRV9DTEFTUyA9IHN0eWxlcy5kcmFnSGFuZGxlO1xuXG5jb25zdCBnZXRJY29uSWQgPSBzZWxlY3RlZEljb25JZCA9PiB7XG4gIGNvbnN0IHByZWZpeFBvcyA9IHNlbGVjdGVkSWNvbklkID8gc2VsZWN0ZWRJY29uSWQuaW5kZXhPZignaWNvbl8nKSA6IC0xO1xuICByZXR1cm4gcHJlZml4UG9zID4gMCA/IHNlbGVjdGVkSWNvbklkLnN1YnN0cmluZyhwcmVmaXhQb3MgKyA1KSA6ICdwbGFjZSc7XG59O1xuXG4vKipcbiAqIE9uZSByb3cgb2YgdGhlIGZhdm91cml0ZXMgbGlzdC4gVGhlIHZpc3VhbGx5IGhpZGRlbiBhcnJvdyBidXR0b25zIGFyZSBhXG4gKiBrZXlib2FyZCBhbHRlcm5hdGl2ZSB0byBkcmFnZ2luZy5cbiAqL1xuZnVuY3Rpb24gRmF2b3VyaXRlTGlzdEl0ZW0oe1xuICBmYXZvdXJpdGUsXG4gIGxhbmcsXG4gIG9uTW92ZVVwID0gbnVsbCxcbiAgb25Nb3ZlRG93biA9IG51bGwsXG4gIG9uRWRpdCxcbiAgb25EZWxldGUsXG59KSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oJ3RyYW5zbGF0aW9uJywgeyBpMThuIH0pO1xuICBjb25zdCBpY29uSWQgPSBnZXRJY29uSWQoZmF2b3VyaXRlLnNlbGVjdGVkSWNvbklkKTtcbiAgY29uc3QgW25hbWUsIGFkZHJlc3NdID0gZm9ybWF0RmF2b3VyaXRlUGxhY2VMYWJlbChcbiAgICBmYXZvdXJpdGUubmFtZSxcbiAgICBmYXZvdXJpdGUuYWRkcmVzcyxcbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxsaSBjbGFzc05hbWU9e3N0eWxlcy5pdGVtfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuZHJhZ0hhbmRsZX0+XG4gICAgICAgIHtvbk1vdmVVcCAmJiAoXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5hcnJvd31cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ3VwJywgeyBsbmc6IGxhbmcgfSl9XG4gICAgICAgICAgICBvbkNsaWNrPXtvbk1vdmVVcH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICAmdWFycjtcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgKX1cbiAgICAgICAge29uTW92ZURvd24gJiYgKFxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuYXJyb3d9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdkb3duJywgeyBsbmc6IGxhbmcgfSl9XG4gICAgICAgICAgICBvbkNsaWNrPXtvbk1vdmVEb3dufVxuICAgICAgICAgID5cbiAgICAgICAgICAgICZkYXJyO1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICApfVxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5lbGxpcHNpc30+XG4gICAgICAgICAgPEljb24gaW1nPVwiZWxsaXBzaXNcIiBjb2xvcj1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMucGxhY2VJY29ufT5cbiAgICAgICAgICA8SWNvbiBpbWc9e2ljb25JZH0gY29sb3I9XCJjdXJyZW50Q29sb3JcIiAvPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxGbGV4Q29sdW1uIGNsYXNzTmFtZT17c3R5bGVzLnRleHR9PlxuICAgICAgICA8VGV4dCB2YXJpYW50PVwidGV4dC14cy1ib2xkXCIgYXM9XCJwXCIgY2xhc3NOYW1lPXtzdHlsZXMubmFtZX0+XG4gICAgICAgICAge25hbWV9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQgdmFyaWFudD1cInRleHQteHNcIiBhcz1cInBcIiBjb2xvcj1cIndlYWtcIiBjbGFzc05hbWU9e3N0eWxlcy5hZGRyZXNzfT5cbiAgICAgICAgICB7YWRkcmVzc31cbiAgICAgICAgPC9UZXh0PlxuICAgICAgPC9GbGV4Q29sdW1uPlxuICAgICAgPEZsZXhSb3cgYWxpZ25JdGVtcz1cImNlbnRlclwiIGZsZXhTaHJpbms9ezB9PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuYWN0aW9uQnV0dG9ufVxuICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ2VkaXQtcGxhY2UtbmFtZScsIHsgbG5nOiBsYW5nLCBmYXZvdXJpdGUgfSl9XG4gICAgICAgICAgb25DbGljaz17b25FZGl0fVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gaW1nPVwiZWRpdFwiIGNvbG9yPVwiY3VycmVudENvbG9yXCIgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5hY3Rpb25CdXR0b259XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnZGVsZXRlLXBsYWNlLW5hbWUnLCB7IGxuZzogbGFuZywgZmF2b3VyaXRlIH0pfVxuICAgICAgICAgIG9uQ2xpY2s9e29uRGVsZXRlfVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gaW1nPVwidHJhc2hcIiBjb2xvcj1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9GbGV4Um93PlxuICAgIDwvbGk+XG4gICk7XG59XG5cbkZhdm91cml0ZUxpc3RJdGVtLnByb3BUeXBlcyA9IHtcbiAgZmF2b3VyaXRlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgYWRkcmVzczogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBzZWxlY3RlZEljb25JZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgfSkuaXNSZXF1aXJlZCxcbiAgbGFuZzogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBvbkVkaXQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uRGVsZXRlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBvbk1vdmVVcDogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW92ZURvd246IFByb3BUeXBlcy5mdW5jLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRmF2b3VyaXRlTGlzdEl0ZW07XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCc7XG5pbXBvcnQgeyBSZWFjdFNvcnRhYmxlIH0gZnJvbSAncmVhY3Qtc29ydGFibGVqcyc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvaXNFbXB0eSc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gvaXNFcXVhbCc7XG5pbXBvcnQgb21pdCBmcm9tICdsb2Rhc2gvb21pdCc7XG5pbXBvcnQgeyBTcGlubmVyIH0gZnJvbSAnQGhzbC1maS9sb2FkaW5nLWluZGljYXRvcnMnO1xuaW1wb3J0IHsgTW9kYWwsIE1vZGFsQ29udGVudCB9IGZyb20gJ0Boc2wtZmkvZGlhbG9nJztcbmltcG9ydCBEaWFsb2dNb2RhbCBmcm9tICdAZGlnaXRyYW5zaXQtY29tcG9uZW50L2RpZ2l0cmFuc2l0LWNvbXBvbmVudC1kaWFsb2ctbW9kYWwnO1xuaW1wb3J0IEZhdm91cml0ZUxpc3RJdGVtLCB7XG4gIERSQUdfSEFORExFX0NMQVNTLFxufSBmcm9tICcuL2hlbHBlcnMvRmF2b3VyaXRlTGlzdEl0ZW0nO1xuaW1wb3J0IGkxOG4gZnJvbSAnLi9oZWxwZXJzL2kxOG4nO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL2hlbHBlcnMvc3R5bGVzLnNjc3MnO1xuXG4vKipcbiAqIEEgZGlhbG9nIGZvciByZW9yZGVyaW5nLCBlZGl0aW5nIGFuZCBkZWxldGluZyBmYXZvdXJpdGUgcGxhY2VzLCBidWlsdCBvblxuICogdGhlIEhTTCBkZXNpZ24gc3lzdGVtJ3MgTW9kYWwuIENvbG9ycywgdHlwb2dyYXBoeSBhbmQgdGhlIG1vYmlsZS9kZXNrdG9wXG4gKiBsYXlvdXQgYXJlIGhhbmRsZWQgYnkgdGhlIGRlc2lnbiBzeXN0ZW0sIHNvIHRoZSBkaWFsb2cgZm9sbG93cyB0aGUgYWN0aXZlXG4gKiBkZXBsb3ltZW50J3MgdGhlbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIDxGYXZvdXJpdGVFZGl0aW5nTW9kYWxcbiAqICAgaXNNb2RhbE9wZW49e21vZGFsT3Blbn1cbiAqICAgaGFuZGxlQ2xvc2U9e2hhbmRsZUNsb3NlfVxuICogICBmYXZvdXJpdGVzPXtmYXZvdXJpdGVzfVxuICogICB1cGRhdGVGYXZvdXJpdGVzPXtvblVwZGF0ZUZhdm91cml0ZXN9XG4gKiAgIGRlbGV0ZUZhdm91cml0ZT17b25EZWxldGVGYXZvdXJpdGV9XG4gKiAgIG9uRWRpdFNlbGVjdGVkPXtvbkVkaXRTZWxlY3RlZH1cbiAqICAgaXNMb2FkaW5nPXtmYWxzZX1cbiAqICAgbGFuZz1cImZpXCJcbiAqIC8+XG4gKi9cbmZ1bmN0aW9uIEZhdm91cml0ZUVkaXRpbmdNb2RhbCh7XG4gIGlzTW9kYWxPcGVuLFxuICBoYW5kbGVDbG9zZSxcbiAgdXBkYXRlRmF2b3VyaXRlcyxcbiAgZGVsZXRlRmF2b3VyaXRlLFxuICBvbkVkaXRTZWxlY3RlZCxcbiAgZmF2b3VyaXRlcyxcbiAgaXNMb2FkaW5nLFxuICBsYW5nID0gJ2ZpJyxcbn0pIHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigndHJhbnNsYXRpb24nLCB7IGkxOG4gfSk7XG4gIGNvbnN0IFtzb3VyY2UsIHNldFNvdXJjZV0gPSB1c2VTdGF0ZShmYXZvdXJpdGVzKTtcbiAgY29uc3QgW3Jlb3JkZXJlZCwgc2V0UmVvcmRlcmVkXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbc2VsZWN0ZWRGYXZvdXJpdGUsIHNldFNlbGVjdGVkRmF2b3VyaXRlXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBwcmV2aW91c0Zhdm91cml0ZXMgPSB1c2VSZWYoZmF2b3VyaXRlcyk7XG5cbiAgLy8gRHJvcCB0aGUgbG9jYWwgb3JkZXIgd2hlbiB0aGUgZmF2b3VyaXRlcyBjaGFuZ2UgZnJvbSBvdXRzaWRlXG4gIGlmICghaXNFcXVhbChzb3VyY2UsIGZhdm91cml0ZXMpKSB7XG4gICAgc2V0U291cmNlKGZhdm91cml0ZXMpO1xuICAgIHNldFJlb3JkZXJlZChudWxsKTtcbiAgfVxuICBjb25zdCBpdGVtcyA9IHJlb3JkZXJlZCB8fCBmYXZvdXJpdGVzO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgcHJldmlvdXNGYXZvdXJpdGVzLmN1cnJlbnQgIT09IGZhdm91cml0ZXMgJiZcbiAgICAgICFpc0VxdWFsKHByZXZpb3VzRmF2b3VyaXRlcy5jdXJyZW50LCBmYXZvdXJpdGVzKSAmJlxuICAgICAgaXNFbXB0eShmYXZvdXJpdGVzKVxuICAgICkge1xuICAgICAgaGFuZGxlQ2xvc2UoKTtcbiAgICB9XG4gICAgcHJldmlvdXNGYXZvdXJpdGVzLmN1cnJlbnQgPSBmYXZvdXJpdGVzO1xuICB9LCBbZmF2b3VyaXRlcywgaGFuZGxlQ2xvc2VdKTtcblxuICBjb25zdCBtb3ZlID0gKGluZGV4LCBkaXJlY3Rpb24pID0+IHtcbiAgICBjb25zdCBjb3B5ID0gWy4uLml0ZW1zXTtcbiAgICBbY29weVtpbmRleF0sIGNvcHlbaW5kZXggKyBkaXJlY3Rpb25dXSA9IFtcbiAgICAgIGNvcHlbaW5kZXggKyBkaXJlY3Rpb25dLFxuICAgICAgY29weVtpbmRleF0sXG4gICAgXTtcbiAgICBzZXRSZW9yZGVyZWQoY29weSk7XG4gIH07XG5cbiAgLy8gUmVhY3RTb3J0YWJsZSBhbHNvIGNhbGxzIHNldExpc3Qgb24gbW91bnQgYW5kIG9uIHNlbGVjdGlvbiBjaGFuZ2VzIHdpdGhvdXQgcmVvcmRlcmluZ1xuICBjb25zdCBzZXRMaXN0ID0gbmV3TGlzdCA9PiB7XG4gICAgY29uc3Qgc2FtZU9yZGVyID1cbiAgICAgIG5ld0xpc3QubGVuZ3RoID09PSBpdGVtcy5sZW5ndGggJiZcbiAgICAgIG5ld0xpc3QuZXZlcnkoKGl0ZW0sIGkpID0+IGl0ZW0uZmF2b3VyaXRlSWQgPT09IGl0ZW1zW2ldLmZhdm91cml0ZUlkKTtcbiAgICBpZiAoIXNhbWVPcmRlcikge1xuICAgICAgc2V0UmVvcmRlcmVkKG5ld0xpc3QpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjbG9zZU1vZGFsID0gKCkgPT4ge1xuICAgIGhhbmRsZUNsb3NlKCk7XG4gICAgY29uc3Qgb21pdHRlZCA9IGl0ZW1zLm1hcChpdGVtID0+IG9taXQoaXRlbSwgWydjaG9zZW4nLCAnc2VsZWN0ZWQnXSkpO1xuICAgIGlmICghaXNFcXVhbChvbWl0dGVkLCBmYXZvdXJpdGVzKSkge1xuICAgICAgdXBkYXRlRmF2b3VyaXRlcyhvbWl0dGVkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY2xvc2VEZWxldGVEaWFsb2cgPSAoKSA9PiBzZXRTZWxlY3RlZEZhdm91cml0ZShudWxsKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8RGlhbG9nTW9kYWxcbiAgICAgICAgaGVhZGVyVGV4dD17dCgnZGVsZXRlLXBsYWNlLWhlYWRlcicsIHsgbG5nOiBsYW5nIH0pfVxuICAgICAgICBoYW5kbGVDbG9zZT17KCkgPT4ge1xuICAgICAgICAgIGNsb3NlRGVsZXRlRGlhbG9nKCk7XG4gICAgICAgICAgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgfX1cbiAgICAgICAgaXNNb2RhbE9wZW49e3NlbGVjdGVkRmF2b3VyaXRlICE9PSBudWxsfVxuICAgICAgICBkaWFsb2dDb250ZW50PXtcbiAgICAgICAgICBzZWxlY3RlZEZhdm91cml0ZVxuICAgICAgICAgICAgPyBgJHtzZWxlY3RlZEZhdm91cml0ZS5uYW1lfTogJHtzZWxlY3RlZEZhdm91cml0ZS5hZGRyZXNzfWBcbiAgICAgICAgICAgIDogJydcbiAgICAgICAgfVxuICAgICAgICBwcmltYXJ5QnV0dG9uVGV4dD17dCgnZGVsZXRlJywgeyBsbmc6IGxhbmcgfSl9XG4gICAgICAgIHByaW1hcnlCdXR0b25PbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgZGVsZXRlRmF2b3VyaXRlKHNlbGVjdGVkRmF2b3VyaXRlKTtcbiAgICAgICAgICBjbG9zZURlbGV0ZURpYWxvZygpO1xuICAgICAgICB9fVxuICAgICAgICBzZWNvbmRhcnlCdXR0b25UZXh0PXt0KCdjYW5jZWwnLCB7IGxuZzogbGFuZyB9KX1cbiAgICAgICAgc2Vjb25kYXJ5QnV0dG9uT25DbGljaz17Y2xvc2VEZWxldGVEaWFsb2d9XG4gICAgICAgIGxhbmc9e2xhbmd9XG4gICAgICAvPlxuICAgICAgPE1vZGFsXG4gICAgICAgIG9wZW49e2lzTW9kYWxPcGVuICYmIHNlbGVjdGVkRmF2b3VyaXRlID09PSBudWxsfVxuICAgICAgICBvbk9wZW5DaGFuZ2U9e29wZW4gPT4ge1xuICAgICAgICAgIGlmICghb3Blbikge1xuICAgICAgICAgICAgY2xvc2VNb2RhbCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPE1vZGFsQ29udGVudFxuICAgICAgICAgIGxhbmc9e2xhbmd9XG4gICAgICAgICAgdGl0bGU9e3QoJ2VkaXQtcGxhY2VzJywgeyBsbmc6IGxhbmcgfSl9XG4gICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMubW9kYWxDb250ZW50fVxuICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e3VuZGVmaW5lZH1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMubGlzdENvbnRhaW5lcn0+XG4gICAgICAgICAgICA8UmVhY3RTb3J0YWJsZVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5saXN0fVxuICAgICAgICAgICAgICB0YWc9XCJ1bFwiXG4gICAgICAgICAgICAgIGxpc3Q9e2l0ZW1zfVxuICAgICAgICAgICAgICBzZXRMaXN0PXtzZXRMaXN0fVxuICAgICAgICAgICAgICBhbmltYXRpb249ezIwMH1cbiAgICAgICAgICAgICAgaGFuZGxlPXtgLiR7RFJBR19IQU5ETEVfQ0xBU1N9YH1cbiAgICAgICAgICAgICAgZm9yY2VGYWxsYmFja1xuICAgICAgICAgICAgICBnaG9zdENsYXNzPXtzdHlsZXMuZ2hvc3R9XG4gICAgICAgICAgICAgIGZhbGxiYWNrQ2xhc3M9e3N0eWxlcy5mYWxsYmFja31cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2l0ZW1zLm1hcCgoZmF2b3VyaXRlLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgIDxGYXZvdXJpdGVMaXN0SXRlbVxuICAgICAgICAgICAgICAgICAga2V5PXtmYXZvdXJpdGUuZmF2b3VyaXRlSWR9XG4gICAgICAgICAgICAgICAgICBmYXZvdXJpdGU9e2Zhdm91cml0ZX1cbiAgICAgICAgICAgICAgICAgIGxhbmc9e2xhbmd9XG4gICAgICAgICAgICAgICAgICBvbk1vdmVVcD17aW5kZXggPiAwID8gKCkgPT4gbW92ZShpbmRleCwgLTEpIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgIG9uTW92ZURvd249e1xuICAgICAgICAgICAgICAgICAgICBpbmRleCA8IGl0ZW1zLmxlbmd0aCAtIDEgPyAoKSA9PiBtb3ZlKGluZGV4LCAxKSA6IG51bGxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG9uRWRpdD17KCkgPT4gb25FZGl0U2VsZWN0ZWQoZmF2b3VyaXRlKX1cbiAgICAgICAgICAgICAgICAgIG9uRGVsZXRlPXsoKSA9PiBzZXRTZWxlY3RlZEZhdm91cml0ZShmYXZvdXJpdGUpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9SZWFjdFNvcnRhYmxlPlxuICAgICAgICAgICAge2lzTG9hZGluZyAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMub3ZlcmxheX0+XG4gICAgICAgICAgICAgICAgPFNwaW5uZXIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L01vZGFsQ29udGVudD5cbiAgICAgIDwvTW9kYWw+XG4gICAgPC8+XG4gICk7XG59XG5cbkZhdm91cml0ZUVkaXRpbmdNb2RhbC5wcm9wVHlwZXMgPSB7XG4gIC8qKiBSZXF1aXJlZC4gV2hldGhlciB0aGUgZGlhbG9nIGlzIG9wZW4uXG4gICAqIEB0eXBlIHtib29sZWFufSAqL1xuICBpc01vZGFsT3BlbjogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgLyoqIFJlcXVpcmVkLiBDbG9zZSBtb2RhbC5cbiAgICogQHR5cGUge2Z1bmN0aW9ufSAqL1xuICBoYW5kbGVDbG9zZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgLyoqIFJlcXVpcmVkLiBDYWxsZWQgd2l0aCB0aGUgcmVvcmRlcmVkIGZhdm91cml0ZXMgd2hlbiB0aGUgZGlhbG9nIGlzIGNsb3NlZC5cbiAgICogQHR5cGUge2Z1bmN0aW9ufSAqL1xuICB1cGRhdGVGYXZvdXJpdGVzOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKiogUmVxdWlyZWQuIENhbGxlZCB3aXRoIHRoZSBmYXZvdXJpdGUgdGhlIHVzZXIgY29uZmlybWVkIGRlbGV0aW5nLlxuICAgKiBAdHlwZSB7ZnVuY3Rpb259ICovXG4gIGRlbGV0ZUZhdm91cml0ZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgLyoqIFJlcXVpcmVkLiBGdW5jdGlvbiB0aGF0IHRha2VzIHNlbGVjdGVkIGZhdm91cml0ZSBvYmplY3QgYXMgcGFyYW1ldGVyLlxuICAgKiBAdHlwZSB7ZnVuY3Rpb259ICovXG4gIG9uRWRpdFNlbGVjdGVkOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKiogUmVxdWlyZWQuIFdoZXRoZXIgYSBzYXZlIGlzIGluIHByb2dyZXNzOyBzaG93cyBhIHNwaW5uZXIgb3ZlciB0aGUgbGlzdC5cbiAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gIGlzTG9hZGluZzogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgLyoqIFJlcXVpcmVkLlxuICAgKiBAdHlwZSB7YXJyYXk8b2JqZWN0Pn1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGd0ZnNJZFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZ2lkXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsYXRcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGxvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0ZWRJY29uSWRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGZhdm91cml0ZUlkXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYXllclxuICAgKi9cbiAgZmF2b3VyaXRlczogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBhZGRyZXNzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgZ3Rmc0lkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgZ2lkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgbGF0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgbG9uOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIHNlbGVjdGVkSWNvbklkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgZmF2b3VyaXRlSWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBsYXllcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB9KSxcbiAgKS5pc1JlcXVpcmVkLFxuICAvKiogT3B0aW9uYWwuIExhbmd1YWdlLCBmaSwgZW4gb3Igc3YuIERlZmF1bHRzIHRvIGZpLlxuICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICBsYW5nOiBQcm9wVHlwZXMuc3RyaW5nLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRmF2b3VyaXRlRWRpdGluZ01vZGFsO1xuIl0sIm5hbWVzIjpbImdldExvY2FsYWRtaW4iLCJzdWdnZXN0aW9uIiwibG9jYWxhZG1pbiIsImFkZHJlc3MiLCJsYXN0SW5kZXhPZiIsImxlbmd0aCIsInN1YnN0cmluZyIsImdldFN0b3BDb2RlIiwiaWQiLCJjb2RlIiwidW5kZWZpbmVkIiwiaW5kZXhPZiIsImZvcm1hdEZhdm91cml0ZVBsYWNlTGFiZWwiLCJuYW1lIiwic3BsaXQiLCJyZXBsYWNlIiwiUmVnRXhwIiwiZXNjYXBlUmVnRXhwIiwibWVtb2l6ZSIsInBsYWluIiwibGF5ZXIiLCJsYWJlbElkIiwic2hvcnROYW1lIiwiZ3Rmc0lkIiwibW9kZSIsInRvTG93ZXJDYXNlIiwibG9uZ05hbWUiLCJhZ2VuY3kiLCJsYWJlbCIsIml0ZW0iLCJpIiwiY2xvbmVEZWVwIiwidHJhbnNsYXRpb25zIiwiZGUiLCJ0cmFuc2xhdGlvbiIsImNhbmNlbCIsImRlbGV0ZSIsImVuIiwiZG93biIsInVwIiwiZmkiLCJwbCIsInN2IiwiaTE4biIsImNyZWF0ZUluc3RhbmNlIiwiZmFsbGJhY2tMbmciLCJyZXNvdXJjZXMiLCJkZWZhdWx0TlMiLCJyZWFjdCIsInVzZVN1c3BlbnNlIiwiaW5pdCIsIkRSQUdfSEFORExFX0NMQVNTIiwic3R5bGVzIiwiZHJhZ0hhbmRsZSIsImdldEljb25JZCIsInNlbGVjdGVkSWNvbklkIiwicHJlZml4UG9zIiwiRmF2b3VyaXRlTGlzdEl0ZW0iLCJmYXZvdXJpdGUiLCJsYW5nIiwib25Nb3ZlVXAiLCJvbk1vdmVEb3duIiwib25FZGl0Iiwib25EZWxldGUiLCJ0IiwidXNlVHJhbnNsYXRpb24iLCJpY29uSWQiLCJfanN4cyIsImNsYXNzTmFtZSIsImNoaWxkcmVuIiwiX2pzeCIsInR5cGUiLCJhcnJvdyIsImxuZyIsIm9uQ2xpY2siLCJlbGxpcHNpcyIsIkljb24iLCJpbWciLCJjb2xvciIsInBsYWNlSWNvbiIsIkZsZXhDb2x1bW4iLCJ0ZXh0IiwiVGV4dCIsInZhcmlhbnQiLCJhcyIsIkZsZXhSb3ciLCJhbGlnbkl0ZW1zIiwiZmxleFNocmluayIsImFjdGlvbkJ1dHRvbiIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInNoYXBlIiwic3RyaW5nIiwiaXNSZXF1aXJlZCIsImZ1bmMiLCJGYXZvdXJpdGVFZGl0aW5nTW9kYWwiLCJpc01vZGFsT3BlbiIsImhhbmRsZUNsb3NlIiwidXBkYXRlRmF2b3VyaXRlcyIsImRlbGV0ZUZhdm91cml0ZSIsIm9uRWRpdFNlbGVjdGVkIiwiZmF2b3VyaXRlcyIsImlzTG9hZGluZyIsInNvdXJjZSIsInNldFNvdXJjZSIsInVzZVN0YXRlIiwicmVvcmRlcmVkIiwic2V0UmVvcmRlcmVkIiwic2VsZWN0ZWRGYXZvdXJpdGUiLCJzZXRTZWxlY3RlZEZhdm91cml0ZSIsInByZXZpb3VzRmF2b3VyaXRlcyIsInVzZVJlZiIsImlzRXF1YWwiLCJpdGVtcyIsInVzZUVmZmVjdCIsImN1cnJlbnQiLCJpc0VtcHR5IiwibW92ZSIsImluZGV4IiwiZGlyZWN0aW9uIiwiY29weSIsInNldExpc3QiLCJuZXdMaXN0Iiwic2FtZU9yZGVyIiwiZXZlcnkiLCJmYXZvdXJpdGVJZCIsImNsb3NlTW9kYWwiLCJvbWl0dGVkIiwibWFwIiwib21pdCIsImNsb3NlRGVsZXRlRGlhbG9nIiwiX0ZyYWdtZW50IiwiRGlhbG9nTW9kYWwiLCJoZWFkZXJUZXh0IiwiZGlhbG9nQ29udGVudCIsInByaW1hcnlCdXR0b25UZXh0IiwicHJpbWFyeUJ1dHRvbk9uQ2xpY2siLCJzZWNvbmRhcnlCdXR0b25UZXh0Iiwic2Vjb25kYXJ5QnV0dG9uT25DbGljayIsIk1vZGFsIiwib3BlbiIsIm9uT3BlbkNoYW5nZSIsIk1vZGFsQ29udGVudCIsInRpdGxlIiwibW9kYWxDb250ZW50IiwibGlzdENvbnRhaW5lciIsIlJlYWN0U29ydGFibGUiLCJsaXN0IiwidGFnIiwiYW5pbWF0aW9uIiwiaGFuZGxlIiwiZm9yY2VGYWxsYmFjayIsImdob3N0Q2xhc3MiLCJnaG9zdCIsImZhbGxiYWNrQ2xhc3MiLCJmYWxsYmFjayIsIm92ZXJsYXkiLCJTcGlubmVyIiwiYm9vbCIsImFycmF5T2YiLCJnaWQiLCJsYXQiLCJudW1iZXIiLCJsb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQU1BO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLE1BQU1BLGFBQWEsR0FBR0MsVUFBVSxJQUM5QkEsVUFBVSxDQUFDQyxVQUFVLElBQ3JCRCxVQUFVLENBQUNDLFVBQVUsSUFD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
507
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZGV2ZWxvcG1lbnQuY2pzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kaWdpdHJhbnNpdC1zZWFyY2gtdXRpbC9wYWNrYWdlcy9kaWdpdHJhbnNpdC1zZWFyY2gtdXRpbC11bmlxLWJ5LWxhYmVsL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWluamVjdC9kaXN0L3N0eWxlLWluamVjdC5lcy5qcyIsIi4uL3NyYy9oZWxwZXJzL3RyYW5zbGF0aW9ucy5qcyIsIi4uL3NyYy9oZWxwZXJzL2kxOG4uanMiLCIuLi9zcmMvaGVscGVycy9GYXZvdXJpdGVMaXN0SXRlbS5qc3giLCIuLi9zcmMvaW5kZXguanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB1bmlxV2l0aCBmcm9tICdsb2Rhc2gvdW5pcVdpdGgnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAnbG9kYXNoL21lbW9pemUnO1xuaW1wb3J0IGVzY2FwZVJlZ0V4cCBmcm9tICdsb2Rhc2gvZXNjYXBlUmVnRXhwJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XG5cbi8qKlxuICogTG9jYXRpb24gcHJvcGVydGllcy5cbiAqIEB0eXBlZGVmIHtMb2NhdGlvblByb3BlcnRpZXN9XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbGF5ZXIgU3VnZ2VzdGlvbiBsYXllci5cbiAqIEBwcm9wZXJ0eSB7bGF0fSBbbnVtYmVyXVxuICogQHByb3BlcnR5IHtsb259IFtudW1iZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWRkcmVzcyBBZGRyZXNzLlxuICovXG5cbi8qKlxuICogUmV0dXJucyBsb2NhbGFkbWluIChjaXR5IG5hbWUpIGZvciBzdWdnZXN0aW9uc1xuICpcbiAqIEBuYW1lIGdldExvY2FsYWRtaW5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdWdnZXN0aW9uIHN1Z2dlc3Rpb24ncyBwcm9wZXJ0aWVzIGZyb20gZ2VvY29kaW5nIG9yIGEgZmF2b3VyaXRlIHN0b3Avc3RhdGlvbi5cbiAqIEV4cGVjdHMgbGFzdCBwYXJ0IG9mIGFuIGFkZHJlc3MgKGFmdGVyICcsJykgdG8gY29udGFpbiB0aGUgY2l0eSBuYW1lIG9mIHRoZSBzdWdnZXN0aW9uIGxvY2F0aW9uLlxuICogQHJldHVybnMge1N0cmluZ30gIENpdHkgbmFtZSBvciBlbXB0eSBzdHJpbmdcbiAqL1xuY29uc3QgZ2V0TG9jYWxhZG1pbiA9IHN1Z2dlc3Rpb24gPT5cbiAgc3VnZ2VzdGlvbi5sb2NhbGFkbWluIHx8XG4gIHN1Z2dlc3Rpb24ubG9jYWxhZG1pbiB8fFxuICAoc3VnZ2VzdGlvbi5hZGRyZXNzICYmXG4gICAgc3VnZ2VzdGlvbi5hZGRyZXNzLmxhc3RJbmRleE9mKCcsJykgPCBzdWdnZXN0aW9uLmFkZHJlc3MubGVuZ3RoIC0gMiAmJlxuICAgIHN1Z2dlc3Rpb24uYWRkcmVzcy5zdWJzdHJpbmcoc3VnZ2VzdGlvbi5hZGRyZXNzLmxhc3RJbmRleE9mKCcsJykgKyAyKSkgfHxcbiAgJyc7XG5cbmV4cG9ydCBjb25zdCBnZXRTdG9wQ29kZSA9ICh7IGlkLCBjb2RlIH0pID0+IHtcbiAgaWYgKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoXG4gICAgaWQgPT09IHVuZGVmaW5lZCB8fFxuICAgIHR5cGVvZiBpZC5pbmRleE9mID09PSAndW5kZWZpbmVkJyB8fFxuICAgIGlkLmluZGV4T2YoJyMnKSA9PT0gLTFcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvLyBpZCBmcm9tIHBlbGlhc1xuICByZXR1cm4gaWQuc3Vic3RyaW5nKGlkLmluZGV4T2YoJyMnKSArIDEpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdEZhdm91cml0ZVBsYWNlTGFiZWwgPSAobmFtZSwgYWRkcmVzcykgPT4gW1xuICBuYW1lIHx8IChhZGRyZXNzICYmIGFkZHJlc3Muc3BsaXQoJywnKVswXSksXG4gIHR5cGVvZiBhZGRyZXNzID09PSAnc3RyaW5nJ1xuICAgID8gYWRkcmVzcy5yZXBsYWNlKG5ldyBSZWdFeHAoYCR7ZXNjYXBlUmVnRXhwKG5hbWUpfShbICxdfCQpK2ApLCAnJylcbiAgICA6ICcnLFxuXTtcblxuLyoqXG4gKiBGb3JtYXQgc3VnZ2VzdGlvbi1wYWlyIFtuYW1lLCBhZGRyZXNzXSBieSBgc3VnZ2VzdGlvbi5sYXllcmAuXG4gKlxuICogQG5hbWUgZ2V0TmFtZUxhYmVsXG4gKiBAcGFyYW0ge0xvY2F0aW9uUHJvcGVydGllc30gc3VnZ2VzdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbcGxhaW5dXG4gKlxuICogQHJldHVybnMge0FycmF5LjxzdHJpbmc+fSBGb3JtYXR0ZWQgbGFiZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXROYW1lTGFiZWwgPSBtZW1vaXplKFxuICAoc3VnZ2VzdGlvbiwgcGxhaW4gPSBmYWxzZSkgPT4ge1xuICAgIHN3aXRjaCAoc3VnZ2VzdGlvbi5sYXllcikge1xuICAgICAgY2FzZSAnY3VycmVudFBvc2l0aW9uJzpcbiAgICAgICAgcmV0dXJuIFtzdWdnZXN0aW9uLmxhYmVsSWQsIHN1Z2dlc3Rpb24uYWRkcmVzc107XG4gICAgICBjYXNlICdzZWxlY3RGcm9tTWFwJzpcbiAgICAgIGNhc2UgJ293bkxvY2F0aW9ucyc6XG4gICAgICBjYXNlICdiYWNrJzpcbiAgICAgICAgcmV0dXJuIFtzdWdnZXN0aW9uLmxhYmVsSWRdO1xuICAgICAgY2FzZSAnZmF2b3VyaXRlUGxhY2UnOlxuICAgICAgICByZXR1cm4gZm9ybWF0RmF2b3VyaXRlUGxhY2VMYWJlbChzdWdnZXN0aW9uLm5hbWUsIHN1Z2dlc3Rpb24uYWRkcmVzcyk7XG4gICAgICBjYXNlICdmYXZvdXJpdGVWZWhpY2xlUmVudGFsU3RhdGlvbic6XG4gICAgICBjYXNlICdiaWtlc3RhdGlvbic6XG4gICAgICAgIHJldHVybiBbc3VnZ2VzdGlvbi5uYW1lXTtcbiAgICAgIGNhc2UgJ2Zhdm91cml0ZVJvdXRlJzpcbiAgICAgIGNhc2UgJ3JvdXRlLUJVUyc6XG4gICAgICBjYXNlICdyb3V0ZS1UUkFNJzpcbiAgICAgIGNhc2UgJ3JvdXRlLVJBSUwnOlxuICAgICAgY2FzZSAncm91dGUtU1VCV0FZJzpcbiAgICAgIGNhc2UgJ3JvdXRlLUZFUlJZJzpcbiAgICAgIGNhc2UgJ3JvdXRlLUZVTklDVUxBUic6XG4gICAgICBjYXNlICdyb3V0ZS1BSVJQTEFORSc6XG4gICAgICAgIHJldHVybiAhcGxhaW4gJiYgc3VnZ2VzdGlvbi5zaG9ydE5hbWVcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5ndGZzSWQsXG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb24ubW9kZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICBzdWdnZXN0aW9uLmxvbmdOYW1lLFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW1xuICAgICAgICAgICAgICBzdWdnZXN0aW9uLnNob3J0TmFtZSxcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5sb25nTmFtZSxcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5hZ2VuY3kgPyBzdWdnZXN0aW9uLmFnZW5jeS5uYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgXTtcbiAgICAgIGNhc2UgJ3ZlbnVlJzpcbiAgICAgIGNhc2UgJ2FkZHJlc3MnOlxuICAgICAgY2FzZSAnc3RyZWV0JzpcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBzdWdnZXN0aW9uLm5hbWUsXG4gICAgICAgICAgc3VnZ2VzdGlvbi5sYWJlbC5yZXBsYWNlKFxuICAgICAgICAgICAgbmV3IFJlZ0V4cChgJHtlc2NhcGVSZWdFeHAoc3VnZ2VzdGlvbi5uYW1lKX0oLCk/KCApP2ApLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIGNhc2UgJ2Zhdm91cml0ZVN0b3AnOlxuICAgICAgY2FzZSAnc3RvcCc6XG4gICAgICAgIHJldHVybiBwbGFpblxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICBzdWdnZXN0aW9uLm5hbWUgfHxcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uLmxhYmVsIHx8XG4gICAgICAgICAgICAgICAgKHN1Z2dlc3Rpb24uYWRkcmVzcyAmJiBzdWdnZXN0aW9uLmFkZHJlc3Muc3BsaXQoJywnKVswXSksXG4gICAgICAgICAgICAgIGdldExvY2FsYWRtaW4oc3VnZ2VzdGlvbiksXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5pZCxcbiAgICAgICAgICAgICAgZ2V0U3RvcENvZGUoc3VnZ2VzdGlvbiksXG4gICAgICAgICAgICAgIGdldExvY2FsYWRtaW4oc3VnZ2VzdGlvbiksXG4gICAgICAgICAgICBdO1xuICAgICAgY2FzZSAnZmF2b3VyaXRlU3RhdGlvbic6XG4gICAgICBjYXNlICdzdGF0aW9uJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgc3VnZ2VzdGlvbi5uYW1lIHx8XG4gICAgICAgICAgICBzdWdnZXN0aW9uLmxhYmVsIHx8XG4gICAgICAgICAgICAoc3VnZ2VzdGlvbi5hZGRyZXNzICYmIHN1Z2dlc3Rpb24uYWRkcmVzcy5zcGxpdCgnLCcpWzBdKSxcbiAgICAgICAgICBnZXRMb2NhbGFkbWluKHN1Z2dlc3Rpb24pLFxuICAgICAgICBdO1xuICAgIH1cbiAgfSxcbiAgKGl0ZW0sIHBsYWluKSA9PiB7XG4gICAgY29uc3QgaSA9IGNsb25lRGVlcChpdGVtKTtcbiAgICBpLnBsYWluID0gcGxhaW47XG4gICAgcmV0dXJuIGk7XG4gIH0sXG4pO1xuXG4vKipcbiAqIENoZWNrcyB0aGF0IGZlYXR1cmVzIGFyZSB1bmlxdWUgYnkgbGFiZWxcbiAqXG4gKiBAbmFtZSB1bmlxQnlMYWJlbFxuICogQHBhcmFtIHtBcnJheX0gZmVhdHVyZXMgQXJyYXkgb2YgZmVhdHVyZXNcbiAqIEByZXR1cm5zIHtBcnJheX0gIEFycmF5IG9mIHVuaXF1ZSBmZWF0dXJlc1xuICogQGV4YW1wbGVcbiAqIGRpZ2l0cmFuc2l0LXNlYXJjaC11dGlsLnVuaXFCeUxhYmVsKGZlYXR1cmVzKTtcbiAqIC8vPSBBcnJheSgyKVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1bmlxQnlMYWJlbChmZWF0dXJlcykge1xuICByZXR1cm4gdW5pcVdpdGgoZmVhdHVyZXMsIChmZWF0MSwgZmVhdDIpID0+IHtcbiAgICBpZiAoZmVhdDEudHlwZSA9PT0gJ0Z1dHVyZVJvdXRlJyB8fCBmZWF0Mi50eXBlID09PSAnRnV0dXJlUm91dGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBpc0VxdWFsKGdldE5hbWVMYWJlbChmZWF0MS5wcm9wZXJ0aWVzKSwgZ2V0TmFtZUxhYmVsKGZlYXQyLnByb3BlcnRpZXMpKSAmJlxuICAgICAgZmVhdDEucHJvcGVydGllcy5sYXllciA9PT0gZmVhdDIucHJvcGVydGllcy5sYXllclxuICAgICk7XG4gIH0pO1xufVxuIiwiZnVuY3Rpb24gc3R5bGVJbmplY3QoY3NzLCByZWYpIHtcbiAgaWYgKCByZWYgPT09IHZvaWQgMCApIHJlZiA9IHt9O1xuICB2YXIgaW5zZXJ0QXQgPSByZWYuaW5zZXJ0QXQ7XG5cbiAgaWYgKCFjc3MgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgeyByZXR1cm47IH1cblxuICB2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG5cbiAgaWYgKGluc2VydEF0ID09PSAndG9wJykge1xuICAgIGlmIChoZWFkLmZpcnN0Q2hpbGQpIHtcbiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBoZWFkLmZpcnN0Q2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIH1cblxuICBpZiAoc3R5bGUuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBzdHlsZUluamVjdDtcbiIsIi8qIGVzbGludCBzb3J0LWtleXM6IFwiZXJyb3JcIiAqL1xuY29uc3QgdHJhbnNsYXRpb25zID0ge1xuICBkZToge1xuICAgIHRyYW5zbGF0aW9uOiB7XG4gICAgICBjYW5jZWw6ICdBYmJyZWNoZW4nLFxuICAgICAgZGVsZXRlOiAnTMO2c2NoZW4nLFxuICAgICAgJ2RlbGV0ZS1wbGFjZS1oZWFkZXInOiAnV29sbGVuIFNpZSBkZW4gRmF2b3JpdGVuIGzDtnNjaGVuPycsXG4gICAgICAnZGVsZXRlLXBsYWNlLW5hbWUnOiAnTMO2c2NoZSBGYXZvcml0OiB7e2Zhdm91cml0ZS5uYW1lfX0nLFxuICAgICAgJ2VkaXQtcGxhY2UtbmFtZSc6ICdCZWFyYmVpdGUgRmF2b3JpdDoge3tmYXZvdXJpdGUubmFtZX19JyxcbiAgICAgICdlZGl0LXBsYWNlcyc6ICdCZWFyYmVpdGUgRmF2b3JpdGVuJyxcbiAgICB9LFxuICB9LFxuICBlbjoge1xuICAgIHRyYW5zbGF0aW9uOiB7XG4gICAgICBjYW5jZWw6ICdDYW5jZWwnLFxuICAgICAgZGVsZXRlOiAnRGVsZXRlJyxcbiAgICAgICdkZWxldGUtcGxhY2UtaGVhZGVyJzogJ0RvIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgcGxhY2U/JyxcbiAgICAgICdkZWxldGUtcGxhY2UtbmFtZSc6ICdEZWxldGUgcGxhY2U6IHt7ZmF2b3VyaXRlLm5hbWV9fScsXG4gICAgICBkb3duOiAnTW92ZSBmYXZvdXJpdGUgZG93bicsXG4gICAgICAnZWRpdC1wbGFjZS1uYW1lJzogJ0VkaXQgcGxhY2U6IHt7ZmF2b3VyaXRlLm5hbWV9fScsXG4gICAgICAnZWRpdC1wbGFjZXMnOiAnRWRpdCBwbGFjZXMnLFxuICAgICAgdXA6ICdNb3ZlIGZhdm91cml0ZSB1cCcsXG4gICAgfSxcbiAgfSxcbiAgZmk6IHtcbiAgICB0cmFuc2xhdGlvbjoge1xuICAgICAgY2FuY2VsOiAnUGVydXV0YScsXG4gICAgICBkZWxldGU6ICdQb2lzdGEnLFxuICAgICAgJ2RlbGV0ZS1wbGFjZS1oZWFkZXInOiAnSGFsdWF0a28gcG9pc3RhYSBwYWlrYW4/JyxcbiAgICAgICdkZWxldGUtcGxhY2UtbmFtZSc6ICdQb2lzdGEgcGFpa2thOiB7e2Zhdm91cml0ZS5uYW1lfX0nLFxuICAgICAgZG93bjogJ1NpaXJyw6Qgc3Vvc2lra2lzaWphaW50aWEgYWxhc3DDpGluJyxcbiAgICAgICdlZGl0LXBsYWNlLW5hbWUnOiAnTXVva2thYSBwYWlra2FhOiB7e2Zhdm91cml0ZS5uYW1lfX0nLFxuICAgICAgJ2VkaXQtcGxhY2VzJzogJ011b2trYWEgcGFpa2tvamEnLFxuICAgICAgdXA6ICdTaWlycsOkIHN1b3Npa2tpc2lqYWludGlhIHlsw7Zww6RpbicsXG4gICAgfSxcbiAgfSxcbiAgcGw6IHtcbiAgICB0cmFuc2xhdGlvbjoge1xuICAgICAgY2FuY2VsOiAnQW51bHVqJyxcbiAgICAgIGRlbGV0ZTogJ1VzdcWEJyxcbiAgICAgICdkZWxldGUtcGxhY2UtaGVhZGVyJzogJ0N6eSBuYSBwZXdubyBjaGNlc3ogdXN1bsSFxIcgdG8gbWllanNjZT8nLFxuICAgICAgJ2RlbGV0ZS1wbGFjZS1uYW1lJzogJ1VzdcWEIG1pZWpzY2U6IHt7ZmF2b3VyaXRlLm5hbWV9fScsXG4gICAgICBkb3duOiAnUHJ6ZW5pZcWbIHVsdWJpb25lIG5pxbxlaicsXG4gICAgICAnZWRpdC1wbGFjZS1uYW1lJzogJ0VkeXR1aiBtaWVqc2NlOiB7e2Zhdm91cml0ZS5uYW1lfX0nLFxuICAgICAgJ2VkaXQtcGxhY2VzJzogJ0VkeXR1aiBtaWVqc2NhJyxcbiAgICAgIHVwOiAnUHJ6ZW5pZcWbIHVsdWJpb25lIHd5xbxlaicsXG4gICAgfSxcbiAgfSxcbiAgc3Y6IHtcbiAgICB0cmFuc2xhdGlvbjoge1xuICAgICAgY2FuY2VsOiAnQXZicnl0JyxcbiAgICAgIGRlbGV0ZTogJ1RhIGJvcnQnLFxuICAgICAgJ2RlbGV0ZS1wbGFjZS1oZWFkZXInOiAnVmlsbCBkdSB0YSBib3J0IHBsYXRzZW4/JyxcbiAgICAgICdkZWxldGUtcGxhY2UtbmFtZSc6ICdUYSBib3J0IHBsYXRzZW46IHt7ZmF2b3VyaXRlLm5hbWV9fScsXG4gICAgICBkb3duOiAnRmx5dHRhIGZhdm9yaXRlbiBuZWTDpXQnLFxuICAgICAgJ2VkaXQtcGxhY2UtbmFtZSc6ICdFZGl0IHBsYWNlOiB7e2Zhdm91cml0ZS5uYW1lfX0nLFxuICAgICAgJ2VkaXQtcGxhY2VzJzogJ1JlZGlnZXJhIHBsYXRzZXInLFxuICAgICAgdXA6ICdGbHl0dGEgZmF2b3JpdGVuIHVwcMOldCcsXG4gICAgfSxcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRyYW5zbGF0aW9ucztcbiIsImltcG9ydCB7IGNyZWF0ZUluc3RhbmNlIH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQgdHJhbnNsYXRpb25zIGZyb20gJy4vdHJhbnNsYXRpb25zJztcblxuY29uc3QgaTE4biA9IGNyZWF0ZUluc3RhbmNlKHtcbiAgZmFsbGJhY2tMbmc6ICdmaScsXG4gIC8vIGRlYnVnOiB0cnVlLFxuICByZXNvdXJjZXM6IHRyYW5zbGF0aW9ucyxcbiAgZGVmYXVsdE5TOiAndHJhbnNsYXRpb24nLFxuICByZWFjdDoge1xuICAgIHVzZVN1c3BlbnNlOiB0cnVlLFxuICB9LFxufSk7XG5cbmkxOG4uaW5pdCgpO1xuXG5leHBvcnQgZGVmYXVsdCBpMThuO1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCc7XG5pbXBvcnQgeyBGbGV4Q29sdW1uLCBGbGV4Um93LCBUZXh0IH0gZnJvbSAnQGhzbC1maS9sYXlvdXQtcHJpbWl0aXZlcyc7XG5pbXBvcnQgeyB1c2VTb3J0YWJsZSB9IGZyb20gJ0BkbmQta2l0L3JlYWN0L3NvcnRhYmxlJztcbmltcG9ydCBJY29uIGZyb20gJ0BkaWdpdHJhbnNpdC1jb21wb25lbnQvZGlnaXRyYW5zaXQtY29tcG9uZW50LWljb24nO1xuaW1wb3J0IHsgZm9ybWF0RmF2b3VyaXRlUGxhY2VMYWJlbCB9IGZyb20gJ0BkaWdpdHJhbnNpdC1zZWFyY2gtdXRpbC9kaWdpdHJhbnNpdC1zZWFyY2gtdXRpbC11bmlxLWJ5LWxhYmVsJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9zdHlsZXMuc2Nzcyc7XG5pbXBvcnQgaTE4biBmcm9tICcuL2kxOG4nO1xuXG5jb25zdCBnZXRJY29uSWQgPSBzZWxlY3RlZEljb25JZCA9PiB7XG4gIGNvbnN0IHByZWZpeFBvcyA9IHNlbGVjdGVkSWNvbklkID8gc2VsZWN0ZWRJY29uSWQuaW5kZXhPZignaWNvbl8nKSA6IC0xO1xuICByZXR1cm4gcHJlZml4UG9zID4gMCA/IHNlbGVjdGVkSWNvbklkLnN1YnN0cmluZyhwcmVmaXhQb3MgKyA1KSA6ICdwbGFjZSc7XG59O1xuXG4vKipcbiAqIE9uZSByb3cgb2YgdGhlIGZhdm91cml0ZXMgbGlzdC4gVGhlIHZpc3VhbGx5IGhpZGRlbiBhcnJvdyBidXR0b25zIGFyZSBhXG4gKiBrZXlib2FyZCBhbHRlcm5hdGl2ZSB0byBkcmFnZ2luZy5cbiAqL1xuZnVuY3Rpb24gRmF2b3VyaXRlTGlzdEl0ZW0oe1xuICBmYXZvdXJpdGUsXG4gIGxhbmcsXG4gIG9uTW92ZVVwID0gbnVsbCxcbiAgb25Nb3ZlRG93biA9IG51bGwsXG4gIG9uRWRpdCxcbiAgb25EZWxldGUsXG4gIGluZGV4LFxufSkge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCd0cmFuc2xhdGlvbicsIHsgaTE4biB9KTtcbiAgY29uc3QgeyByZWYgfSA9IHVzZVNvcnRhYmxlKHsgaWQ6IGZhdm91cml0ZS5mYXZvdXJpdGVJZCwgaW5kZXggfSk7XG4gIGNvbnN0IGljb25JZCA9IGdldEljb25JZChmYXZvdXJpdGUuc2VsZWN0ZWRJY29uSWQpO1xuICBjb25zdCBbbmFtZSwgYWRkcmVzc10gPSBmb3JtYXRGYXZvdXJpdGVQbGFjZUxhYmVsKFxuICAgIGZhdm91cml0ZS5uYW1lLFxuICAgIGZhdm91cml0ZS5hZGRyZXNzLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPGxpIHJlZj17cmVmfSBjbGFzc05hbWU9e3N0eWxlcy5pdGVtfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuZHJhZ0hhbmRsZX0+XG4gICAgICAgIHtvbk1vdmVVcCAmJiAoXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5hcnJvd31cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ3VwJywgeyBsbmc6IGxhbmcgfSl9XG4gICAgICAgICAgICBvbkNsaWNrPXtvbk1vdmVVcH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICAmdWFycjtcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgKX1cbiAgICAgICAge29uTW92ZURvd24gJiYgKFxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuYXJyb3d9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdkb3duJywgeyBsbmc6IGxhbmcgfSl9XG4gICAgICAgICAgICBvbkNsaWNrPXtvbk1vdmVEb3dufVxuICAgICAgICAgID5cbiAgICAgICAgICAgICZkYXJyO1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICApfVxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5lbGxpcHNpc30+XG4gICAgICAgICAgPEljb24gaW1nPVwiZWxsaXBzaXNcIiBjb2xvcj1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMucGxhY2VJY29ufT5cbiAgICAgICAgICA8SWNvbiBpbWc9e2ljb25JZH0gY29sb3I9XCJjdXJyZW50Q29sb3JcIiAvPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxGbGV4Q29sdW1uIGNsYXNzTmFtZT17c3R5bGVzLnRleHR9PlxuICAgICAgICA8VGV4dCB2YXJpYW50PVwidGV4dC14cy1ib2xkXCIgYXM9XCJwXCIgY2xhc3NOYW1lPXtzdHlsZXMubmFtZX0+XG4gICAgICAgICAge25hbWV9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICAgPFRleHQgdmFyaWFudD1cInRleHQteHNcIiBhcz1cInBcIiBjb2xvcj1cIndlYWtcIiBjbGFzc05hbWU9e3N0eWxlcy5hZGRyZXNzfT5cbiAgICAgICAgICB7YWRkcmVzc31cbiAgICAgICAgPC9UZXh0PlxuICAgICAgPC9GbGV4Q29sdW1uPlxuICAgICAgPEZsZXhSb3cgYWxpZ25JdGVtcz1cImNlbnRlclwiIGZsZXhTaHJpbms9ezB9PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuYWN0aW9uQnV0dG9ufVxuICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ2VkaXQtcGxhY2UtbmFtZScsIHsgbG5nOiBsYW5nLCBmYXZvdXJpdGUgfSl9XG4gICAgICAgICAgb25DbGljaz17b25FZGl0fVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gaW1nPVwiZWRpdFwiIGNvbG9yPVwiY3VycmVudENvbG9yXCIgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5hY3Rpb25CdXR0b259XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnZGVsZXRlLXBsYWNlLW5hbWUnLCB7IGxuZzogbGFuZywgZmF2b3VyaXRlIH0pfVxuICAgICAgICAgIG9uQ2xpY2s9e29uRGVsZXRlfVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gaW1nPVwidHJhc2hcIiBjb2xvcj1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9GbGV4Um93PlxuICAgIDwvbGk+XG4gICk7XG59XG5cbkZhdm91cml0ZUxpc3RJdGVtLnByb3BUeXBlcyA9IHtcbiAgZmF2b3VyaXRlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGZhdm91cml0ZUlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgYWRkcmVzczogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBzZWxlY3RlZEljb25JZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgfSkuaXNSZXF1aXJlZCxcbiAgbGFuZzogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBvbkVkaXQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uRGVsZXRlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBvbk1vdmVVcDogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW92ZURvd246IFByb3BUeXBlcy5mdW5jLFxuICBpbmRleDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRmF2b3VyaXRlTGlzdEl0ZW07XG4iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0JztcbmltcG9ydCB7IERyYWdEcm9wUHJvdmlkZXIgfSBmcm9tICdAZG5kLWtpdC9yZWFjdCc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvaXNFbXB0eSc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gvaXNFcXVhbCc7XG5pbXBvcnQgb21pdCBmcm9tICdsb2Rhc2gvb21pdCc7XG5pbXBvcnQgeyBTcGlubmVyIH0gZnJvbSAnQGhzbC1maS9sb2FkaW5nLWluZGljYXRvcnMnO1xuaW1wb3J0IHsgTW9kYWwsIE1vZGFsQ29udGVudCB9IGZyb20gJ0Boc2wtZmkvZGlhbG9nJztcbmltcG9ydCBEaWFsb2dNb2RhbCBmcm9tICdAZGlnaXRyYW5zaXQtY29tcG9uZW50L2RpZ2l0cmFuc2l0LWNvbXBvbmVudC1kaWFsb2ctbW9kYWwnO1xuaW1wb3J0IEZhdm91cml0ZUxpc3RJdGVtIGZyb20gJy4vaGVscGVycy9GYXZvdXJpdGVMaXN0SXRlbSc7XG5pbXBvcnQgaTE4biBmcm9tICcuL2hlbHBlcnMvaTE4bic7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vaGVscGVycy9zdHlsZXMuc2Nzcyc7XG5cbi8qKlxuICogQSBkaWFsb2cgZm9yIHJlb3JkZXJpbmcsIGVkaXRpbmcgYW5kIGRlbGV0aW5nIGZhdm91cml0ZSBwbGFjZXMsIGJ1aWx0IG9uXG4gKiB0aGUgSFNMIGRlc2lnbiBzeXN0ZW0ncyBNb2RhbC4gQ29sb3JzLCB0eXBvZ3JhcGh5IGFuZCB0aGUgbW9iaWxlL2Rlc2t0b3BcbiAqIGxheW91dCBhcmUgaGFuZGxlZCBieSB0aGUgZGVzaWduIHN5c3RlbSwgc28gdGhlIGRpYWxvZyBmb2xsb3dzIHRoZSBhY3RpdmVcbiAqIGRlcGxveW1lbnQncyB0aGVtZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogPEZhdm91cml0ZUVkaXRpbmdNb2RhbFxuICogICBpc01vZGFsT3Blbj17bW9kYWxPcGVufVxuICogICBoYW5kbGVDbG9zZT17aGFuZGxlQ2xvc2V9XG4gKiAgIGZhdm91cml0ZXM9e2Zhdm91cml0ZXN9XG4gKiAgIHVwZGF0ZUZhdm91cml0ZXM9e29uVXBkYXRlRmF2b3VyaXRlc31cbiAqICAgZGVsZXRlRmF2b3VyaXRlPXtvbkRlbGV0ZUZhdm91cml0ZX1cbiAqICAgb25FZGl0U2VsZWN0ZWQ9e29uRWRpdFNlbGVjdGVkfVxuICogICBpc0xvYWRpbmc9e2ZhbHNlfVxuICogICBsYW5nPVwiZmlcIlxuICogLz5cbiAqL1xuZnVuY3Rpb24gRmF2b3VyaXRlRWRpdGluZ01vZGFsKHtcbiAgaXNNb2RhbE9wZW4sXG4gIGhhbmRsZUNsb3NlLFxuICB1cGRhdGVGYXZvdXJpdGVzLFxuICBkZWxldGVGYXZvdXJpdGUsXG4gIG9uRWRpdFNlbGVjdGVkLFxuICBmYXZvdXJpdGVzLFxuICBpc0xvYWRpbmcsXG4gIGxhbmcgPSAnZmknLFxufSkge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCd0cmFuc2xhdGlvbicsIHsgaTE4biB9KTtcbiAgY29uc3QgW3NvdXJjZSwgc2V0U291cmNlXSA9IHVzZVN0YXRlKGZhdm91cml0ZXMpO1xuICBjb25zdCBbcmVvcmRlcmVkLCBzZXRSZW9yZGVyZWRdID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtzZWxlY3RlZEZhdm91cml0ZSwgc2V0U2VsZWN0ZWRGYXZvdXJpdGVdID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IHByZXZpb3VzRmF2b3VyaXRlcyA9IHVzZVJlZihmYXZvdXJpdGVzKTtcblxuICAvLyBEcm9wIHRoZSBsb2NhbCBvcmRlciB3aGVuIHRoZSBmYXZvdXJpdGVzIGNoYW5nZSBmcm9tIG91dHNpZGVcbiAgaWYgKCFpc0VxdWFsKHNvdXJjZSwgZmF2b3VyaXRlcykpIHtcbiAgICBzZXRTb3VyY2UoZmF2b3VyaXRlcyk7XG4gICAgc2V0UmVvcmRlcmVkKG51bGwpO1xuICB9XG4gIGNvbnN0IGl0ZW1zID0gcmVvcmRlcmVkIHx8IGZhdm91cml0ZXM7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoXG4gICAgICBwcmV2aW91c0Zhdm91cml0ZXMuY3VycmVudCAhPT0gZmF2b3VyaXRlcyAmJlxuICAgICAgIWlzRXF1YWwocHJldmlvdXNGYXZvdXJpdGVzLmN1cnJlbnQsIGZhdm91cml0ZXMpICYmXG4gICAgICBpc0VtcHR5KGZhdm91cml0ZXMpXG4gICAgKSB7XG4gICAgICBoYW5kbGVDbG9zZSgpO1xuICAgIH1cbiAgICBwcmV2aW91c0Zhdm91cml0ZXMuY3VycmVudCA9IGZhdm91cml0ZXM7XG4gIH0sIFtmYXZvdXJpdGVzLCBoYW5kbGVDbG9zZV0pO1xuXG4gIGNvbnN0IG1vdmUgPSAoaW5kZXgsIGRpcmVjdGlvbikgPT4ge1xuICAgIGNvbnN0IGNvcHkgPSBbLi4uaXRlbXNdO1xuICAgIFtjb3B5W2luZGV4XSwgY29weVtpbmRleCArIGRpcmVjdGlvbl1dID0gW1xuICAgICAgY29weVtpbmRleCArIGRpcmVjdGlvbl0sXG4gICAgICBjb3B5W2luZGV4XSxcbiAgICBdO1xuICAgIHNldFJlb3JkZXJlZChjb3B5KTtcbiAgfTtcblxuICBjb25zdCBvbkRyYWdFbmQgPSBldmVudCA9PiB7XG4gICAgaWYgKGV2ZW50LmNhbmNlbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgaW5pdGlhbEluZGV4LCBpbmRleCB9ID0gZXZlbnQub3BlcmF0aW9uLnNvdXJjZT8uc29ydGFibGUgfHwge307XG4gICAgaWYgKGluaXRpYWxJbmRleCA9PT0gdW5kZWZpbmVkIHx8IGluaXRpYWxJbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29weSA9IFsuLi5pdGVtc107XG4gICAgY29uc3QgW21vdmVkXSA9IGNvcHkuc3BsaWNlKGluaXRpYWxJbmRleCwgMSk7XG4gICAgY29weS5zcGxpY2UoaW5kZXgsIDAsIG1vdmVkKTtcbiAgICBzZXRSZW9yZGVyZWQoY29weSk7XG4gIH07XG5cbiAgY29uc3QgY2xvc2VNb2RhbCA9ICgpID0+IHtcbiAgICBoYW5kbGVDbG9zZSgpO1xuICAgIGNvbnN0IG9taXR0ZWQgPSBpdGVtcy5tYXAoaXRlbSA9PiBvbWl0KGl0ZW0sIFsnY2hvc2VuJywgJ3NlbGVjdGVkJ10pKTtcbiAgICBpZiAoIWlzRXF1YWwob21pdHRlZCwgZmF2b3VyaXRlcykpIHtcbiAgICAgIHVwZGF0ZUZhdm91cml0ZXMob21pdHRlZCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNsb3NlRGVsZXRlRGlhbG9nID0gKCkgPT4gc2V0U2VsZWN0ZWRGYXZvdXJpdGUobnVsbCk7XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPERpYWxvZ01vZGFsXG4gICAgICAgIGhlYWRlclRleHQ9e3QoJ2RlbGV0ZS1wbGFjZS1oZWFkZXInLCB7IGxuZzogbGFuZyB9KX1cbiAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHtcbiAgICAgICAgICBjbG9zZURlbGV0ZURpYWxvZygpO1xuICAgICAgICAgIGhhbmRsZUNsb3NlKCk7XG4gICAgICAgIH19XG4gICAgICAgIGlzTW9kYWxPcGVuPXtzZWxlY3RlZEZhdm91cml0ZSAhPT0gbnVsbH1cbiAgICAgICAgZGlhbG9nQ29udGVudD17XG4gICAgICAgICAgc2VsZWN0ZWRGYXZvdXJpdGVcbiAgICAgICAgICAgID8gYCR7c2VsZWN0ZWRGYXZvdXJpdGUubmFtZX06ICR7c2VsZWN0ZWRGYXZvdXJpdGUuYWRkcmVzc31gXG4gICAgICAgICAgICA6ICcnXG4gICAgICAgIH1cbiAgICAgICAgcHJpbWFyeUJ1dHRvblRleHQ9e3QoJ2RlbGV0ZScsIHsgbG5nOiBsYW5nIH0pfVxuICAgICAgICBwcmltYXJ5QnV0dG9uT25DbGljaz17KCkgPT4ge1xuICAgICAgICAgIGRlbGV0ZUZhdm91cml0ZShzZWxlY3RlZEZhdm91cml0ZSk7XG4gICAgICAgICAgY2xvc2VEZWxldGVEaWFsb2coKTtcbiAgICAgICAgfX1cbiAgICAgICAgc2Vjb25kYXJ5QnV0dG9uVGV4dD17dCgnY2FuY2VsJywgeyBsbmc6IGxhbmcgfSl9XG4gICAgICAgIHNlY29uZGFyeUJ1dHRvbk9uQ2xpY2s9e2Nsb3NlRGVsZXRlRGlhbG9nfVxuICAgICAgICBsYW5nPXtsYW5nfVxuICAgICAgLz5cbiAgICAgIDxNb2RhbFxuICAgICAgICBvcGVuPXtpc01vZGFsT3BlbiAmJiBzZWxlY3RlZEZhdm91cml0ZSA9PT0gbnVsbH1cbiAgICAgICAgb25PcGVuQ2hhbmdlPXtvcGVuID0+IHtcbiAgICAgICAgICBpZiAoIW9wZW4pIHtcbiAgICAgICAgICAgIGNsb3NlTW9kYWwoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxNb2RhbENvbnRlbnRcbiAgICAgICAgICBsYW5nPXtsYW5nfVxuICAgICAgICAgIHRpdGxlPXt0KCdlZGl0LXBsYWNlcycsIHsgbG5nOiBsYW5nIH0pfVxuICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLm1vZGFsQ29udGVudH1cbiAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PXt1bmRlZmluZWR9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmxpc3RDb250YWluZXJ9PlxuICAgICAgICAgICAgPERyYWdEcm9wUHJvdmlkZXIgb25EcmFnRW5kPXtvbkRyYWdFbmR9PlxuICAgICAgICAgICAgICA8dWwgY2xhc3NOYW1lPXtzdHlsZXMubGlzdH0+XG4gICAgICAgICAgICAgICAge2l0ZW1zLm1hcCgoZmF2b3VyaXRlLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgPEZhdm91cml0ZUxpc3RJdGVtXG4gICAgICAgICAgICAgICAgICAgIGtleT17ZmF2b3VyaXRlLmZhdm91cml0ZUlkfVxuICAgICAgICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgIGZhdm91cml0ZT17ZmF2b3VyaXRlfVxuICAgICAgICAgICAgICAgICAgICBsYW5nPXtsYW5nfVxuICAgICAgICAgICAgICAgICAgICBvbk1vdmVVcD17aW5kZXggPiAwID8gKCkgPT4gbW92ZShpbmRleCwgLTEpIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgb25Nb3ZlRG93bj17XG4gICAgICAgICAgICAgICAgICAgICAgaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxID8gKCkgPT4gbW92ZShpbmRleCwgMSkgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb25FZGl0PXsoKSA9PiBvbkVkaXRTZWxlY3RlZChmYXZvdXJpdGUpfVxuICAgICAgICAgICAgICAgICAgICBvbkRlbGV0ZT17KCkgPT4gc2V0U2VsZWN0ZWRGYXZvdXJpdGUoZmF2b3VyaXRlKX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L0RyYWdEcm9wUHJvdmlkZXI+XG4gICAgICAgICAgICB7aXNMb2FkaW5nICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5vdmVybGF5fT5cbiAgICAgICAgICAgICAgICA8U3Bpbm5lciAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvTW9kYWxDb250ZW50PlxuICAgICAgPC9Nb2RhbD5cbiAgICA8Lz5cbiAgKTtcbn1cblxuRmF2b3VyaXRlRWRpdGluZ01vZGFsLnByb3BUeXBlcyA9IHtcbiAgLyoqIFJlcXVpcmVkLiBXaGV0aGVyIHRoZSBkaWFsb2cgaXMgb3Blbi5cbiAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gIGlzTW9kYWxPcGVuOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAvKiogUmVxdWlyZWQuIENsb3NlIG1vZGFsLlxuICAgKiBAdHlwZSB7ZnVuY3Rpb259ICovXG4gIGhhbmRsZUNsb3NlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKiogUmVxdWlyZWQuIENhbGxlZCB3aXRoIHRoZSByZW9yZGVyZWQgZmF2b3VyaXRlcyB3aGVuIHRoZSBkaWFsb2cgaXMgY2xvc2VkLlxuICAgKiBAdHlwZSB7ZnVuY3Rpb259ICovXG4gIHVwZGF0ZUZhdm91cml0ZXM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIC8qKiBSZXF1aXJlZC4gQ2FsbGVkIHdpdGggdGhlIGZhdm91cml0ZSB0aGUgdXNlciBjb25maXJtZWQgZGVsZXRpbmcuXG4gICAqIEB0eXBlIHtmdW5jdGlvbn0gKi9cbiAgZGVsZXRlRmF2b3VyaXRlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKiogUmVxdWlyZWQuIEZ1bmN0aW9uIHRoYXQgdGFrZXMgc2VsZWN0ZWQgZmF2b3VyaXRlIG9iamVjdCBhcyBwYXJhbWV0ZXIuXG4gICAqIEB0eXBlIHtmdW5jdGlvbn0gKi9cbiAgb25FZGl0U2VsZWN0ZWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIC8qKiBSZXF1aXJlZC4gV2hldGhlciBhIHNhdmUgaXMgaW4gcHJvZ3Jlc3M7IHNob3dzIGEgc3Bpbm5lciBvdmVyIHRoZSBsaXN0LlxuICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgaXNMb2FkaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAvKiogUmVxdWlyZWQuXG4gICAqIEB0eXBlIHthcnJheTxvYmplY3Q+fVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZ3Rmc0lkXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBnaWRcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGxhdFxuICAgKiBAcHJvcGVydHkge251bWJlcn0gbG9uXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RlZEljb25JZFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZmF2b3VyaXRlSWRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGxheWVyXG4gICAqL1xuICBmYXZvdXJpdGVzOiBQcm9wVHlwZXMuYXJyYXlPZihcbiAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIGFkZHJlc3M6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBndGZzSWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBnaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBsYXQ6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBsb246IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgc2VsZWN0ZWRJY29uSWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBmYXZvdXJpdGVJZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIGxheWVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIH0pLFxuICApLmlzUmVxdWlyZWQsXG4gIC8qKiBPcHRpb25hbC4gTGFuZ3VhZ2UsIGZpLCBlbiBvciBzdi4gRGVmYXVsdHMgdG8gZmkuXG4gICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gIGxhbmc6IFByb3BUeXBlcy5zdHJpbmcsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBGYXZvdXJpdGVFZGl0aW5nTW9kYWw7XG4iXSwibmFtZXMiOlsiZ2V0TG9jYWxhZG1pbiIsInN1Z2dlc3Rpb24iLCJsb2NhbGFkbWluIiwiYWRkcmVzcyIsImxhc3RJbmRleE9mIiwibGVuZ3RoIiwic3Vic3RyaW5nIiwiZ2V0U3RvcENvZGUiLCJpZCIsImNvZGUiLCJ1bmRlZmluZWQiLCJpbmRleE9mIiwiZm9ybWF0RmF2b3VyaXRlUGxhY2VMYWJlbCIsIm5hbWUiLCJzcGxpdCIsInJlcGxhY2UiLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJtZW1vaXplIiwicGxhaW4iLCJsYXllciIsImxhYmVsSWQiLCJzaG9ydE5hbWUiLCJndGZzSWQiLCJtb2RlIiwidG9Mb3dlckNhc2UiLCJsb25nTmFtZSIsImFnZW5jeSIsImxhYmVsIiwiaXRlbSIsImkiLCJjbG9uZURlZXAiLCJ0cmFuc2xhdGlvbnMiLCJkZSIsInRyYW5zbGF0aW9uIiwiY2FuY2VsIiwiZGVsZXRlIiwiZW4iLCJkb3duIiwidXAiLCJmaSIsInBsIiwic3YiLCJpMThuIiwiY3JlYXRlSW5zdGFuY2UiLCJmYWxsYmFja0xuZyIsInJlc291cmNlcyIsImRlZmF1bHROUyIsInJlYWN0IiwidXNlU3VzcGVuc2UiLCJpbml0IiwiZ2V0SWNvbklkIiwic2VsZWN0ZWRJY29uSWQiLCJwcmVmaXhQb3MiLCJGYXZvdXJpdGVMaXN0SXRlbSIsImZhdm91cml0ZSIsImxhbmciLCJvbk1vdmVVcCIsIm9uTW92ZURvd24iLCJvbkVkaXQiLCJvbkRlbGV0ZSIsImluZGV4IiwidCIsInVzZVRyYW5zbGF0aW9uIiwicmVmIiwidXNlU29ydGFibGUiLCJmYXZvdXJpdGVJZCIsImljb25JZCIsIl9qc3hzIiwiY2xhc3NOYW1lIiwic3R5bGVzIiwiY2hpbGRyZW4iLCJkcmFnSGFuZGxlIiwiX2pzeCIsInR5cGUiLCJhcnJvdyIsImxuZyIsIm9uQ2xpY2siLCJlbGxpcHNpcyIsIkljb24iLCJpbWciLCJjb2xvciIsInBsYWNlSWNvbiIsIkZsZXhDb2x1bW4iLCJ0ZXh0IiwiVGV4dCIsInZhcmlhbnQiLCJhcyIsIkZsZXhSb3ciLCJhbGlnbkl0ZW1zIiwiZmxleFNocmluayIsImFjdGlvbkJ1dHRvbiIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInNoYXBlIiwic3RyaW5nIiwiaXNSZXF1aXJlZCIsImZ1bmMiLCJudW1iZXIiLCJGYXZvdXJpdGVFZGl0aW5nTW9kYWwiLCJpc01vZGFsT3BlbiIsImhhbmRsZUNsb3NlIiwidXBkYXRlRmF2b3VyaXRlcyIsImRlbGV0ZUZhdm91cml0ZSIsIm9uRWRpdFNlbGVjdGVkIiwiZmF2b3VyaXRlcyIsImlzTG9hZGluZyIsInNvdXJjZSIsInNldFNvdXJjZSIsInVzZVN0YXRlIiwicmVvcmRlcmVkIiwic2V0UmVvcmRlcmVkIiwic2VsZWN0ZWRGYXZvdXJpdGUiLCJzZXRTZWxlY3RlZEZhdm91cml0ZSIsInByZXZpb3VzRmF2b3VyaXRlcyIsInVzZVJlZiIsImlzRXF1YWwiLCJpdGVtcyIsInVzZUVmZmVjdCIsImN1cnJlbnQiLCJpc0VtcHR5IiwibW92ZSIsImRpcmVjdGlvbiIsImNvcHkiLCJvbkRyYWdFbmQiLCJldmVudCIsImNhbmNlbGVkIiwiaW5pdGlhbEluZGV4Iiwib3BlcmF0aW9uIiwic29ydGFibGUiLCJtb3ZlZCIsInNwbGljZSIsImNsb3NlTW9kYWwiLCJvbWl0dGVkIiwibWFwIiwib21pdCIsImNsb3NlRGVsZXRlRGlhbG9nIiwiX0ZyYWdtZW50IiwiRGlhbG9nTW9kYWwiLCJoZWFkZXJUZXh0IiwiZGlhbG9nQ29udGVudCIsInByaW1hcnlCdXR0b25UZXh0IiwicHJpbWFyeUJ1dHRvbk9uQ2xpY2siLCJzZWNvbmRhcnlCdXR0b25UZXh0Iiwic2Vjb25kYXJ5QnV0dG9uT25DbGljayIsIk1vZGFsIiwib3BlbiIsIm9uT3BlbkNoYW5nZSIsIk1vZGFsQ29udGVudCIsInRpdGxlIiwibW9kYWxDb250ZW50IiwibGlzdENvbnRhaW5lciIsIkRyYWdEcm9wUHJvdmlkZXIiLCJsaXN0Iiwib3ZlcmxheSIsIlNwaW5uZXIiLCJib29sIiwiYXJyYXlPZiIsImdpZCIsImxhdCIsImxvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBTUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsTUFBTUEsYUFBYSxHQUFHQyxVQUFVLElBQzlCQSxVQUFVLENBQUNDLFVBQVUsSUFDckJELFVBQVUsQ0FBQ0MsVUFBVSxJQUNwQkQsVUFBVSxDQUFDRSxPQUFPLElBQ2pCRixVQUFVLENBQUNFLE9BQU8sQ0FBQ0MsV0FBVyxDQUFDLEdB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
package/lib/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { useState, useRef, useEffect } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { useTranslation } from 'react-i18next';
4
- import { ReactSortable } from 'react-sortablejs';
4
+ import { DragDropProvider } from '@dnd-kit/react';
5
5
  import isEmpty from 'lodash/isEmpty';
6
6
  import isEqual from 'lodash/isEqual';
7
7
  import omit from 'lodash/omit';
@@ -9,6 +9,7 @@ import { Spinner } from '@hsl-fi/loading-indicators';
9
9
  import { Modal, ModalContent } from '@hsl-fi/dialog';
10
10
  import DialogModal from '@digitransit-component/digitransit-component-dialog-modal';
11
11
  import { FlexColumn, Text, FlexRow } from '@hsl-fi/layout-primitives';
12
+ import { useSortable } from '@dnd-kit/react/sortable';
12
13
  import Icon from '@digitransit-component/digitransit-component-icon';
13
14
  import 'lodash/uniqWith';
14
15
  import memoize from 'lodash/memoize';
@@ -126,8 +127,8 @@ function styleInject(css, ref) {
126
127
  }
127
128
  }
128
129
 
129
- var css_248z = ".styles_modalContent__DPecW.styles_modalContent__DPecW:focus, .styles_modalContent__DPecW.styles_modalContent__DPecW:focus-visible {\n outline: none;\n}\n\n.styles_listContainer__BE6HY {\n position: relative;\n width: 100%;\n}\n@media (max-width: 499px) {\n .styles_listContainer__BE6HY {\n margin-top: 24px;\n }\n}\n@media (min-width: 500px) {\n .styles_listContainer__BE6HY {\n min-height: 286px;\n }\n}\n\n.styles_list__xeRy9 {\n display: flex;\n flex-direction: column;\n gap: var(--space-fixed-xs, 8px);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.styles_item__DbRsI {\n display: flex;\n align-items: center;\n min-height: 50px;\n background: var(--color-surface-default, #fff);\n border: 1px solid var(--color-border-weak, #ddd);\n border-radius: var(--radius-m, 8px);\n box-sizing: border-box;\n}\n\n.styles_ghost__Zi5Ln {\n opacity: 0;\n}\n\n.styles_fallback__mrveX {\n opacity: 1 !important;\n}\n\n.styles_dragHandle__kplvR {\n display: flex;\n align-items: center;\n flex: none;\n align-self: stretch;\n cursor: move;\n color: var(--color-icon-accent, #0074bf);\n}\n\n.styles_ellipsis__Gma55 {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 37px;\n color: var(--color-icon-weakest, #888);\n}\n.styles_ellipsis__Gma55 svg {\n height: 20px;\n transform: rotate(90deg);\n}\n\n.styles_placeIcon__-6soL {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n margin-right: var(--space-fixed-xs, 8px);\n}\n.styles_placeIcon__-6soL svg {\n width: 20px;\n height: 20px;\n}\n\n.styles_arrow__lYXD3:not(:focus, :active) {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.styles_arrow__lYXD3 {\n font-weight: var(--font-weight-medium, 500);\n}\n\n.styles_text__al7Br {\n flex: 1 1 0;\n min-width: 0;\n padding-left: var(--space-fixed-xs, 8px);\n}\n\n.styles_name__en71y,\n.styles_address__-cd84 {\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.styles_address__-cd84:empty {\n display: none;\n}\n\n.styles_actionButton__y-oae {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 48px;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n cursor: pointer;\n color: var(--color-icon-weakest, #888);\n}\n.styles_actionButton__y-oae:hover, .styles_actionButton__y-oae:focus-visible {\n color: var(--color-icon-accent, #0074bf);\n}\n.styles_actionButton__y-oae svg {\n width: 18px;\n height: 18px;\n}\n\n.styles_overlay__TtXTn {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n inset: 0;\n background: var(--color-surface-default, #fff);\n}";
130
- var styles = {"modalContent":"styles_modalContent__DPecW","listContainer":"styles_listContainer__BE6HY","list":"styles_list__xeRy9","item":"styles_item__DbRsI","ghost":"styles_ghost__Zi5Ln","fallback":"styles_fallback__mrveX","dragHandle":"styles_dragHandle__kplvR","ellipsis":"styles_ellipsis__Gma55","placeIcon":"styles_placeIcon__-6soL","arrow":"styles_arrow__lYXD3","text":"styles_text__al7Br","name":"styles_name__en71y","address":"styles_address__-cd84","actionButton":"styles_actionButton__y-oae","overlay":"styles_overlay__TtXTn"};
130
+ var css_248z = ".styles_modalContent__DPecW.styles_modalContent__DPecW:focus, .styles_modalContent__DPecW.styles_modalContent__DPecW:focus-visible {\n outline: none;\n}\n\n.styles_listContainer__BE6HY {\n position: relative;\n width: 100%;\n}\n@media (max-width: 499px) {\n .styles_listContainer__BE6HY {\n margin-top: 24px;\n }\n}\n@media (min-width: 500px) {\n .styles_listContainer__BE6HY {\n min-height: 286px;\n }\n}\n\n.styles_list__xeRy9 {\n display: flex;\n flex-direction: column;\n gap: var(--space-fixed-xs, 8px);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.styles_item__DbRsI {\n display: flex;\n align-items: center;\n min-height: 50px;\n background: var(--color-surface-default, #fff);\n border: 1px solid var(--color-border-weak, #ddd);\n border-radius: var(--radius-m, 8px);\n box-sizing: border-box;\n}\n\n.styles_dragHandle__kplvR {\n display: flex;\n align-items: center;\n flex: none;\n align-self: stretch;\n cursor: move;\n color: var(--color-icon-accent, #0074bf);\n}\n\n.styles_ellipsis__Gma55 {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 37px;\n color: var(--color-icon-weakest, #888);\n}\n.styles_ellipsis__Gma55 svg {\n height: 20px;\n transform: rotate(90deg);\n}\n\n.styles_placeIcon__-6soL {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n margin-right: var(--space-fixed-xs, 8px);\n}\n.styles_placeIcon__-6soL svg {\n width: 20px;\n height: 20px;\n}\n\n.styles_arrow__lYXD3:not(:focus, :active) {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.styles_arrow__lYXD3 {\n font-weight: var(--font-weight-medium, 500);\n}\n\n.styles_text__al7Br {\n flex: 1 1 0;\n min-width: 0;\n padding-left: var(--space-fixed-xs, 8px);\n}\n\n.styles_name__en71y,\n.styles_address__-cd84 {\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.styles_address__-cd84:empty {\n display: none;\n}\n\n.styles_actionButton__y-oae {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 48px;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n cursor: pointer;\n color: var(--color-icon-weakest, #888);\n}\n.styles_actionButton__y-oae:hover, .styles_actionButton__y-oae:focus-visible {\n color: var(--color-icon-accent, #0074bf);\n}\n.styles_actionButton__y-oae svg {\n width: 18px;\n height: 18px;\n}\n\n.styles_overlay__TtXTn {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n inset: 0;\n background: var(--color-surface-default, #fff);\n}";
131
+ var styles = {"modalContent":"styles_modalContent__DPecW","listContainer":"styles_listContainer__BE6HY","list":"styles_list__xeRy9","item":"styles_item__DbRsI","dragHandle":"styles_dragHandle__kplvR","ellipsis":"styles_ellipsis__Gma55","placeIcon":"styles_placeIcon__-6soL","arrow":"styles_arrow__lYXD3","text":"styles_text__al7Br","name":"styles_name__en71y","address":"styles_address__-cd84","actionButton":"styles_actionButton__y-oae","overlay":"styles_overlay__TtXTn"};
131
132
  styleInject(css_248z);
132
133
 
133
134
  /* eslint sort-keys: "error" */
@@ -203,7 +204,6 @@ const i18n = createInstance({
203
204
  });
204
205
  i18n.init();
205
206
 
206
- const DRAG_HANDLE_CLASS = styles.dragHandle;
207
207
  const getIconId = selectedIconId => {
208
208
  const prefixPos = selectedIconId ? selectedIconId.indexOf('icon_') : -1;
209
209
  return prefixPos > 0 ? selectedIconId.substring(prefixPos + 5) : 'place';
@@ -219,16 +219,24 @@ function FavouriteListItem({
219
219
  onMoveUp = null,
220
220
  onMoveDown = null,
221
221
  onEdit,
222
- onDelete
222
+ onDelete,
223
+ index
223
224
  }) {
224
225
  const {
225
226
  t
226
227
  } = useTranslation('translation', {
227
228
  i18n
228
229
  });
230
+ const {
231
+ ref
232
+ } = useSortable({
233
+ id: favourite.favouriteId,
234
+ index
235
+ });
229
236
  const iconId = getIconId(favourite.selectedIconId);
230
237
  const [name, address] = formatFavouritePlaceLabel(favourite.name, favourite.address);
231
238
  return /*#__PURE__*/jsxs("li", {
239
+ ref: ref,
232
240
  className: styles.item,
233
241
  children: [/*#__PURE__*/jsxs("div", {
234
242
  className: styles.dragHandle,
@@ -308,6 +316,7 @@ function FavouriteListItem({
308
316
  }
309
317
  process.env.NODE_ENV !== "production" ? FavouriteListItem.propTypes = {
310
318
  favourite: PropTypes.shape({
319
+ favouriteId: PropTypes.string,
311
320
  name: PropTypes.string,
312
321
  address: PropTypes.string,
313
322
  selectedIconId: PropTypes.string
@@ -316,7 +325,8 @@ process.env.NODE_ENV !== "production" ? FavouriteListItem.propTypes = {
316
325
  onEdit: PropTypes.func.isRequired,
317
326
  onDelete: PropTypes.func.isRequired,
318
327
  onMoveUp: PropTypes.func,
319
- onMoveDown: PropTypes.func
328
+ onMoveDown: PropTypes.func,
329
+ index: PropTypes.number.isRequired
320
330
  } : void 0;
321
331
 
322
332
  function FavouriteEditingModal({
@@ -356,13 +366,21 @@ function FavouriteEditingModal({
356
366
  [copy[index], copy[index + direction]] = [copy[index + direction], copy[index]];
357
367
  setReordered(copy);
358
368
  };
359
-
360
- // ReactSortable also calls setList on mount and on selection changes without reordering
361
- const setList = newList => {
362
- const sameOrder = newList.length === items.length && newList.every((item, i) => item.favouriteId === items[i].favouriteId);
363
- if (!sameOrder) {
364
- setReordered(newList);
369
+ const onDragEnd = event => {
370
+ if (event.canceled) {
371
+ return;
365
372
  }
373
+ const {
374
+ initialIndex,
375
+ index
376
+ } = event.operation.source?.sortable || {};
377
+ if (initialIndex === undefined || initialIndex === index) {
378
+ return;
379
+ }
380
+ const copy = [...items];
381
+ const [moved] = copy.splice(initialIndex, 1);
382
+ copy.splice(index, 0, moved);
383
+ setReordered(copy);
366
384
  };
367
385
  const closeModal = () => {
368
386
  handleClose();
@@ -411,24 +429,20 @@ function FavouriteEditingModal({
411
429
  "aria-describedby": undefined,
412
430
  children: /*#__PURE__*/jsxs("div", {
413
431
  className: styles.listContainer,
414
- children: [/*#__PURE__*/jsx(ReactSortable, {
415
- className: styles.list,
416
- tag: "ul",
417
- list: items,
418
- setList: setList,
419
- animation: 200,
420
- handle: `.${DRAG_HANDLE_CLASS}`,
421
- forceFallback: true,
422
- ghostClass: styles.ghost,
423
- fallbackClass: styles.fallback,
424
- children: items.map((favourite, index) => /*#__PURE__*/jsx(FavouriteListItem, {
425
- favourite: favourite,
426
- lang: lang,
427
- onMoveUp: index > 0 ? () => move(index, -1) : null,
428
- onMoveDown: index < items.length - 1 ? () => move(index, 1) : null,
429
- onEdit: () => onEditSelected(favourite),
430
- onDelete: () => setSelectedFavourite(favourite)
431
- }, favourite.favouriteId))
432
+ children: [/*#__PURE__*/jsx(DragDropProvider, {
433
+ onDragEnd: onDragEnd,
434
+ children: /*#__PURE__*/jsx("ul", {
435
+ className: styles.list,
436
+ children: items.map((favourite, index) => /*#__PURE__*/jsx(FavouriteListItem, {
437
+ index: index,
438
+ favourite: favourite,
439
+ lang: lang,
440
+ onMoveUp: index > 0 ? () => move(index, -1) : null,
441
+ onMoveDown: index < items.length - 1 ? () => move(index, 1) : null,
442
+ onEdit: () => onEditSelected(favourite),
443
+ onDelete: () => setSelectedFavourite(favourite)
444
+ }, favourite.favouriteId))
445
+ })
432
446
  }), isLoading && /*#__PURE__*/jsx("div", {
433
447
  className: styles.overlay,
434
448
  children: /*#__PURE__*/jsx(Spinner, {})
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../digitransit-search-util/packages/digitransit-search-util-uniq-by-label/index.js","../../../../node_modules/style-inject/dist/style-inject.es.js","../src/helpers/translations.js","../src/helpers/i18n.js","../src/helpers/FavouriteListItem.jsx","../src/index.jsx"],"sourcesContent":["import uniqWith from 'lodash/uniqWith';\nimport isEqual from 'lodash/isEqual';\nimport memoize from 'lodash/memoize';\nimport escapeRegExp from 'lodash/escapeRegExp';\nimport cloneDeep from 'lodash/cloneDeep';\n\n/**\n * Location properties.\n * @typedef {LocationProperties}\n * @property {string} layer Suggestion layer.\n * @property {lat} [number]\n * @property {lon} [number]\n * @property {string} address Address.\n */\n\n/**\n * Returns localadmin (city name) for suggestions\n *\n * @name getLocaladmin\n * @param {Object} suggestion suggestion's properties from geocoding or a favourite stop/station.\n * Expects last part of an address (after ',') to contain the city name of the suggestion location.\n * @returns {String} City name or empty string\n */\nconst getLocaladmin = suggestion =>\n suggestion.localadmin ||\n suggestion.localadmin ||\n (suggestion.address &&\n suggestion.address.lastIndexOf(',') < suggestion.address.length - 2 &&\n suggestion.address.substring(suggestion.address.lastIndexOf(',') + 2)) ||\n '';\n\nexport const getStopCode = ({ id, code }) => {\n if (code) {\n return code;\n }\n if (\n id === undefined ||\n typeof id.indexOf === 'undefined' ||\n id.indexOf('#') === -1\n ) {\n return undefined;\n }\n // id from pelias\n return id.substring(id.indexOf('#') + 1);\n};\n\nexport const formatFavouritePlaceLabel = (name, address) => [\n name || (address && address.split(',')[0]),\n typeof address === 'string'\n ? address.replace(new RegExp(`${escapeRegExp(name)}([ ,]|$)+`), '')\n : '',\n];\n\n/**\n * Format suggestion-pair [name, address] by `suggestion.layer`.\n *\n * @name getNameLabel\n * @param {LocationProperties} suggestion\n * @param {boolean} [plain]\n *\n * @returns {Array.<string>} Formatted label.\n */\nexport const getNameLabel = memoize(\n (suggestion, plain = false) => {\n switch (suggestion.layer) {\n case 'currentPosition':\n return [suggestion.labelId, suggestion.address];\n case 'selectFromMap':\n case 'ownLocations':\n case 'back':\n return [suggestion.labelId];\n case 'favouritePlace':\n return formatFavouritePlaceLabel(suggestion.name, suggestion.address);\n case 'favouriteVehicleRentalStation':\n case 'bikestation':\n return [suggestion.name];\n case 'favouriteRoute':\n case 'route-BUS':\n case 'route-TRAM':\n case 'route-RAIL':\n case 'route-SUBWAY':\n case 'route-FERRY':\n case 'route-FUNICULAR':\n case 'route-AIRPLANE':\n return !plain && suggestion.shortName\n ? [\n suggestion.gtfsId,\n suggestion.mode.toLowerCase(),\n suggestion.longName,\n ]\n : [\n suggestion.shortName,\n suggestion.longName,\n suggestion.agency ? suggestion.agency.name : undefined,\n ];\n case 'venue':\n case 'address':\n case 'street':\n return [\n suggestion.name,\n suggestion.label.replace(\n new RegExp(`${escapeRegExp(suggestion.name)}(,)?( )?`),\n '',\n ),\n ];\n case 'favouriteStop':\n case 'stop':\n return plain\n ? [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ]\n : [\n suggestion.name,\n suggestion.id,\n getStopCode(suggestion),\n getLocaladmin(suggestion),\n ];\n case 'favouriteStation':\n case 'station':\n default:\n return [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ];\n }\n },\n (item, plain) => {\n const i = cloneDeep(item);\n i.plain = plain;\n return i;\n },\n);\n\n/**\n * Checks that features are unique by label\n *\n * @name uniqByLabel\n * @param {Array} features Array of features\n * @returns {Array} Array of unique features\n * @example\n * digitransit-search-util.uniqByLabel(features);\n * //= Array(2)\n */\nexport default function uniqByLabel(features) {\n return uniqWith(features, (feat1, feat2) => {\n if (feat1.type === 'FutureRoute' || feat2.type === 'FutureRoute') {\n return false;\n }\n return (\n isEqual(getNameLabel(feat1.properties), getNameLabel(feat2.properties)) &&\n feat1.properties.layer === feat2.properties.layer\n );\n });\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","/* eslint sort-keys: \"error\" */\nconst translations = {\n de: {\n translation: {\n cancel: 'Abbrechen',\n delete: 'Löschen',\n 'delete-place-header': 'Wollen Sie den Favoriten löschen?',\n 'delete-place-name': 'Lösche Favorit: {{favourite.name}}',\n 'edit-place-name': 'Bearbeite Favorit: {{favourite.name}}',\n 'edit-places': 'Bearbeite Favoriten',\n },\n },\n en: {\n translation: {\n cancel: 'Cancel',\n delete: 'Delete',\n 'delete-place-header': 'Do you want to delete the place?',\n 'delete-place-name': 'Delete place: {{favourite.name}}',\n down: 'Move favourite down',\n 'edit-place-name': 'Edit place: {{favourite.name}}',\n 'edit-places': 'Edit places',\n up: 'Move favourite up',\n },\n },\n fi: {\n translation: {\n cancel: 'Peruuta',\n delete: 'Poista',\n 'delete-place-header': 'Haluatko poistaa paikan?',\n 'delete-place-name': 'Poista paikka: {{favourite.name}}',\n down: 'Siirrä suosikkisijaintia alaspäin',\n 'edit-place-name': 'Muokkaa paikkaa: {{favourite.name}}',\n 'edit-places': 'Muokkaa paikkoja',\n up: 'Siirrä suosikkisijaintia ylöpäin',\n },\n },\n pl: {\n translation: {\n cancel: 'Anuluj',\n delete: 'Usuń',\n 'delete-place-header': 'Czy na pewno chcesz usunąć to miejsce?',\n 'delete-place-name': 'Usuń miejsce: {{favourite.name}}',\n down: 'Przenieś ulubione niżej',\n 'edit-place-name': 'Edytuj miejsce: {{favourite.name}}',\n 'edit-places': 'Edytuj miejsca',\n up: 'Przenieś ulubione wyżej',\n },\n },\n sv: {\n translation: {\n cancel: 'Avbryt',\n delete: 'Ta bort',\n 'delete-place-header': 'Vill du ta bort platsen?',\n 'delete-place-name': 'Ta bort platsen: {{favourite.name}}',\n down: 'Flytta favoriten nedåt',\n 'edit-place-name': 'Edit place: {{favourite.name}}',\n 'edit-places': 'Redigera platser',\n up: 'Flytta favoriten uppåt',\n },\n },\n};\n\nexport default translations;\n","import { createInstance } from 'i18next';\nimport translations from './translations';\n\nconst i18n = createInstance({\n fallbackLng: 'fi',\n // debug: true,\n resources: translations,\n defaultNS: 'translation',\n react: {\n useSuspense: true,\n },\n});\n\ni18n.init();\n\nexport default i18n;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useTranslation } from 'react-i18next';\nimport { FlexColumn, FlexRow, Text } from '@hsl-fi/layout-primitives';\nimport Icon from '@digitransit-component/digitransit-component-icon';\nimport { formatFavouritePlaceLabel } from '@digitransit-search-util/digitransit-search-util-uniq-by-label';\nimport styles from './styles.scss';\nimport i18n from './i18n';\n\nexport const DRAG_HANDLE_CLASS = styles.dragHandle;\n\nconst getIconId = selectedIconId => {\n const prefixPos = selectedIconId ? selectedIconId.indexOf('icon_') : -1;\n return prefixPos > 0 ? selectedIconId.substring(prefixPos + 5) : 'place';\n};\n\n/**\n * One row of the favourites list. The visually hidden arrow buttons are a\n * keyboard alternative to dragging.\n */\nfunction FavouriteListItem({\n favourite,\n lang,\n onMoveUp = null,\n onMoveDown = null,\n onEdit,\n onDelete,\n}) {\n const { t } = useTranslation('translation', { i18n });\n const iconId = getIconId(favourite.selectedIconId);\n const [name, address] = formatFavouritePlaceLabel(\n favourite.name,\n favourite.address,\n );\n\n return (\n <li className={styles.item}>\n <div className={styles.dragHandle}>\n {onMoveUp && (\n <button\n type=\"button\"\n className={styles.arrow}\n aria-label={t('up', { lng: lang })}\n onClick={onMoveUp}\n >\n &uarr;\n </button>\n )}\n {onMoveDown && (\n <button\n type=\"button\"\n className={styles.arrow}\n aria-label={t('down', { lng: lang })}\n onClick={onMoveDown}\n >\n &darr;\n </button>\n )}\n <span className={styles.ellipsis}>\n <Icon img=\"ellipsis\" color=\"currentColor\" />\n </span>\n <span className={styles.placeIcon}>\n <Icon img={iconId} color=\"currentColor\" />\n </span>\n </div>\n <FlexColumn className={styles.text}>\n <Text variant=\"text-xs-bold\" as=\"p\" className={styles.name}>\n {name}\n </Text>\n <Text variant=\"text-xs\" as=\"p\" color=\"weak\" className={styles.address}>\n {address}\n </Text>\n </FlexColumn>\n <FlexRow alignItems=\"center\" flexShrink={0}>\n <button\n type=\"button\"\n className={styles.actionButton}\n aria-label={t('edit-place-name', { lng: lang, favourite })}\n onClick={onEdit}\n >\n <Icon img=\"edit\" color=\"currentColor\" />\n </button>\n <button\n type=\"button\"\n className={styles.actionButton}\n aria-label={t('delete-place-name', { lng: lang, favourite })}\n onClick={onDelete}\n >\n <Icon img=\"trash\" color=\"currentColor\" />\n </button>\n </FlexRow>\n </li>\n );\n}\n\nFavouriteListItem.propTypes = {\n favourite: PropTypes.shape({\n name: PropTypes.string,\n address: PropTypes.string,\n selectedIconId: PropTypes.string,\n }).isRequired,\n lang: PropTypes.string.isRequired,\n onEdit: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n onMoveUp: PropTypes.func,\n onMoveDown: PropTypes.func,\n};\n\nexport default FavouriteListItem;\n","import React, { useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useTranslation } from 'react-i18next';\nimport { ReactSortable } from 'react-sortablejs';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqual from 'lodash/isEqual';\nimport omit from 'lodash/omit';\nimport { Spinner } from '@hsl-fi/loading-indicators';\nimport { Modal, ModalContent } from '@hsl-fi/dialog';\nimport DialogModal from '@digitransit-component/digitransit-component-dialog-modal';\nimport FavouriteListItem, {\n DRAG_HANDLE_CLASS,\n} from './helpers/FavouriteListItem';\nimport i18n from './helpers/i18n';\nimport styles from './helpers/styles.scss';\n\n/**\n * A dialog for reordering, editing and deleting favourite places, built on\n * the HSL design system's Modal. Colors, typography and the mobile/desktop\n * layout are handled by the design system, so the dialog follows the active\n * deployment's theme.\n *\n * @example\n * <FavouriteEditingModal\n * isModalOpen={modalOpen}\n * handleClose={handleClose}\n * favourites={favourites}\n * updateFavourites={onUpdateFavourites}\n * deleteFavourite={onDeleteFavourite}\n * onEditSelected={onEditSelected}\n * isLoading={false}\n * lang=\"fi\"\n * />\n */\nfunction FavouriteEditingModal({\n isModalOpen,\n handleClose,\n updateFavourites,\n deleteFavourite,\n onEditSelected,\n favourites,\n isLoading,\n lang = 'fi',\n}) {\n const { t } = useTranslation('translation', { i18n });\n const [source, setSource] = useState(favourites);\n const [reordered, setReordered] = useState(null);\n const [selectedFavourite, setSelectedFavourite] = useState(null);\n const previousFavourites = useRef(favourites);\n\n // Drop the local order when the favourites change from outside\n if (!isEqual(source, favourites)) {\n setSource(favourites);\n setReordered(null);\n }\n const items = reordered || favourites;\n\n useEffect(() => {\n if (\n previousFavourites.current !== favourites &&\n !isEqual(previousFavourites.current, favourites) &&\n isEmpty(favourites)\n ) {\n handleClose();\n }\n previousFavourites.current = favourites;\n }, [favourites, handleClose]);\n\n const move = (index, direction) => {\n const copy = [...items];\n [copy[index], copy[index + direction]] = [\n copy[index + direction],\n copy[index],\n ];\n setReordered(copy);\n };\n\n // ReactSortable also calls setList on mount and on selection changes without reordering\n const setList = newList => {\n const sameOrder =\n newList.length === items.length &&\n newList.every((item, i) => item.favouriteId === items[i].favouriteId);\n if (!sameOrder) {\n setReordered(newList);\n }\n };\n\n const closeModal = () => {\n handleClose();\n const omitted = items.map(item => omit(item, ['chosen', 'selected']));\n if (!isEqual(omitted, favourites)) {\n updateFavourites(omitted);\n }\n };\n\n const closeDeleteDialog = () => setSelectedFavourite(null);\n\n return (\n <>\n <DialogModal\n headerText={t('delete-place-header', { lng: lang })}\n handleClose={() => {\n closeDeleteDialog();\n handleClose();\n }}\n isModalOpen={selectedFavourite !== null}\n dialogContent={\n selectedFavourite\n ? `${selectedFavourite.name}: ${selectedFavourite.address}`\n : ''\n }\n primaryButtonText={t('delete', { lng: lang })}\n primaryButtonOnClick={() => {\n deleteFavourite(selectedFavourite);\n closeDeleteDialog();\n }}\n secondaryButtonText={t('cancel', { lng: lang })}\n secondaryButtonOnClick={closeDeleteDialog}\n lang={lang}\n />\n <Modal\n open={isModalOpen && selectedFavourite === null}\n onOpenChange={open => {\n if (!open) {\n closeModal();\n }\n }}\n >\n <ModalContent\n lang={lang}\n title={t('edit-places', { lng: lang })}\n className={styles.modalContent}\n aria-describedby={undefined}\n >\n <div className={styles.listContainer}>\n <ReactSortable\n className={styles.list}\n tag=\"ul\"\n list={items}\n setList={setList}\n animation={200}\n handle={`.${DRAG_HANDLE_CLASS}`}\n forceFallback\n ghostClass={styles.ghost}\n fallbackClass={styles.fallback}\n >\n {items.map((favourite, index) => (\n <FavouriteListItem\n key={favourite.favouriteId}\n favourite={favourite}\n lang={lang}\n onMoveUp={index > 0 ? () => move(index, -1) : null}\n onMoveDown={\n index < items.length - 1 ? () => move(index, 1) : null\n }\n onEdit={() => onEditSelected(favourite)}\n onDelete={() => setSelectedFavourite(favourite)}\n />\n ))}\n </ReactSortable>\n {isLoading && (\n <div className={styles.overlay}>\n <Spinner />\n </div>\n )}\n </div>\n </ModalContent>\n </Modal>\n </>\n );\n}\n\nFavouriteEditingModal.propTypes = {\n /** Required. Whether the dialog is open.\n * @type {boolean} */\n isModalOpen: PropTypes.bool.isRequired,\n /** Required. Close modal.\n * @type {function} */\n handleClose: PropTypes.func.isRequired,\n /** Required. Called with the reordered favourites when the dialog is closed.\n * @type {function} */\n updateFavourites: PropTypes.func.isRequired,\n /** Required. Called with the favourite the user confirmed deleting.\n * @type {function} */\n deleteFavourite: PropTypes.func.isRequired,\n /** Required. Function that takes selected favourite object as parameter.\n * @type {function} */\n onEditSelected: PropTypes.func.isRequired,\n /** Required. Whether a save is in progress; shows a spinner over the list.\n * @type {boolean} */\n isLoading: PropTypes.bool.isRequired,\n /** Required.\n * @type {array<object>}\n * @property {string} type\n * @property {string} address\n * @property {string} gtfsId\n * @property {string} gid\n * @property {number} lat\n * @property {number} lon\n * @property {string} name\n * @property {string} selectedIconId\n * @property {string} favouriteId\n * @property {string} layer\n */\n favourites: PropTypes.arrayOf(\n PropTypes.shape({\n type: PropTypes.string,\n address: PropTypes.string,\n gtfsId: PropTypes.string,\n gid: PropTypes.string,\n lat: PropTypes.number,\n lon: PropTypes.number,\n name: PropTypes.string,\n selectedIconId: PropTypes.string,\n favouriteId: PropTypes.string,\n layer: PropTypes.string,\n }),\n ).isRequired,\n /** Optional. Language, fi, en or sv. Defaults to fi.\n * @type {string} */\n lang: PropTypes.string,\n};\n\nexport default FavouriteEditingModal;\n"],"names":["getLocaladmin","suggestion","localadmin","address","lastIndexOf","length","substring","getStopCode","id","code","undefined","indexOf","formatFavouritePlaceLabel","name","split","replace","RegExp","escapeRegExp","memoize","plain","layer","labelId","shortName","gtfsId","mode","toLowerCase","longName","agency","label","item","i","cloneDeep","translations","de","translation","cancel","delete","en","down","up","fi","pl","sv","i18n","createInstance","fallbackLng","resources","defaultNS","react","useSuspense","init","DRAG_HANDLE_CLASS","styles","dragHandle","getIconId","selectedIconId","prefixPos","FavouriteListItem","favourite","lang","onMoveUp","onMoveDown","onEdit","onDelete","t","useTranslation","iconId","_jsxs","className","children","_jsx","type","arrow","lng","onClick","ellipsis","Icon","img","color","placeIcon","FlexColumn","text","Text","variant","as","FlexRow","alignItems","flexShrink","actionButton","process","env","NODE_ENV","propTypes","PropTypes","shape","string","isRequired","func","FavouriteEditingModal","isModalOpen","handleClose","updateFavourites","deleteFavourite","onEditSelected","favourites","isLoading","source","setSource","useState","reordered","setReordered","selectedFavourite","setSelectedFavourite","previousFavourites","useRef","isEqual","items","useEffect","current","isEmpty","move","index","direction","copy","setList","newList","sameOrder","every","favouriteId","closeModal","omitted","map","omit","closeDeleteDialog","_Fragment","DialogModal","headerText","dialogContent","primaryButtonText","primaryButtonOnClick","secondaryButtonText","secondaryButtonOnClick","Modal","open","onOpenChange","ModalContent","title","modalContent","listContainer","ReactSortable","list","tag","animation","handle","forceFallback","ghostClass","ghost","fallbackClass","fallback","overlay","Spinner","bool","arrayOf","gid","lat","number","lon"],"mappings":"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","x_google_ignoreList":[1]}
1
+ {"version":3,"file":"index.js","sources":["../../../../digitransit-search-util/packages/digitransit-search-util-uniq-by-label/index.js","../../../../node_modules/style-inject/dist/style-inject.es.js","../src/helpers/translations.js","../src/helpers/i18n.js","../src/helpers/FavouriteListItem.jsx","../src/index.jsx"],"sourcesContent":["import uniqWith from 'lodash/uniqWith';\nimport isEqual from 'lodash/isEqual';\nimport memoize from 'lodash/memoize';\nimport escapeRegExp from 'lodash/escapeRegExp';\nimport cloneDeep from 'lodash/cloneDeep';\n\n/**\n * Location properties.\n * @typedef {LocationProperties}\n * @property {string} layer Suggestion layer.\n * @property {lat} [number]\n * @property {lon} [number]\n * @property {string} address Address.\n */\n\n/**\n * Returns localadmin (city name) for suggestions\n *\n * @name getLocaladmin\n * @param {Object} suggestion suggestion's properties from geocoding or a favourite stop/station.\n * Expects last part of an address (after ',') to contain the city name of the suggestion location.\n * @returns {String} City name or empty string\n */\nconst getLocaladmin = suggestion =>\n suggestion.localadmin ||\n suggestion.localadmin ||\n (suggestion.address &&\n suggestion.address.lastIndexOf(',') < suggestion.address.length - 2 &&\n suggestion.address.substring(suggestion.address.lastIndexOf(',') + 2)) ||\n '';\n\nexport const getStopCode = ({ id, code }) => {\n if (code) {\n return code;\n }\n if (\n id === undefined ||\n typeof id.indexOf === 'undefined' ||\n id.indexOf('#') === -1\n ) {\n return undefined;\n }\n // id from pelias\n return id.substring(id.indexOf('#') + 1);\n};\n\nexport const formatFavouritePlaceLabel = (name, address) => [\n name || (address && address.split(',')[0]),\n typeof address === 'string'\n ? address.replace(new RegExp(`${escapeRegExp(name)}([ ,]|$)+`), '')\n : '',\n];\n\n/**\n * Format suggestion-pair [name, address] by `suggestion.layer`.\n *\n * @name getNameLabel\n * @param {LocationProperties} suggestion\n * @param {boolean} [plain]\n *\n * @returns {Array.<string>} Formatted label.\n */\nexport const getNameLabel = memoize(\n (suggestion, plain = false) => {\n switch (suggestion.layer) {\n case 'currentPosition':\n return [suggestion.labelId, suggestion.address];\n case 'selectFromMap':\n case 'ownLocations':\n case 'back':\n return [suggestion.labelId];\n case 'favouritePlace':\n return formatFavouritePlaceLabel(suggestion.name, suggestion.address);\n case 'favouriteVehicleRentalStation':\n case 'bikestation':\n return [suggestion.name];\n case 'favouriteRoute':\n case 'route-BUS':\n case 'route-TRAM':\n case 'route-RAIL':\n case 'route-SUBWAY':\n case 'route-FERRY':\n case 'route-FUNICULAR':\n case 'route-AIRPLANE':\n return !plain && suggestion.shortName\n ? [\n suggestion.gtfsId,\n suggestion.mode.toLowerCase(),\n suggestion.longName,\n ]\n : [\n suggestion.shortName,\n suggestion.longName,\n suggestion.agency ? suggestion.agency.name : undefined,\n ];\n case 'venue':\n case 'address':\n case 'street':\n return [\n suggestion.name,\n suggestion.label.replace(\n new RegExp(`${escapeRegExp(suggestion.name)}(,)?( )?`),\n '',\n ),\n ];\n case 'favouriteStop':\n case 'stop':\n return plain\n ? [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ]\n : [\n suggestion.name,\n suggestion.id,\n getStopCode(suggestion),\n getLocaladmin(suggestion),\n ];\n case 'favouriteStation':\n case 'station':\n default:\n return [\n suggestion.name ||\n suggestion.label ||\n (suggestion.address && suggestion.address.split(',')[0]),\n getLocaladmin(suggestion),\n ];\n }\n },\n (item, plain) => {\n const i = cloneDeep(item);\n i.plain = plain;\n return i;\n },\n);\n\n/**\n * Checks that features are unique by label\n *\n * @name uniqByLabel\n * @param {Array} features Array of features\n * @returns {Array} Array of unique features\n * @example\n * digitransit-search-util.uniqByLabel(features);\n * //= Array(2)\n */\nexport default function uniqByLabel(features) {\n return uniqWith(features, (feat1, feat2) => {\n if (feat1.type === 'FutureRoute' || feat2.type === 'FutureRoute') {\n return false;\n }\n return (\n isEqual(getNameLabel(feat1.properties), getNameLabel(feat2.properties)) &&\n feat1.properties.layer === feat2.properties.layer\n );\n });\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","/* eslint sort-keys: \"error\" */\nconst translations = {\n de: {\n translation: {\n cancel: 'Abbrechen',\n delete: 'Löschen',\n 'delete-place-header': 'Wollen Sie den Favoriten löschen?',\n 'delete-place-name': 'Lösche Favorit: {{favourite.name}}',\n 'edit-place-name': 'Bearbeite Favorit: {{favourite.name}}',\n 'edit-places': 'Bearbeite Favoriten',\n },\n },\n en: {\n translation: {\n cancel: 'Cancel',\n delete: 'Delete',\n 'delete-place-header': 'Do you want to delete the place?',\n 'delete-place-name': 'Delete place: {{favourite.name}}',\n down: 'Move favourite down',\n 'edit-place-name': 'Edit place: {{favourite.name}}',\n 'edit-places': 'Edit places',\n up: 'Move favourite up',\n },\n },\n fi: {\n translation: {\n cancel: 'Peruuta',\n delete: 'Poista',\n 'delete-place-header': 'Haluatko poistaa paikan?',\n 'delete-place-name': 'Poista paikka: {{favourite.name}}',\n down: 'Siirrä suosikkisijaintia alaspäin',\n 'edit-place-name': 'Muokkaa paikkaa: {{favourite.name}}',\n 'edit-places': 'Muokkaa paikkoja',\n up: 'Siirrä suosikkisijaintia ylöpäin',\n },\n },\n pl: {\n translation: {\n cancel: 'Anuluj',\n delete: 'Usuń',\n 'delete-place-header': 'Czy na pewno chcesz usunąć to miejsce?',\n 'delete-place-name': 'Usuń miejsce: {{favourite.name}}',\n down: 'Przenieś ulubione niżej',\n 'edit-place-name': 'Edytuj miejsce: {{favourite.name}}',\n 'edit-places': 'Edytuj miejsca',\n up: 'Przenieś ulubione wyżej',\n },\n },\n sv: {\n translation: {\n cancel: 'Avbryt',\n delete: 'Ta bort',\n 'delete-place-header': 'Vill du ta bort platsen?',\n 'delete-place-name': 'Ta bort platsen: {{favourite.name}}',\n down: 'Flytta favoriten nedåt',\n 'edit-place-name': 'Edit place: {{favourite.name}}',\n 'edit-places': 'Redigera platser',\n up: 'Flytta favoriten uppåt',\n },\n },\n};\n\nexport default translations;\n","import { createInstance } from 'i18next';\nimport translations from './translations';\n\nconst i18n = createInstance({\n fallbackLng: 'fi',\n // debug: true,\n resources: translations,\n defaultNS: 'translation',\n react: {\n useSuspense: true,\n },\n});\n\ni18n.init();\n\nexport default i18n;\n","import PropTypes from 'prop-types';\nimport { useTranslation } from 'react-i18next';\nimport { FlexColumn, FlexRow, Text } from '@hsl-fi/layout-primitives';\nimport { useSortable } from '@dnd-kit/react/sortable';\nimport Icon from '@digitransit-component/digitransit-component-icon';\nimport { formatFavouritePlaceLabel } from '@digitransit-search-util/digitransit-search-util-uniq-by-label';\nimport styles from './styles.scss';\nimport i18n from './i18n';\n\nconst getIconId = selectedIconId => {\n const prefixPos = selectedIconId ? selectedIconId.indexOf('icon_') : -1;\n return prefixPos > 0 ? selectedIconId.substring(prefixPos + 5) : 'place';\n};\n\n/**\n * One row of the favourites list. The visually hidden arrow buttons are a\n * keyboard alternative to dragging.\n */\nfunction FavouriteListItem({\n favourite,\n lang,\n onMoveUp = null,\n onMoveDown = null,\n onEdit,\n onDelete,\n index,\n}) {\n const { t } = useTranslation('translation', { i18n });\n const { ref } = useSortable({ id: favourite.favouriteId, index });\n const iconId = getIconId(favourite.selectedIconId);\n const [name, address] = formatFavouritePlaceLabel(\n favourite.name,\n favourite.address,\n );\n\n return (\n <li ref={ref} className={styles.item}>\n <div className={styles.dragHandle}>\n {onMoveUp && (\n <button\n type=\"button\"\n className={styles.arrow}\n aria-label={t('up', { lng: lang })}\n onClick={onMoveUp}\n >\n &uarr;\n </button>\n )}\n {onMoveDown && (\n <button\n type=\"button\"\n className={styles.arrow}\n aria-label={t('down', { lng: lang })}\n onClick={onMoveDown}\n >\n &darr;\n </button>\n )}\n <span className={styles.ellipsis}>\n <Icon img=\"ellipsis\" color=\"currentColor\" />\n </span>\n <span className={styles.placeIcon}>\n <Icon img={iconId} color=\"currentColor\" />\n </span>\n </div>\n <FlexColumn className={styles.text}>\n <Text variant=\"text-xs-bold\" as=\"p\" className={styles.name}>\n {name}\n </Text>\n <Text variant=\"text-xs\" as=\"p\" color=\"weak\" className={styles.address}>\n {address}\n </Text>\n </FlexColumn>\n <FlexRow alignItems=\"center\" flexShrink={0}>\n <button\n type=\"button\"\n className={styles.actionButton}\n aria-label={t('edit-place-name', { lng: lang, favourite })}\n onClick={onEdit}\n >\n <Icon img=\"edit\" color=\"currentColor\" />\n </button>\n <button\n type=\"button\"\n className={styles.actionButton}\n aria-label={t('delete-place-name', { lng: lang, favourite })}\n onClick={onDelete}\n >\n <Icon img=\"trash\" color=\"currentColor\" />\n </button>\n </FlexRow>\n </li>\n );\n}\n\nFavouriteListItem.propTypes = {\n favourite: PropTypes.shape({\n favouriteId: PropTypes.string,\n name: PropTypes.string,\n address: PropTypes.string,\n selectedIconId: PropTypes.string,\n }).isRequired,\n lang: PropTypes.string.isRequired,\n onEdit: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n onMoveUp: PropTypes.func,\n onMoveDown: PropTypes.func,\n index: PropTypes.number.isRequired,\n};\n\nexport default FavouriteListItem;\n","import { useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useTranslation } from 'react-i18next';\nimport { DragDropProvider } from '@dnd-kit/react';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqual from 'lodash/isEqual';\nimport omit from 'lodash/omit';\nimport { Spinner } from '@hsl-fi/loading-indicators';\nimport { Modal, ModalContent } from '@hsl-fi/dialog';\nimport DialogModal from '@digitransit-component/digitransit-component-dialog-modal';\nimport FavouriteListItem from './helpers/FavouriteListItem';\nimport i18n from './helpers/i18n';\nimport styles from './helpers/styles.scss';\n\n/**\n * A dialog for reordering, editing and deleting favourite places, built on\n * the HSL design system's Modal. Colors, typography and the mobile/desktop\n * layout are handled by the design system, so the dialog follows the active\n * deployment's theme.\n *\n * @example\n * <FavouriteEditingModal\n * isModalOpen={modalOpen}\n * handleClose={handleClose}\n * favourites={favourites}\n * updateFavourites={onUpdateFavourites}\n * deleteFavourite={onDeleteFavourite}\n * onEditSelected={onEditSelected}\n * isLoading={false}\n * lang=\"fi\"\n * />\n */\nfunction FavouriteEditingModal({\n isModalOpen,\n handleClose,\n updateFavourites,\n deleteFavourite,\n onEditSelected,\n favourites,\n isLoading,\n lang = 'fi',\n}) {\n const { t } = useTranslation('translation', { i18n });\n const [source, setSource] = useState(favourites);\n const [reordered, setReordered] = useState(null);\n const [selectedFavourite, setSelectedFavourite] = useState(null);\n const previousFavourites = useRef(favourites);\n\n // Drop the local order when the favourites change from outside\n if (!isEqual(source, favourites)) {\n setSource(favourites);\n setReordered(null);\n }\n const items = reordered || favourites;\n\n useEffect(() => {\n if (\n previousFavourites.current !== favourites &&\n !isEqual(previousFavourites.current, favourites) &&\n isEmpty(favourites)\n ) {\n handleClose();\n }\n previousFavourites.current = favourites;\n }, [favourites, handleClose]);\n\n const move = (index, direction) => {\n const copy = [...items];\n [copy[index], copy[index + direction]] = [\n copy[index + direction],\n copy[index],\n ];\n setReordered(copy);\n };\n\n const onDragEnd = event => {\n if (event.canceled) {\n return;\n }\n const { initialIndex, index } = event.operation.source?.sortable || {};\n if (initialIndex === undefined || initialIndex === index) {\n return;\n }\n const copy = [...items];\n const [moved] = copy.splice(initialIndex, 1);\n copy.splice(index, 0, moved);\n setReordered(copy);\n };\n\n const closeModal = () => {\n handleClose();\n const omitted = items.map(item => omit(item, ['chosen', 'selected']));\n if (!isEqual(omitted, favourites)) {\n updateFavourites(omitted);\n }\n };\n\n const closeDeleteDialog = () => setSelectedFavourite(null);\n\n return (\n <>\n <DialogModal\n headerText={t('delete-place-header', { lng: lang })}\n handleClose={() => {\n closeDeleteDialog();\n handleClose();\n }}\n isModalOpen={selectedFavourite !== null}\n dialogContent={\n selectedFavourite\n ? `${selectedFavourite.name}: ${selectedFavourite.address}`\n : ''\n }\n primaryButtonText={t('delete', { lng: lang })}\n primaryButtonOnClick={() => {\n deleteFavourite(selectedFavourite);\n closeDeleteDialog();\n }}\n secondaryButtonText={t('cancel', { lng: lang })}\n secondaryButtonOnClick={closeDeleteDialog}\n lang={lang}\n />\n <Modal\n open={isModalOpen && selectedFavourite === null}\n onOpenChange={open => {\n if (!open) {\n closeModal();\n }\n }}\n >\n <ModalContent\n lang={lang}\n title={t('edit-places', { lng: lang })}\n className={styles.modalContent}\n aria-describedby={undefined}\n >\n <div className={styles.listContainer}>\n <DragDropProvider onDragEnd={onDragEnd}>\n <ul className={styles.list}>\n {items.map((favourite, index) => (\n <FavouriteListItem\n key={favourite.favouriteId}\n index={index}\n favourite={favourite}\n lang={lang}\n onMoveUp={index > 0 ? () => move(index, -1) : null}\n onMoveDown={\n index < items.length - 1 ? () => move(index, 1) : null\n }\n onEdit={() => onEditSelected(favourite)}\n onDelete={() => setSelectedFavourite(favourite)}\n />\n ))}\n </ul>\n </DragDropProvider>\n {isLoading && (\n <div className={styles.overlay}>\n <Spinner />\n </div>\n )}\n </div>\n </ModalContent>\n </Modal>\n </>\n );\n}\n\nFavouriteEditingModal.propTypes = {\n /** Required. Whether the dialog is open.\n * @type {boolean} */\n isModalOpen: PropTypes.bool.isRequired,\n /** Required. Close modal.\n * @type {function} */\n handleClose: PropTypes.func.isRequired,\n /** Required. Called with the reordered favourites when the dialog is closed.\n * @type {function} */\n updateFavourites: PropTypes.func.isRequired,\n /** Required. Called with the favourite the user confirmed deleting.\n * @type {function} */\n deleteFavourite: PropTypes.func.isRequired,\n /** Required. Function that takes selected favourite object as parameter.\n * @type {function} */\n onEditSelected: PropTypes.func.isRequired,\n /** Required. Whether a save is in progress; shows a spinner over the list.\n * @type {boolean} */\n isLoading: PropTypes.bool.isRequired,\n /** Required.\n * @type {array<object>}\n * @property {string} type\n * @property {string} address\n * @property {string} gtfsId\n * @property {string} gid\n * @property {number} lat\n * @property {number} lon\n * @property {string} name\n * @property {string} selectedIconId\n * @property {string} favouriteId\n * @property {string} layer\n */\n favourites: PropTypes.arrayOf(\n PropTypes.shape({\n type: PropTypes.string,\n address: PropTypes.string,\n gtfsId: PropTypes.string,\n gid: PropTypes.string,\n lat: PropTypes.number,\n lon: PropTypes.number,\n name: PropTypes.string,\n selectedIconId: PropTypes.string,\n favouriteId: PropTypes.string,\n layer: PropTypes.string,\n }),\n ).isRequired,\n /** Optional. Language, fi, en or sv. Defaults to fi.\n * @type {string} */\n lang: PropTypes.string,\n};\n\nexport default FavouriteEditingModal;\n"],"names":["getLocaladmin","suggestion","localadmin","address","lastIndexOf","length","substring","getStopCode","id","code","undefined","indexOf","formatFavouritePlaceLabel","name","split","replace","RegExp","escapeRegExp","memoize","plain","layer","labelId","shortName","gtfsId","mode","toLowerCase","longName","agency","label","item","i","cloneDeep","translations","de","translation","cancel","delete","en","down","up","fi","pl","sv","i18n","createInstance","fallbackLng","resources","defaultNS","react","useSuspense","init","getIconId","selectedIconId","prefixPos","FavouriteListItem","favourite","lang","onMoveUp","onMoveDown","onEdit","onDelete","index","t","useTranslation","ref","useSortable","favouriteId","iconId","_jsxs","className","styles","children","dragHandle","_jsx","type","arrow","lng","onClick","ellipsis","Icon","img","color","placeIcon","FlexColumn","text","Text","variant","as","FlexRow","alignItems","flexShrink","actionButton","process","env","NODE_ENV","propTypes","PropTypes","shape","string","isRequired","func","number","FavouriteEditingModal","isModalOpen","handleClose","updateFavourites","deleteFavourite","onEditSelected","favourites","isLoading","source","setSource","useState","reordered","setReordered","selectedFavourite","setSelectedFavourite","previousFavourites","useRef","isEqual","items","useEffect","current","isEmpty","move","direction","copy","onDragEnd","event","canceled","initialIndex","operation","sortable","moved","splice","closeModal","omitted","map","omit","closeDeleteDialog","_Fragment","DialogModal","headerText","dialogContent","primaryButtonText","primaryButtonOnClick","secondaryButtonText","secondaryButtonOnClick","Modal","open","onOpenChange","ModalContent","title","modalContent","listContainer","DragDropProvider","list","overlay","Spinner","bool","arrayOf","gid","lat","lon"],"mappings":"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","x_google_ignoreList":[1]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digitransit-component/digitransit-component-favourite-editing-modal",
3
- "version": "9.0.1",
3
+ "version": "10.0.1",
4
4
  "description": "digitransit-component favourite-editing-modal module",
5
5
  "type": "module",
6
6
  "main": "index.cjs",
@@ -43,8 +43,9 @@
43
43
  "@digitransit-search-util/digitransit-search-util-uniq-by-label": "^2.1.8"
44
44
  },
45
45
  "peerDependencies": {
46
- "@digitransit-component/digitransit-component-dialog-modal": "^7.0.1",
47
- "@digitransit-component/digitransit-component-icon": "^5.0.1",
46
+ "@digitransit-component/digitransit-component-dialog-modal": "^7.0.2",
47
+ "@digitransit-component/digitransit-component-icon": "^5.0.2",
48
+ "@dnd-kit/react": "^0.5.1",
48
49
  "@hsl-fi/dialog": "^3.1.3",
49
50
  "@hsl-fi/layout-primitives": "^4.9.0",
50
51
  "@hsl-fi/loading-indicators": "^2.0.0",
@@ -52,8 +53,7 @@
52
53
  "lodash": "^4.18.1",
53
54
  "prop-types": "^15.8.1",
54
55
  "react": "^18.3.1",
55
- "react-i18next": "^12.3.1",
56
- "react-sortablejs": "^2.0.11"
56
+ "react-i18next": "^12.3.1"
57
57
  },
58
- "gitHead": "c54bf8071d5882f0a545f40eccc20882a8e59ccf"
58
+ "gitHead": "ff4039e9e01d7882d81c106fe10c63faadac8f51"
59
59
  }