@panoramax/web-viewer 3.2.3-develop-06e3ec22 → 3.2.3-develop-367cb599
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/CHANGELOG.md +3 -1
- package/build/index.css +2 -2
- package/build/index.css.map +1 -1
- package/build/index.js +85 -52
- package/build/index.js.map +1 -1
- package/build/widgets.html +1 -1
- package/docs/reference/components/ui/Loader.md +2 -0
- package/docs/reference/components/ui/ProgressBar.md +32 -0
- package/docs/reference/utils/URLHandler.md +7 -2
- package/docs/reference.md +1 -0
- package/docs/tutorials/migrate_v4.md +8 -0
- package/mkdocs.yml +1 -0
- package/package.json +1 -1
- package/public/widgets.html +5 -0
- package/src/components/core/Basic.css +2 -0
- package/src/components/core/Basic.js +2 -2
- package/src/components/core/CoverageMap.js +5 -1
- package/src/components/core/Editor.js +6 -0
- package/src/components/core/Viewer.css +8 -0
- package/src/components/core/Viewer.js +26 -6
- package/src/components/layout/CorneredGrid.js +1 -1
- package/src/components/ui/Loader.js +22 -22
- package/src/components/ui/ProgressBar.js +73 -0
- package/src/components/ui/index.js +1 -0
- package/src/img/loader_base.jpg +0 -0
- package/src/utils/URLHandler.js +8 -4
- package/src/utils/utils.js +9 -0
- package/tests/utils/URLHandler.test.js +51 -10
- package/src/img/loader_hd.jpg +0 -0
package/build/widgets.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Panoramax Widgets</title><style>body{font-family:sans-serif;padding-bottom:100px}h2{text-align:center}.test-bench{display:flex;width:100%;max-width:600px;margin:7px auto;justify-content:space-between;align-items:center}.test-bench h3{margin:0}hr.test-sep{width:100%;max-width:600px}</style><script defer="defer" src="index.js"></script><link href="index.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><h1>Panoramax widgets</h1><p>Test page for common Panoramax viewer widgets</p><h2>Button</h2><div class="test-bench"><h3>Text + click</h3><pnx-button onclick='alert("Stuff")'>Click to do stuff</pnx-button></div><div class="test-bench"><h3>Icon</h3><pnx-button>⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Active</h3><pnx-button active="true">Settings</pnx-button></div><div class="test-bench"><h3>CSS override</h3><div style="width:50%;display:flex;gap:5px;max-width:300px"><pnx-button style="width:50%">⚙️ Settings</pnx-button><pnx-button style="width:50%">🖨️ Print</pnx-button></div></div><hr class="test-sep"/><div class="test-bench"><h3>Full</h3><pnx-button kind="full">⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Full active</h3><pnx-button kind="full" active>⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Full L</h3><pnx-button kind="full" size="l">⚙️</pnx-button></div><div class="test-bench"><h3>Full XXL</h3><pnx-button kind="full" size="xxl">⚙️</pnx-button></div><div class="test-bench"><h3>Outline</h3><pnx-button kind="outline">⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Outline active</h3><pnx-button kind="outline" active>⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Outline L</h3><pnx-button kind="outline" size="l">⚙️</pnx-button></div><div class="test-bench"><h3>Outline XXL</h3><pnx-button kind="outline" size="xxl">⚙️</pnx-button></div><div class="test-bench"><h3>Flat</h3><pnx-button kind="flat">⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Flat active</h3><pnx-button kind="flat" active>⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Flat L</h3><pnx-button kind="flat" size="l">⚙️</pnx-button></div><div class="test-bench"><h3>Flat XXL</h3><pnx-button kind="flat" size="xxl">⚙️</pnx-button></div><h2>Link Button</h2><div class="test-bench"><h3>None set</h3><pnx-link-button>Click for nothing</pnx-link-button></div><div class="test-bench"><h3>All set</h3><pnx-link-button target="_blank" href="https://panoramax.fr" title="Do stuff">Click to do stuff</pnx-link-button></div><h2>Copy button</h2><div class="test-bench"><h3>Default + text</h3><pnx-copy-button text="copypasta1"></pnx-copy-button></div><div class="test-bench"><h3>Custom + text</h3><pnx-copy-button text="copypasta2">🌐 Share URL</pnx-copy-button></div><div class="test-bench"><h3>Default + input</h3><div style="display:flex;gap:5px;align-items:center"><input value="copypasta3" id="copy-input-1"/><pnx-copy-button input="copy-input-1"></pnx-copy-button></div></div><h2>Button Group</h2><div class="test-bench"><h3>Full Row x2</h3><div><pnx-button-group dir="row"><pnx-button>☹️</pnx-button><pnx-button>🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Full Row x3</h3><div><pnx-button-group dir="row"><pnx-button>☹️</pnx-button><pnx-button>😐</pnx-button><pnx-button>🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Full Row mixed</h3><div><pnx-button-group dir="row"><pnx-button>☹️</pnx-button><pnx-link-button>😐</pnx-link-button><pnx-copy-button>🙂</pnx-copy-button></pnx-button-group></div></div><div class="test-bench"><h3>Full Column x2</h3><div><pnx-button-group dir="column"><pnx-button>☹️</pnx-button><pnx-button>🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Full Column x3</h3><div><pnx-button-group dir="column"><pnx-button>☹️</pnx-button><pnx-button>😐</pnx-button><pnx-button>🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Full Column mixed</h3><div><pnx-button-group dir="column"><pnx-button>☹️</pnx-button><pnx-link-button>😐</pnx-link-button><pnx-copy-button>🙂</pnx-copy-button></pnx-button-group></div></div><hr class="test-sep"/><div class="test-bench"><h3>Outline Row x2</h3><div><pnx-button-group dir="row"><pnx-button kind="outline">☹️</pnx-button><pnx-button kind="outline">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Outline Row x3</h3><div><pnx-button-group dir="row"><pnx-button kind="outline">☹️</pnx-button><pnx-button kind="outline">😐</pnx-button><pnx-button kind="outline">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Outline Column x2</h3><div><pnx-button-group dir="column"><pnx-button kind="outline">☹️</pnx-button><pnx-button kind="outline">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Outline Column x3</h3><div><pnx-button-group dir="column"><pnx-button kind="outline">☹️</pnx-button><pnx-button kind="outline">😐</pnx-button><pnx-button kind="outline">🙂</pnx-button></pnx-button-group></div></div><hr class="test-sep"/><div class="test-bench"><h3>Flat Row x2</h3><div><pnx-button-group dir="row"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Flat Row x3</h3><div><pnx-button-group dir="row"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">😐</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Flat Column x2</h3><div><pnx-button-group dir="column"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Flat Column x3</h3><div><pnx-button-group dir="column"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">😐</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><hr class="test-sep"/><div class="test-bench"><h3>Row XL</h3><div><pnx-button-group size="xl" dir="row"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">😐</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Column XL</h3><div><pnx-button-group size="xl" dir="column"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">😐</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><h2>5-stars grade</h2><div class="test-bench"><h3>With a grade</h3><pnx-grade stars="5"/></div><div class="test-bench"><h3>Without a grade</h3><pnx-grade/></div><h2>Quality Score</h2><div class="test-bench"><h3>Classic no grade</h3><pnx-quality-score/></div><div class="test-bench"><h3>Classic 1/5</h3><pnx-quality-score grade="1"/></div><div class="test-bench"><h3>Classic 2/5</h3><pnx-quality-score grade="2"/></div><div class="test-bench"><h3>Classic 3/5</h3><pnx-quality-score grade="3"/></div><div class="test-bench"><h3>Classic 4/5</h3><pnx-quality-score grade="4"/></div><div class="test-bench"><h3>Classic 5/5</h3><pnx-quality-score grade="5"/></div><hr class="test-sep"/><div class="test-bench"><h3>Input</h3><pnx-quality-score input="qs"/></div><div class="test-bench"><h3>Input 1/5</h3><pnx-quality-score input="qs" grade="1"/></div><div class="test-bench"><h3>Input 2/5</h3><pnx-quality-score input="qs" grade="2"/></div><div class="test-bench"><h3>Input 3/5</h3><pnx-quality-score input="qs" grade="3"/></div><div class="test-bench"><h3>Input 4/5</h3><pnx-quality-score input="qs" grade="4"/></div><div class="test-bench"><h3>Input 5/5</h3><pnx-quality-score input="qs" grade="5"/></div><div class="test-bench"><h3>Input many</h3><pnx-quality-score input="qs" grade="1,3,5"/></div><h2>Search bar</h2><div class="test-bench"><h3>Simple</h3><pnx-search-bar placeholder="Start your search"></pnx-search-bar></div><div class="test-bench"><h3>With pre</h3><pnx-search-bar placeholder="Look for a place"><span slot="pre">🗺️</span></pnx-search-bar></div><div class="test-bench"><h3>Reduced</h3><pnx-search-bar reduceable reduced placeholder="Look for a place"></pnx-search-bar></div><hr class="test-sep"/><div class="test-bench"><h3>Size md full</h3><pnx-search-bar size="md" placeholder="Look for a place"><span slot="pre">🗺️</span></pnx-search-bar></div><div class="test-bench"><h3>Size md reduced</h3><pnx-search-bar size="md" reduceable reduced placeholder="Look for a place"></pnx-search-bar></div><div class="test-bench"><h3>Size xxl full</h3><pnx-search-bar size="xxl" placeholder="Look for a place"><span slot="pre">🗺️</span></pnx-search-bar></div><div class="test-bench"><h3>Size xxl reduced</h3><pnx-search-bar size="xxl" reduceable reduced placeholder="Look for a place"></pnx-search-bar></div></body></html>
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Panoramax Widgets</title><style>body{font-family:sans-serif;padding-bottom:100px}h2{text-align:center}.test-bench{display:flex;width:100%;max-width:600px;margin:7px auto;justify-content:space-between;align-items:center}.test-bench h3{margin:0}hr.test-sep{width:100%;max-width:600px}</style><script defer="defer" src="index.js"></script><link href="index.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><h1>Panoramax widgets</h1><p>Test page for common Panoramax viewer widgets</p><h2>Button</h2><div class="test-bench"><h3>Text + click</h3><pnx-button onclick='alert("Stuff")'>Click to do stuff</pnx-button></div><div class="test-bench"><h3>Icon</h3><pnx-button>⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Active</h3><pnx-button active="true">Settings</pnx-button></div><div class="test-bench"><h3>CSS override</h3><div style="width:50%;display:flex;gap:5px;max-width:300px"><pnx-button style="width:50%">⚙️ Settings</pnx-button><pnx-button style="width:50%">🖨️ Print</pnx-button></div></div><hr class="test-sep"/><div class="test-bench"><h3>Full</h3><pnx-button kind="full">⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Full active</h3><pnx-button kind="full" active>⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Full L</h3><pnx-button kind="full" size="l">⚙️</pnx-button></div><div class="test-bench"><h3>Full XXL</h3><pnx-button kind="full" size="xxl">⚙️</pnx-button></div><div class="test-bench"><h3>Outline</h3><pnx-button kind="outline">⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Outline active</h3><pnx-button kind="outline" active>⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Outline L</h3><pnx-button kind="outline" size="l">⚙️</pnx-button></div><div class="test-bench"><h3>Outline XXL</h3><pnx-button kind="outline" size="xxl">⚙️</pnx-button></div><div class="test-bench"><h3>Flat</h3><pnx-button kind="flat">⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Flat active</h3><pnx-button kind="flat" active>⚙️ Settings</pnx-button></div><div class="test-bench"><h3>Flat L</h3><pnx-button kind="flat" size="l">⚙️</pnx-button></div><div class="test-bench"><h3>Flat XXL</h3><pnx-button kind="flat" size="xxl">⚙️</pnx-button></div><h2>Link Button</h2><div class="test-bench"><h3>None set</h3><pnx-link-button>Click for nothing</pnx-link-button></div><div class="test-bench"><h3>All set</h3><pnx-link-button target="_blank" href="https://panoramax.fr" title="Do stuff">Click to do stuff</pnx-link-button></div><h2>Copy button</h2><div class="test-bench"><h3>Default + text</h3><pnx-copy-button text="copypasta1"></pnx-copy-button></div><div class="test-bench"><h3>Custom + text</h3><pnx-copy-button text="copypasta2">🌐 Share URL</pnx-copy-button></div><div class="test-bench"><h3>Default + input</h3><div style="display:flex;gap:5px;align-items:center"><input value="copypasta3" id="copy-input-1"/><pnx-copy-button input="copy-input-1"></pnx-copy-button></div></div><h2>Button Group</h2><div class="test-bench"><h3>Full Row x2</h3><div><pnx-button-group dir="row"><pnx-button>☹️</pnx-button><pnx-button>🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Full Row x3</h3><div><pnx-button-group dir="row"><pnx-button>☹️</pnx-button><pnx-button>😐</pnx-button><pnx-button>🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Full Row mixed</h3><div><pnx-button-group dir="row"><pnx-button>☹️</pnx-button><pnx-link-button>😐</pnx-link-button><pnx-copy-button>🙂</pnx-copy-button></pnx-button-group></div></div><div class="test-bench"><h3>Full Column x2</h3><div><pnx-button-group dir="column"><pnx-button>☹️</pnx-button><pnx-button>🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Full Column x3</h3><div><pnx-button-group dir="column"><pnx-button>☹️</pnx-button><pnx-button>😐</pnx-button><pnx-button>🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Full Column mixed</h3><div><pnx-button-group dir="column"><pnx-button>☹️</pnx-button><pnx-link-button>😐</pnx-link-button><pnx-copy-button>🙂</pnx-copy-button></pnx-button-group></div></div><hr class="test-sep"/><div class="test-bench"><h3>Outline Row x2</h3><div><pnx-button-group dir="row"><pnx-button kind="outline">☹️</pnx-button><pnx-button kind="outline">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Outline Row x3</h3><div><pnx-button-group dir="row"><pnx-button kind="outline">☹️</pnx-button><pnx-button kind="outline">😐</pnx-button><pnx-button kind="outline">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Outline Column x2</h3><div><pnx-button-group dir="column"><pnx-button kind="outline">☹️</pnx-button><pnx-button kind="outline">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Outline Column x3</h3><div><pnx-button-group dir="column"><pnx-button kind="outline">☹️</pnx-button><pnx-button kind="outline">😐</pnx-button><pnx-button kind="outline">🙂</pnx-button></pnx-button-group></div></div><hr class="test-sep"/><div class="test-bench"><h3>Flat Row x2</h3><div><pnx-button-group dir="row"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Flat Row x3</h3><div><pnx-button-group dir="row"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">😐</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Flat Column x2</h3><div><pnx-button-group dir="column"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Flat Column x3</h3><div><pnx-button-group dir="column"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">😐</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><hr class="test-sep"/><div class="test-bench"><h3>Row XL</h3><div><pnx-button-group size="xl" dir="row"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">😐</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><div class="test-bench"><h3>Column XL</h3><div><pnx-button-group size="xl" dir="column"><pnx-button kind="flat">☹️</pnx-button><pnx-button kind="flat">😐</pnx-button><pnx-button kind="flat">🙂</pnx-button></pnx-button-group></div></div><h2>5-stars grade</h2><div class="test-bench"><h3>With a grade</h3><pnx-grade stars="5"/></div><div class="test-bench"><h3>Without a grade</h3><pnx-grade/></div><h2>Quality Score</h2><div class="test-bench"><h3>Classic no grade</h3><pnx-quality-score/></div><div class="test-bench"><h3>Classic 1/5</h3><pnx-quality-score grade="1"/></div><div class="test-bench"><h3>Classic 2/5</h3><pnx-quality-score grade="2"/></div><div class="test-bench"><h3>Classic 3/5</h3><pnx-quality-score grade="3"/></div><div class="test-bench"><h3>Classic 4/5</h3><pnx-quality-score grade="4"/></div><div class="test-bench"><h3>Classic 5/5</h3><pnx-quality-score grade="5"/></div><hr class="test-sep"/><div class="test-bench"><h3>Input</h3><pnx-quality-score input="qs"/></div><div class="test-bench"><h3>Input 1/5</h3><pnx-quality-score input="qs" grade="1"/></div><div class="test-bench"><h3>Input 2/5</h3><pnx-quality-score input="qs" grade="2"/></div><div class="test-bench"><h3>Input 3/5</h3><pnx-quality-score input="qs" grade="3"/></div><div class="test-bench"><h3>Input 4/5</h3><pnx-quality-score input="qs" grade="4"/></div><div class="test-bench"><h3>Input 5/5</h3><pnx-quality-score input="qs" grade="5"/></div><div class="test-bench"><h3>Input many</h3><pnx-quality-score input="qs" grade="1,3,5"/></div><h2>Search bar</h2><div class="test-bench"><h3>Simple</h3><pnx-search-bar placeholder="Start your search"></pnx-search-bar></div><div class="test-bench"><h3>With pre</h3><pnx-search-bar placeholder="Look for a place"><span slot="pre">🗺️</span></pnx-search-bar></div><div class="test-bench"><h3>Reduced</h3><pnx-search-bar reduceable reduced placeholder="Look for a place"></pnx-search-bar></div><hr class="test-sep"/><div class="test-bench"><h3>Size md full</h3><pnx-search-bar size="md" placeholder="Look for a place"><span slot="pre">🗺️</span></pnx-search-bar></div><div class="test-bench"><h3>Size md reduced</h3><pnx-search-bar size="md" reduceable reduced placeholder="Look for a place"></pnx-search-bar></div><div class="test-bench"><h3>Size xxl full</h3><pnx-search-bar size="xxl" placeholder="Look for a place"><span slot="pre">🗺️</span></pnx-search-bar></div><div class="test-bench"><h3>Size xxl reduced</h3><pnx-search-bar size="xxl" reduceable reduced placeholder="Look for a place"></pnx-search-bar></div><h2>Progress bar</h2><div class="test-bench"><h3>Half</h3><pnx-progress-bar value="42"></pnx-progress-bar></div><div class="test-bench"><h3>Indeterminate</h3><pnx-progress-bar></pnx-progress-bar></div><div class="test-bench"><h3>Full</h3><pnx-progress-bar value="100"></pnx-progress-bar></div></body></html>
|
|
@@ -31,6 +31,8 @@ Component properties.
|
|
|
31
31
|
| Name | Type | Default | Description |
|
|
32
32
|
| --- | --- | --- | --- |
|
|
33
33
|
| [visible] | <code>boolean</code> | <code>true</code> | Is the loader visible to user ? |
|
|
34
|
+
| [no-label] | <code>boolean</code> | <code>false</code> | Set to true to avoid loading label display |
|
|
35
|
+
| [value] | <code>number</code> | | Progress bar percentage (0-100) |
|
|
34
36
|
|
|
35
37
|
<a name="Panoramax.components.ui.Loader+isVisible"></a>
|
|
36
38
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<a name="Panoramax.components.ui.ProgressBar"></a>
|
|
2
|
+
|
|
3
|
+
## Panoramax.components.ui.ProgressBar ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
|
|
4
|
+
**Kind**: static class of <code>Panoramax.components.ui</code>
|
|
5
|
+
**Extends**: <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
|
|
6
|
+
**Element**: pnx-progress-bar
|
|
7
|
+
|
|
8
|
+
* [.ProgressBar](#Panoramax.components.ui.ProgressBar) ⇐ <code>[lit.LitElement](https://lit.dev/docs/api/LitElement/)</code>
|
|
9
|
+
* [new ProgressBar()](#new_Panoramax.components.ui.ProgressBar_new)
|
|
10
|
+
* [.properties](#Panoramax.components.ui.ProgressBar+properties) : <code>Object</code>
|
|
11
|
+
|
|
12
|
+
<a name="new_Panoramax.components.ui.ProgressBar_new"></a>
|
|
13
|
+
|
|
14
|
+
### new ProgressBar()
|
|
15
|
+
Progress bar with nice styling.
|
|
16
|
+
|
|
17
|
+
**Example**
|
|
18
|
+
```html
|
|
19
|
+
<pnx-loader value="42" ._t=${viewer._t} />
|
|
20
|
+
```
|
|
21
|
+
<a name="Panoramax.components.ui.ProgressBar+properties"></a>
|
|
22
|
+
|
|
23
|
+
### progressBar.properties : <code>Object</code>
|
|
24
|
+
Component properties.
|
|
25
|
+
|
|
26
|
+
**Kind**: instance property of [<code>ProgressBar</code>](#Panoramax.components.ui.ProgressBar)
|
|
27
|
+
**Properties**
|
|
28
|
+
|
|
29
|
+
| Name | Type | Description |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| [value] | <code>number</code> | Progress bar percentage (0-100) or empty for indeterminate state |
|
|
32
|
+
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* [.listenToChanges()](#Panoramax.utils.URLHandler+listenToChanges)
|
|
10
10
|
* [.nextURLParams()](#Panoramax.utils.URLHandler+nextURLParams) ⇒ <code>object</code>
|
|
11
11
|
* [.nextURLString()](#Panoramax.utils.URLHandler+nextURLString) ⇒ <code>string</code>
|
|
12
|
-
* [.currentURLParams()](#Panoramax.utils.URLHandler+currentURLParams) ⇒ <code>object</code>
|
|
12
|
+
* [.currentURLParams([readFromHash])](#Panoramax.utils.URLHandler+currentURLParams) ⇒ <code>object</code>
|
|
13
13
|
* [.currentMapString()](#Panoramax.utils.URLHandler+currentMapString) ⇒ <code>string</code>
|
|
14
14
|
* [.currentPSVString()](#Panoramax.utils.URLHandler+currentPSVString) ⇒ <code>string</code>
|
|
15
15
|
* [.nextShortLink()](#Panoramax.utils.URLHandler+nextShortLink) ⇒ <code>str</code>
|
|
@@ -51,11 +51,16 @@ Compute next URL query string (based on `nextURLParams()`)
|
|
|
51
51
|
**Returns**: <code>string</code> - The query string
|
|
52
52
|
<a name="Panoramax.utils.URLHandler+currentURLParams"></a>
|
|
53
53
|
|
|
54
|
-
### urlHandler.currentURLParams() ⇒ <code>object</code>
|
|
54
|
+
### urlHandler.currentURLParams([readFromHash]) ⇒ <code>object</code>
|
|
55
55
|
Transforms current URL query string into key->value object
|
|
56
56
|
|
|
57
57
|
**Kind**: instance method of [<code>URLHandler</code>](#Panoramax.utils.URLHandler)
|
|
58
58
|
**Returns**: <code>object</code> - Key-value read from current URL query
|
|
59
|
+
|
|
60
|
+
| Param | Type | Default | Description |
|
|
61
|
+
| --- | --- | --- | --- |
|
|
62
|
+
| [readFromHash] | <code>boolean</code> | <code>false</code> | Switch to reading from hash URL part (for retro-compatibility) |
|
|
63
|
+
|
|
59
64
|
<a name="Panoramax.utils.URLHandler+currentMapString"></a>
|
|
60
65
|
|
|
61
66
|
### urlHandler.currentMapString() ⇒ <code>string</code>
|
package/docs/reference.md
CHANGED
|
@@ -47,6 +47,7 @@ Basic UI components:
|
|
|
47
47
|
- [MapMore](./reference/components/ui/MapMore.md) : advanced version of the browseable map.
|
|
48
48
|
- [Photo](./reference/components/ui/Photo.md) : the picture display (Photo Sphere Viewer).
|
|
49
49
|
- [Popup](./reference/components/ui/Popup.md) : an overlaying popup/modal.
|
|
50
|
+
- [ProgressBar](./reference/components/ui/ProgressBar.md) : a progress bar.
|
|
50
51
|
- [QualityScore](./reference/components/ui/QualityScore.md) : a A/B/C/D/E grade display and input.
|
|
51
52
|
- [SearchBar](./reference/components/ui/SearchBar.md) : a search bar.
|
|
52
53
|
- [TogglableGroup](./reference/components/ui/TogglableGroup.md) : an helper for showing a menu on button click.
|
|
@@ -120,3 +120,11 @@ Many functions were changed as well, in order to reduce source files size and ma
|
|
|
120
120
|
| `Viewer.toggleJOSMLive` | Made private in `(components.ui.widgets).Share` |
|
|
121
121
|
| `Viewer`'s set/toggle focus/unfocused | Managed through `(components.core).Viewer` `focus` attribute and `mini` property |
|
|
122
122
|
| `Viewer.setFilters` | `(components.ui).MapMore` |
|
|
123
|
+
|
|
124
|
+
## 🌍 URL parameters
|
|
125
|
+
|
|
126
|
+
URL parameters are now managed in the URL _search_ part (everything after the `?`), whereas in version 3 it was managed through _hash_ part (everything after the `#`). To ensure long-term compatibility, you may just replace the `#` in your URL by `?`. Here's an example of these new URL:
|
|
127
|
+
|
|
128
|
+
```urlencoded
|
|
129
|
+
https://panoramax.ign.fr/?background=streets&focus=map&map=9/48.6659/2.3237&speed=250
|
|
130
|
+
```
|
package/mkdocs.yml
CHANGED
|
@@ -91,6 +91,7 @@ nav:
|
|
|
91
91
|
- MapMore: 'reference/components/ui/MapMore.md'
|
|
92
92
|
- Photo: 'reference/components/ui/Photo.md'
|
|
93
93
|
- Popup: 'reference/components/ui/Popup.md'
|
|
94
|
+
- ProgressBar: 'reference/components/ui/ProgressBar.md'
|
|
94
95
|
- QualityScore: 'reference/components/ui/QualityScore.md'
|
|
95
96
|
- SearchBar: 'reference/components/ui/SearchBar.md'
|
|
96
97
|
- TogglableGroup: 'reference/components/ui/TogglableGroup.md'
|
package/package.json
CHANGED
package/public/widgets.html
CHANGED
|
@@ -261,5 +261,10 @@
|
|
|
261
261
|
<div class="test-bench"><h3>Size md reduced</h3><pnx-search-bar size="md" reduceable reduced placeholder="Look for a place"></pnx-search-bar></div>
|
|
262
262
|
<div class="test-bench"><h3>Size xxl full</h3><pnx-search-bar size="xxl" placeholder="Look for a place"><span slot="pre">🗺️</span></pnx-search-bar></div>
|
|
263
263
|
<div class="test-bench"><h3>Size xxl reduced</h3><pnx-search-bar size="xxl" reduceable reduced placeholder="Look for a place"></pnx-search-bar></div>
|
|
264
|
+
|
|
265
|
+
<h2>Progress bar</h2>
|
|
266
|
+
<div class="test-bench"><h3>Half</h3><pnx-progress-bar value="42"></pnx-progress-bar></div>
|
|
267
|
+
<div class="test-bench"><h3>Indeterminate</h3><pnx-progress-bar></pnx-progress-bar></div>
|
|
268
|
+
<div class="test-bench"><h3>Full</h3><pnx-progress-bar value="100"></pnx-progress-bar></div>
|
|
264
269
|
</body>
|
|
265
270
|
</html>
|
|
@@ -3,7 +3,7 @@ import API from "../../utils/API";
|
|
|
3
3
|
import { getTranslations } from "../../utils/i18n";
|
|
4
4
|
import { DEFAULT_TILES } from "../../utils/map";
|
|
5
5
|
import { createWebComp } from "../../utils/widgets";
|
|
6
|
-
import { isInternetFast } from "../../utils/utils";
|
|
6
|
+
import { isInIframe, isInternetFast } from "../../utils/utils";
|
|
7
7
|
import PACKAGE_JSON from "../../../package.json";
|
|
8
8
|
import "./Basic.css";
|
|
9
9
|
|
|
@@ -72,7 +72,7 @@ export default class Basic extends LitElement {
|
|
|
72
72
|
if(testing) { return; }
|
|
73
73
|
|
|
74
74
|
// Show loader
|
|
75
|
-
this.loader = createWebComp("pnx-loader", {_parent: this});
|
|
75
|
+
this.loader = createWebComp("pnx-loader", {_parent: this, "no-label": isInIframe() });
|
|
76
76
|
|
|
77
77
|
// Internet speed check
|
|
78
78
|
this._isInternetFast = null;
|
|
@@ -28,7 +28,10 @@ export default class CoverageMap extends Basic {
|
|
|
28
28
|
super();
|
|
29
29
|
|
|
30
30
|
this._mapContainer = document.createElement("div");
|
|
31
|
-
this.onceAPIReady().then(() =>
|
|
31
|
+
this.onceAPIReady().then(() => {
|
|
32
|
+
this.loader.setAttribute("value", 30);
|
|
33
|
+
this._initMap();
|
|
34
|
+
});
|
|
32
35
|
|
|
33
36
|
// Events handlers
|
|
34
37
|
this.addEventListener("select", this._onSelect.bind(this));
|
|
@@ -73,6 +76,7 @@ export default class CoverageMap extends Basic {
|
|
|
73
76
|
|
|
74
77
|
this.map = new MyMap(this, this._mapContainer, mapOptions);
|
|
75
78
|
this.map.addControl(new NavigationControl({ showCompass: false }));
|
|
79
|
+
this.loader.setAttribute("value", 70);
|
|
76
80
|
this.map.waitForEnoughMapLoaded().then(() => {
|
|
77
81
|
this.map.reloadLayersStyles();
|
|
78
82
|
this.loader.dismiss();
|
|
@@ -61,6 +61,8 @@ export default class Editor extends Basic {
|
|
|
61
61
|
this._mapContainer = document.createElement("div");
|
|
62
62
|
|
|
63
63
|
this.onceAPIReady().then(() => {
|
|
64
|
+
this.loader.setAttribute("value", 30);
|
|
65
|
+
|
|
64
66
|
// Check sequence ID is set
|
|
65
67
|
if(!this.sequence) { this.loader.dismiss({}, "No sequence is selected"); }
|
|
66
68
|
|
|
@@ -112,6 +114,7 @@ export default class Editor extends Basic {
|
|
|
112
114
|
zoom: 15, // Hack to avoid _initMapPosition call
|
|
113
115
|
});
|
|
114
116
|
linkMapAndPhoto(this);
|
|
117
|
+
this.loader.setAttribute("value", 50);
|
|
115
118
|
this._loadSequence();
|
|
116
119
|
this.map.once("load", () => {
|
|
117
120
|
if(this.map.hasTwoBackgrounds()) { this._addMapBackgroundWidget(); }
|
|
@@ -191,7 +194,10 @@ export default class Editor extends Basic {
|
|
|
191
194
|
* @private
|
|
192
195
|
*/
|
|
193
196
|
_loadSequence() {
|
|
197
|
+
this.loader.setAttribute("value", 60);
|
|
194
198
|
return this.api.getSequenceItems(this.sequence).then(seq => {
|
|
199
|
+
this.loader.setAttribute("value", 80);
|
|
200
|
+
|
|
195
201
|
// Hide loader after source load
|
|
196
202
|
this.map.once("sourcedata", () => {
|
|
197
203
|
this.map.setPaintProperty("geovisio_editor_sequences", "line-color", this.map._getLayerColorStyle("sequences"));
|
|
@@ -107,3 +107,11 @@ pnx-viewer:not(pnx-viewer[focus="pic"]) .pnx-only-psv {
|
|
|
107
107
|
pnx-viewer .pnx-map .maplibregl-ctrl-attrib {
|
|
108
108
|
display: none;
|
|
109
109
|
}
|
|
110
|
+
|
|
111
|
+
/* Override geosearch sizing */
|
|
112
|
+
@media screen and (max-width: 576px) {
|
|
113
|
+
pnx-widget-geosearch pnx-search-bar:not([reduced])::part(container) {
|
|
114
|
+
width: 250px;
|
|
115
|
+
max-width: 40vw;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -8,6 +8,7 @@ import Basic from "./Basic";
|
|
|
8
8
|
import Photo, { PSV_DEFAULT_ZOOM, PSV_ANIM_DURATION } from "../ui/Photo";
|
|
9
9
|
import MapMore from "../ui/MapMore";
|
|
10
10
|
import { initMapKeyboardHandler } from "../../utils/map";
|
|
11
|
+
import { isNullId } from "../../utils/utils";
|
|
11
12
|
import { createWebComp } from "../../utils/widgets";
|
|
12
13
|
import { fa } from "../../utils/widgets";
|
|
13
14
|
import { faPanorama } from "@fortawesome/free-solid-svg-icons/faPanorama";
|
|
@@ -112,7 +113,7 @@ export default class Viewer extends Basic {
|
|
|
112
113
|
slot: "bottom-left",
|
|
113
114
|
_parent: this,
|
|
114
115
|
onexpand: this._onMiniExpand.bind(this),
|
|
115
|
-
collapsed: this.picture ?
|
|
116
|
+
collapsed: isNullId(this.picture) ? true : undefined
|
|
116
117
|
});
|
|
117
118
|
this.mini.addEventListener("expand", this._toggleFocus.bind(this));
|
|
118
119
|
this.grid.appendChild(this.mini);
|
|
@@ -135,9 +136,10 @@ export default class Viewer extends Basic {
|
|
|
135
136
|
this._moveChildToGrid();
|
|
136
137
|
|
|
137
138
|
this.onceAPIReady().then(async () => {
|
|
139
|
+
this.loader.setAttribute("value", 30);
|
|
138
140
|
this._initParams = new InitParameters(
|
|
139
141
|
InitParameters.GetComponentProperties(Viewer, this),
|
|
140
|
-
this.urlHandler?.currentURLParams()
|
|
142
|
+
Object.assign({}, this.urlHandler?.currentURLParams(), this.urlHandler?.currentURLParams(true))
|
|
141
143
|
);
|
|
142
144
|
|
|
143
145
|
const myInitParams = this._initParams.getParentInit();
|
|
@@ -153,7 +155,11 @@ export default class Viewer extends Basic {
|
|
|
153
155
|
|
|
154
156
|
// Init various widgets
|
|
155
157
|
if(myInitParams.widgets !== "false") {
|
|
156
|
-
this.grid.appendChild(createWebComp("pnx-widget-zoom", {
|
|
158
|
+
this.grid.appendChild(createWebComp("pnx-widget-zoom", {
|
|
159
|
+
slot: this.isHeightSmall() ? "top-left" : "bottom-right",
|
|
160
|
+
class: this.isHeightSmall() ? "pnx-only-map pnx-print-hidden" : "pnx-print-hidden",
|
|
161
|
+
_parent: this
|
|
162
|
+
}));
|
|
157
163
|
this.grid.appendChild(createWebComp("pnx-widget-share", {slot: "bottom-right", class: "pnx-print-hidden", _parent: this}));
|
|
158
164
|
|
|
159
165
|
if(this.map) {
|
|
@@ -215,9 +221,12 @@ export default class Viewer extends Basic {
|
|
|
215
221
|
super.attributeChangedCallback(name, old, value);
|
|
216
222
|
|
|
217
223
|
// First pic load : show map in mini component
|
|
218
|
-
if(name === "picture" && old
|
|
224
|
+
if(name === "picture" && isNullId(old) && !isNullId(value)) {
|
|
219
225
|
this.mini.removeAttribute("collapsed");
|
|
220
226
|
}
|
|
227
|
+
if(name === "picture" && isNullId(value) && this.map && this.isMapWide()) {
|
|
228
|
+
this.mini.classList.add("pnx-hidden");
|
|
229
|
+
}
|
|
221
230
|
if(name === "focus") {
|
|
222
231
|
this._setFocus(value);
|
|
223
232
|
}
|
|
@@ -325,7 +334,10 @@ export default class Viewer extends Basic {
|
|
|
325
334
|
},
|
|
326
335
|
...this._initParams.getPSVInit()
|
|
327
336
|
});
|
|
328
|
-
this.oncePSVReady().then(() =>
|
|
337
|
+
this.oncePSVReady().then(() => {
|
|
338
|
+
this.loader.setAttribute("value", 50);
|
|
339
|
+
alterPSVState(this.psv, this._initParams.getPSVPostInit());
|
|
340
|
+
});
|
|
329
341
|
}
|
|
330
342
|
catch(e) {
|
|
331
343
|
let err = !PSSystem.isWebGLSupported ? this._t.pnx.error_webgl : this._t.pnx.error_psv;
|
|
@@ -342,7 +354,10 @@ export default class Viewer extends Basic {
|
|
|
342
354
|
async _initMap() {
|
|
343
355
|
await new Promise(resolve => {
|
|
344
356
|
this.map = new MapMore(this, this.mapContainer, this._initParams.getMapInit());
|
|
345
|
-
this.map.once("users-changed",
|
|
357
|
+
this.map.once("users-changed", () => {
|
|
358
|
+
this.loader.setAttribute("value", 75);
|
|
359
|
+
resolve();
|
|
360
|
+
});
|
|
346
361
|
});
|
|
347
362
|
|
|
348
363
|
alterMapState(this.map, this._initParams.getMapPostInit());
|
|
@@ -609,6 +624,10 @@ export default class Viewer extends Basic {
|
|
|
609
624
|
// Add PSV to mini
|
|
610
625
|
this.mini.appendChild(this.psvContainer);
|
|
611
626
|
this.mini.icon = fa(faPanorama);
|
|
627
|
+
|
|
628
|
+
// Hide mini icon if no picture selected
|
|
629
|
+
if(isNullId(this.picture)) { this.mini.classList.add("pnx-hidden"); }
|
|
630
|
+
else { this.mini.classList.remove("pnx-hidden"); }
|
|
612
631
|
|
|
613
632
|
this.map.getCanvas().focus();
|
|
614
633
|
}
|
|
@@ -629,6 +648,7 @@ export default class Viewer extends Basic {
|
|
|
629
648
|
this.grid.appendChild(this.psvContainer);
|
|
630
649
|
|
|
631
650
|
// Add map to mini
|
|
651
|
+
this.mini.classList.remove("pnx-hidden");
|
|
632
652
|
this.mini.appendChild(this.mapContainer);
|
|
633
653
|
this.mini.icon = fa(faMap);
|
|
634
654
|
|
|
@@ -64,7 +64,7 @@ export default class CorneredGrid extends LitElement {
|
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
.row.bottom .corner:not(.middle) { flex-direction: column; }
|
|
67
|
-
.row.bottom .corner.left { justify-content: flex-
|
|
67
|
+
.row.bottom .corner.left { flex-direction: column-reverse; justify-content: flex-start; align-items: flex-start; }
|
|
68
68
|
.row.bottom .corner.middle { justify-content: center; align-items: flex-end; }
|
|
69
69
|
.row.bottom .corner.right { justify-content: flex-end; align-items: flex-end; }
|
|
70
70
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { LitElement, html, css } from "lit";
|
|
1
|
+
import { LitElement, html, css, unsafeCSS, nothing } from "lit";
|
|
2
2
|
import LogoDead from "../../img/logo_dead.svg";
|
|
3
|
-
import
|
|
3
|
+
import LoaderBg from "../../img/loader_base.jpg";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Loader component display a full page covering for user waiting.
|
|
@@ -21,13 +21,16 @@ export default class Loader extends LitElement {
|
|
|
21
21
|
display: flex;
|
|
22
22
|
flex-direction: column;
|
|
23
23
|
justify-content: center;
|
|
24
|
-
gap:
|
|
24
|
+
gap: 10px;
|
|
25
25
|
align-items: center;
|
|
26
|
-
background:
|
|
26
|
+
background-image: url('${unsafeCSS(LoaderBg)}');
|
|
27
|
+
background-repeat: no-repeat;
|
|
28
|
+
background-size: cover;
|
|
29
|
+
background-position: center;
|
|
27
30
|
z-index: 200;
|
|
28
31
|
font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
|
|
29
32
|
font-weight: 550;
|
|
30
|
-
color:
|
|
33
|
+
color: var(--black);
|
|
31
34
|
font-size: 1.4em;
|
|
32
35
|
text-align: center;
|
|
33
36
|
visibility: hidden;
|
|
@@ -38,24 +41,14 @@ export default class Loader extends LitElement {
|
|
|
38
41
|
opacity: 1;
|
|
39
42
|
}
|
|
40
43
|
|
|
41
|
-
/* Flashing text */
|
|
42
44
|
div.label {
|
|
43
|
-
|
|
45
|
+
background-color: rgba(255,255,255,0.5);
|
|
46
|
+
box-shadow: white 0 0 10px;
|
|
47
|
+
padding: 3px 10px;
|
|
48
|
+
border-radius: 50px;
|
|
44
49
|
}
|
|
45
|
-
@keyframes blinker { 50% { opacity: 0.3; } }
|
|
46
|
-
|
|
47
50
|
/* Logo */
|
|
48
|
-
img.logo {
|
|
49
|
-
width: 150px;
|
|
50
|
-
animation: rotating 1.4s linear infinite;
|
|
51
|
-
}
|
|
52
|
-
@keyframes rotating {
|
|
53
|
-
from { transform: rotate(0deg); }
|
|
54
|
-
to { transform: rotate(360deg); }
|
|
55
|
-
}
|
|
56
|
-
img.logo-dead {
|
|
57
|
-
width: 200px;
|
|
58
|
-
}
|
|
51
|
+
img.logo-dead { width: 100px; }
|
|
59
52
|
`;
|
|
60
53
|
|
|
61
54
|
/**
|
|
@@ -63,19 +56,25 @@ export default class Loader extends LitElement {
|
|
|
63
56
|
* @memberof Panoramax.components.ui.Loader#
|
|
64
57
|
* @type {Object}
|
|
65
58
|
* @property {boolean} [visible=true] Is the loader visible to user ?
|
|
59
|
+
* @property {boolean} [no-label=false] Set to true to avoid loading label display
|
|
60
|
+
* @property {number} [value] Progress bar percentage (0-100)
|
|
66
61
|
*/
|
|
67
62
|
static properties = {
|
|
68
63
|
_mode: {state: true},
|
|
69
64
|
_label: {state: true},
|
|
70
65
|
_isLabelFun: {state: true},
|
|
71
66
|
visible: {type: Boolean, reflect: true},
|
|
67
|
+
"no-label": {type: Boolean},
|
|
68
|
+
value: {type: Number},
|
|
72
69
|
};
|
|
73
70
|
|
|
74
71
|
constructor() {
|
|
75
72
|
super();
|
|
76
73
|
this.visible = true;
|
|
74
|
+
this["no-label"] = false;
|
|
77
75
|
this._mode = "loading";
|
|
78
76
|
this._isLabelFun = false;
|
|
77
|
+
this.value = "";
|
|
79
78
|
}
|
|
80
79
|
|
|
81
80
|
/** @private */
|
|
@@ -104,6 +103,7 @@ export default class Loader extends LitElement {
|
|
|
104
103
|
clearTimeout(this._loaderLabelChanger);
|
|
105
104
|
|
|
106
105
|
if(!err) {
|
|
106
|
+
this.value = 100;
|
|
107
107
|
this._mode = "done";
|
|
108
108
|
this.visible = false;
|
|
109
109
|
this.style.transition = "all 0.5s";
|
|
@@ -179,8 +179,8 @@ export default class Loader extends LitElement {
|
|
|
179
179
|
}
|
|
180
180
|
|
|
181
181
|
return html`
|
|
182
|
-
<
|
|
183
|
-
|
|
182
|
+
<pnx-progress-bar .value=${this.value}></pnx-progress-bar>
|
|
183
|
+
${this["no-label"] ? nothing : html`<div class="label">${this._label}</div>`}
|
|
184
184
|
`;
|
|
185
185
|
}
|
|
186
186
|
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { LitElement, css, html } from "lit";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Progress bar with nice styling.
|
|
5
|
+
* @class Panoramax.components.ui.ProgressBar
|
|
6
|
+
* @element pnx-progress-bar
|
|
7
|
+
* @extends [lit.LitElement](https://lit.dev/docs/api/LitElement/)
|
|
8
|
+
* @example
|
|
9
|
+
* ```html
|
|
10
|
+
* <pnx-loader value="42" ._t=${viewer._t} />
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export default class ProgressBar extends LitElement {
|
|
14
|
+
/** @private */
|
|
15
|
+
static styles = css`
|
|
16
|
+
progress, progress::-webkit-progress-bar {
|
|
17
|
+
max-width: 80%;
|
|
18
|
+
width: 300px;
|
|
19
|
+
height: 16px;
|
|
20
|
+
appearance: none;
|
|
21
|
+
-webkit-appearance: none;
|
|
22
|
+
border: 1px solid var(--grey-semi-dark);
|
|
23
|
+
background-color: var(--grey);
|
|
24
|
+
border-radius: 8px;
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
padding: 3px;
|
|
27
|
+
box-sizing: border-box;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
progress::-webkit-progress-value,
|
|
31
|
+
progress::-moz-progress-bar {
|
|
32
|
+
background-color: var(--blue);
|
|
33
|
+
border-radius: 5px;
|
|
34
|
+
box-sizing: border-box;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
progress[value=""]::-webkit-progress-value,
|
|
38
|
+
progress[value=""]::-moz-progress-bar {
|
|
39
|
+
animation: indeterminateAnimation 1.5s infinite linear;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@keyframes indeterminateAnimation {
|
|
43
|
+
0% { margin-left: 0%; width: 2%; }
|
|
44
|
+
15% { margin-left: 0%; width: 20%; }
|
|
45
|
+
50% { margin-left: 40%; width: 20%; }
|
|
46
|
+
85% { margin-left: 80%; width: 20%; }
|
|
47
|
+
100% { margin-left: 98%; width: 2%; }
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Component properties.
|
|
53
|
+
* @memberof Panoramax.components.ui.ProgressBar#
|
|
54
|
+
* @type {Object}
|
|
55
|
+
* @property {number} [value] Progress bar percentage (0-100) or empty for indeterminate state
|
|
56
|
+
*/
|
|
57
|
+
static properties = {
|
|
58
|
+
value: {type: Number},
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/** @private */
|
|
62
|
+
render() {
|
|
63
|
+
return html`
|
|
64
|
+
<progress
|
|
65
|
+
value=${this.value >= 0 ? this.value : ""}
|
|
66
|
+
max="100"
|
|
67
|
+
title=${this._t?.map.loading}
|
|
68
|
+
></progress>
|
|
69
|
+
`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
customElements.define("pnx-progress-bar", ProgressBar);
|
|
@@ -13,6 +13,7 @@ export {default as Map} from "./Map";
|
|
|
13
13
|
export {default as MapMore} from "./MapMore";
|
|
14
14
|
export {default as Photo} from "./Photo";
|
|
15
15
|
export {default as Popup} from "./Popup";
|
|
16
|
+
export {default as ProgressBar} from "./ProgressBar";
|
|
16
17
|
export {default as QualityScore} from "./QualityScore";
|
|
17
18
|
export {default as SearchBar} from "./SearchBar";
|
|
18
19
|
export {default as TogglableGroup} from "./TogglableGroup";
|
package/src/img/loader_base.jpg
CHANGED
|
Binary file
|
package/src/utils/URLHandler.js
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
// List of supported parameters
|
|
6
6
|
const MANAGED_PARAMETERS = [
|
|
7
7
|
"speed", "nav", "focus", "pic", "xyz", "map",
|
|
8
|
-
"background", "users", "pic_score",
|
|
8
|
+
"background", "users", "pic_score", "s"
|
|
9
9
|
].concat(Object.values(MAP_FILTERS_JS2URL));
|
|
10
10
|
|
|
11
11
|
// Events to listen on parent and PSV
|
|
@@ -131,19 +131,20 @@ export default class URLHandler extends EventTarget {
|
|
|
131
131
|
|
|
132
132
|
/**
|
|
133
133
|
* Transforms current URL query string into key->value object
|
|
134
|
+
* @param {boolean} [readFromHash=false] Switch to reading from hash URL part (for retro-compatibility)
|
|
134
135
|
* @return {object} Key-value read from current URL query
|
|
135
136
|
* @memberof Panoramax.utils.URLHandler#
|
|
136
137
|
*/
|
|
137
|
-
currentURLParams() {
|
|
138
|
+
currentURLParams(readFromHash = false) {
|
|
138
139
|
// Get the current hash from location, stripped from its number sign
|
|
139
|
-
const hash = window.location.search.replace(
|
|
140
|
+
const hash = (readFromHash ? window.location.hash : window.location.search).replace(/^[?#]/, "");
|
|
140
141
|
|
|
141
142
|
// Split the parameter-styled hash into parts and find the value we need
|
|
142
143
|
let keyvals = {};
|
|
143
144
|
hash.split("&").map(
|
|
144
145
|
part => part.split("=")
|
|
145
146
|
)
|
|
146
|
-
.filter(part => part[0] !== undefined && part[0].length > 0)
|
|
147
|
+
.filter(part => part[0] !== undefined && part[0].length > 0 && MANAGED_PARAMETERS.includes(part[0]))
|
|
147
148
|
.forEach(part => {
|
|
148
149
|
keyvals[part[0]] = part[1];
|
|
149
150
|
});
|
|
@@ -321,6 +322,9 @@ export default class URLHandler extends EventTarget {
|
|
|
321
322
|
const unmanaged = this.getUnmanagedParameters(prevUrl);
|
|
322
323
|
nextUrl.search = this._parent ? this.nextURLString() + (unmanaged.length > 0 ? "&"+unmanaged : ""): "";
|
|
323
324
|
|
|
325
|
+
// Clear out hash if older parameters appear
|
|
326
|
+
if(Object.keys(this.currentURLParams(true)).length > 0) { nextUrl.hash = ""; }
|
|
327
|
+
|
|
324
328
|
// Skip hash update if no changes
|
|
325
329
|
if(prevUrl.search == nextUrl.search) { return; }
|
|
326
330
|
|
package/src/utils/utils.js
CHANGED
|
@@ -35,6 +35,15 @@ export const QUALITYSCORE_POND_RES = 4/5;
|
|
|
35
35
|
export const QUALITYSCORE_POND_GPS = 1/5;
|
|
36
36
|
|
|
37
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Checks if a picture or sequence ID is kinda-null.
|
|
40
|
+
* @param {string|null|undefined} id The ID to check
|
|
41
|
+
* @returns True if null-like
|
|
42
|
+
*/
|
|
43
|
+
export function isNullId(id) {
|
|
44
|
+
return [null, undefined, "", BASE_PANORAMA_ID].includes(id);
|
|
45
|
+
}
|
|
46
|
+
|
|
38
47
|
/**
|
|
39
48
|
* Find the grade associated to an input Quality Score definition.
|
|
40
49
|
* @param {number[]} ranges The QUALITYSCORE_*_VALUES definition
|