Skip to content

Commit ecaf811

Browse files
authored
Merge pull request #479 from Lemoncode/vnext
Version 0.9
2 parents 3a32491 + dbe9c1a commit ecaf811

File tree

91 files changed

+3110
-308
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+3110
-308
lines changed

editor.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
2121
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
2222
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
23-
<link rel="manifest" href="/site.webmanifest" />
23+
<link rel="manifest" href="/manifest.json" />
2424
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5" />
25-
<meta name="msapplication-TileColor" content="#da532c" />
26-
<meta name="theme-color" content="#ffffff" />
25+
<meta name="msapplication-TileColor" content="#ffffff" />
26+
<meta name="theme-color" content="#455a6c" />
2727

2828
<title>Mongo Modeler - Community Preview</title>
2929
</head>

index.html

Lines changed: 88 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
2121
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
2222
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
23-
<link rel="manifest" href="/site.webmanifest" />
23+
<link rel="manifest" href="/manifest.json" />
2424
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5" />
25-
<meta name="msapplication-TileColor" content="#da532c" />
26-
<meta name="theme-color" content="#ffffff" />
25+
<meta name="msapplication-TileColor" content="#ffffff" />
26+
<meta name="theme-color" content="#142231" />
2727
<title>Mongo Modeler</title>
2828
<meta
2929
name="description"
@@ -149,7 +149,12 @@
149149
font-weight: 600;
150150
letter-spacing: 0.2px;
151151
font-size: 20px;
152+
}
153+
.info__group {
154+
display: flex;
155+
align-items: center;
152156
margin-top: 3.5rem;
157+
gap: 0.8em;
153158
}
154159

155160
img {
@@ -185,14 +190,41 @@
185190
color: #73cc8f;
186191
font-weight: 600;
187192
}
193+
.hidden {
194+
display: none;
195+
}
188196

189197
@media screen and (max-width: 1280px) {
190198
.info__text {
191199
padding-top: 0;
192200
}
201+
.info__text h3 {
202+
font-size: 26px;
203+
}
204+
.info__text p {
205+
font-size: 20px;
206+
}
207+
.info__group {
208+
margin-top: 3.5rem;
209+
gap: 0.8rem;
210+
}
211+
.info__link {
212+
font-size: 18px;
213+
}
214+
.info__iframe {
215+
width: 60%;
216+
}
217+
.info__group {
218+
display: flex;
219+
align-items: start;
220+
flex-direction: column;
221+
}
222+
.install__span {
223+
padding-left: 18px;
224+
}
193225
}
194226

195-
@media screen and (max-width: 900px) {
227+
@media screen and (max-width: 1000px) {
196228
body {
197229
text-align: center;
198230
}
@@ -205,7 +237,9 @@
205237
width: 100%;
206238
}
207239
.info__iframe {
208-
width: 100%;
240+
width: 85%;
241+
margin-left: auto;
242+
margin-right: auto;
209243
}
210244
.info__link {
211245
margin-left: auto;
@@ -217,8 +251,19 @@
217251
.info__company {
218252
justify-content: center;
219253
}
254+
.install__span {
255+
padding-left: 0px;
256+
}
257+
.info__group {
258+
align-items: center;
259+
}
220260
}
221261

262+
@media screen and (max-width: 900px) {
263+
.info__iframe {
264+
width: 100%;
265+
}
266+
}
222267
@media screen and (max-width: 600px) {
223268
.info {
224269
padding: 0;
@@ -263,7 +308,6 @@
263308
line-height: 1.1;
264309
}
265310
}
266-
267311
@media (hover: hover) {
268312
a:hover {
269313
color: #ae7839;
@@ -313,12 +357,14 @@ <h3>
313357
source <span class="highlight">tool</span> for visualization of
314358
<span class="highlight">MongoDB</span> schema design
315359
</h3>
316-
317360
<p>Community preview</p>
318-
319-
<a href="./editor.html" class="info__link"
320-
>Launch MongoDB Designer</a
321-
>
361+
<div class="info__group">
362+
<a href="./editor.html" class="info__link"
363+
>Launch MongoDB Designer</a
364+
>
365+
<span id="install__span" class="install__span hidden">or</span>
366+
<a id="install" class="info__link hidden">Install on Device</a>
367+
</div>
322368
</div>
323369
<div class="info__iframe">
324370
<iframe
@@ -339,5 +385,36 @@ <h3>
339385
</p>
340386
</div>
341387
</main>
388+
<script>
389+
let installPrompt = null;
390+
const installButton = document.querySelector('#install');
391+
const installSpan = document.querySelector('#install__span');
392+
393+
window.addEventListener('beforeinstallprompt', event => {
394+
event.preventDefault();
395+
installPrompt = event;
396+
installButton.classList.remove('hidden');
397+
installSpan.classList.remove('hidden');
398+
});
399+
400+
function disableInAppInstallPrompt() {
401+
installPrompt = null;
402+
installButton.classList.add('hidden');
403+
installSpan.classList.add('hidden');
404+
}
405+
406+
installButton.addEventListener('click', async () => {
407+
if (!installPrompt) {
408+
return;
409+
}
410+
const result = await installPrompt.prompt();
411+
disableInAppInstallPrompt();
412+
});
413+
414+
window.addEventListener('appinstalled', () => {
415+
window.location.href = '/editor.html';
416+
disableInAppInstallPrompt();
417+
});
418+
</script>
342419
</body>
343420
</html>

public/android-chrome-128x128.png

4.57 KB
Loading

public/android-chrome-144x144.png

5.54 KB
Loading

public/android-chrome-72x72.png

2.59 KB
Loading

public/manifest.json

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{
2+
"lang": "en",
3+
"dir": "ltr",
4+
"name": "Mongo Modeler",
5+
"description": "A free, online Data Modeling tool for MongoDB",
6+
"start_url": "./editor.html",
7+
"display_override": ["minimal-ui", "fullscreen"],
8+
"display": "standalone",
9+
"icons": [
10+
{
11+
"src": "/android-chrome-512x512.png",
12+
"sizes": "512x512",
13+
"type": "image/png",
14+
"purpose": "maskable"
15+
},
16+
{
17+
"src": "/android-chrome-192x192.png",
18+
"sizes": "192x192",
19+
"type": "image/png"
20+
},
21+
{
22+
"src": "/android-chrome-144x144.png",
23+
"sizes": "144x144",
24+
"type": "image/png"
25+
},
26+
{
27+
"src": "/android-chrome-128x128.png",
28+
"sizes": "128x128",
29+
"type": "image/png"
30+
},
31+
{
32+
"src": "/android-chrome-72x72.png",
33+
"sizes": "72x72",
34+
"type": "image/png"
35+
}
36+
],
37+
"background_color": "#455a6c",
38+
"theme_color": "#455a6c"
39+
}

public/site.webmanifest

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/App.css

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
--input-border-color: var(--background-400);
9595
--edit-table-header: var(--background-900);
9696
--input-border-color-active: var(--primary-300);
97-
--input-radio-border-color: var(--primary-300);
97+
--input-radio-border-color: var(--background-400);
9898

9999
/* Modal */
100100
--background-dialog: var(--background-700);
@@ -173,9 +173,9 @@ body {
173173
--bg-input: #f3f5f7;
174174
--bg-input-disabled: #f0f2f5;
175175
--hover-input: #f3f5f7;
176-
--input-border-color: #b5b9bc;
176+
--input-border-color: var(--background-200);
177177
--input-border-color-active: var(--primary-500);
178-
--input-radio-border-color: var(--primary-500);
178+
--input-radio-border-color: var(--background-200);
179179

180180
/*Edit-table*/
181181
--edit-table-header: #e0e6eb;
@@ -194,7 +194,7 @@ body {
194194
--bg-checkbox: #e2e7eb;
195195

196196
/* Not working*/
197-
--hover-checkbox: var(--background-200);
197+
--hover-checkbox: var(--background-300);
198198

199199
/*About*/
200200
--color-project: var(--primary-500);

src/App.tsx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
import { MainScene } from '@/scenes';
2-
import { useThemeContext } from './core/providers';
2+
import {
3+
CanvasSchemaProvider,
4+
CanvasViewSettingsProvider,
5+
ModalDialogProvider,
6+
useThemeContext,
7+
} from './core/providers';
38

49
function App() {
510
const { theme } = useThemeContext();
611

712
return (
8-
<div className={theme.themeMode}>
9-
<MainScene />
10-
</div>
13+
<CanvasViewSettingsProvider>
14+
<CanvasSchemaProvider>
15+
<ModalDialogProvider>
16+
<div className={theme.themeMode}>
17+
<MainScene />
18+
</div>
19+
</ModalDialogProvider>
20+
</CanvasSchemaProvider>
21+
</CanvasViewSettingsProvider>
1122
);
1223
}
1324

src/common/components/checkbox/checkbox.component.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ interface Props {
66
onChange: () => void;
77
disabled?: boolean;
88
ariaLabelledby?: string;
9+
ariaLabel?: string;
910
}
1011

1112
export const Checkbox: React.FC<Props> = props => {
12-
const { id, onChange, disabled, checked, ariaLabelledby } = props;
13+
const { id, onChange, disabled, checked, ariaLabelledby, ariaLabel } = props;
1314

1415
return (
1516
<div className={`${classes.checkbox} ${disabled && classes.disabled}`}>
@@ -20,8 +21,9 @@ export const Checkbox: React.FC<Props> = props => {
2021
onChange={onChange}
2122
disabled={disabled}
2223
aria-labelledby={ariaLabelledby}
24+
aria-label={ariaLabel}
2325
/>
24-
<div>
26+
<div aria-hidden="true">
2527
<svg viewBox="0,0,50,50">
2628
<path d="M5 30 L 20 45 L 45 8"></path>
2729
</svg>

src/common/components/dropdown/components/option-group.component.tsx

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ interface Props {
1010
optionsListVisible: boolean;
1111
handleOptionClick: (option: DropdownOptionVm) => void;
1212
selectedOption?: string;
13+
modalRef: React.RefObject<HTMLUListElement>;
14+
label?: string;
1315
}
1416

1517
export const OptionGroup: React.FC<Props> = props => {
@@ -19,12 +21,19 @@ export const OptionGroup: React.FC<Props> = props => {
1921
optionsListVisible,
2022
handleOptionClick,
2123
selectedOption,
24+
modalRef,
25+
label,
2226
} = props;
2327

2428
return (
2529
<ul
2630
className={classes.options}
2731
style={{ display: optionsListVisible ? 'block' : 'none' }}
32+
ref={modalRef}
33+
onClick={e => e.stopPropagation()}
34+
id={`${name}-select`}
35+
role="listbox"
36+
aria-label={label}
2837
>
2938
<Option
3039
name={name}
@@ -44,22 +53,20 @@ interface OptionProps {
4453
}
4554

4655
const Option: React.FC<OptionProps> = props => {
47-
const { options, selectedOption, name, handleOptionClick } = props;
56+
const { options, selectedOption, handleOptionClick, name } = props;
4857

4958
return options.map(option => (
50-
<li key={option.id}>
59+
<li
60+
key={option.id}
61+
role="option"
62+
onClick={() => handleOptionClick(option)}
63+
aria-selected={selectedOption === option.id}
64+
id={`${name}-option-${option.id}`}
65+
>
66+
{option.label}
5167
<div className={classes.svg}>
5268
{selectedOption === option.id ? <Tick /> : ''}
5369
</div>
54-
<label>
55-
<input
56-
type="radio"
57-
name={name}
58-
value={option.id}
59-
onChange={() => handleOptionClick(option)}
60-
/>
61-
{option.label}
62-
</label>
6370
</li>
6471
));
6572
};

0 commit comments

Comments
 (0)