irie 0.0.59__py3-none-any.whl → 0.0.60__py3-none-any.whl

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.

Potentially problematic release.


This version of irie might be problematic. Click here for more details.

Files changed (32) hide show
  1. irie/apps/evaluation/models.py +7 -0
  2. irie/apps/events/views_events.py +2 -2
  3. irie/apps/inventory/models.py +1 -1
  4. irie/apps/inventory/views.py +7 -1
  5. irie/apps/prediction/forms/csi_upload.py +68 -0
  6. irie/apps/prediction/runners/__init__.py +6 -4
  7. irie/apps/prediction/runners/opensees/__init__.py +49 -14
  8. irie/apps/prediction/urls.py +6 -4
  9. irie/apps/prediction/views.py +248 -17
  10. irie/apps/static/assets/css/brace.css +1 -1
  11. irie/apps/static/assets/css/brace.css.map +1 -1
  12. irie/apps/static/assets/css/brace.min.css +1 -1
  13. irie/apps/static/assets/js/brace.js +101 -42
  14. irie/apps/templates/includes/footer.html +1 -1
  15. irie/apps/templates/inventory/asset-event-summary.html +7 -0
  16. irie/apps/templates/inventory/asset-on-map.html +22 -22
  17. irie/apps/templates/inventory/asset-on-map.js +115 -113
  18. irie/apps/templates/inventory/create-datum.html +27 -27
  19. irie/apps/templates/layouts/base.html +3 -3
  20. irie/apps/templates/prediction/create-model.html +32 -29
  21. irie/apps/templates/prediction/upload/confirm.html +93 -0
  22. irie/apps/templates/prediction/upload/step.html +119 -0
  23. irie/apps/templates/prediction/veux/navigator.html +54 -38
  24. irie/apps/templates/prediction/veux/navigator.js +222 -154
  25. irie/apps/templates/prediction/xara-profile.html +7 -3
  26. irie/core/settings.py +1 -0
  27. {irie-0.0.59.dist-info → irie-0.0.60.dist-info}/METADATA +7 -6
  28. {irie-0.0.59.dist-info → irie-0.0.60.dist-info}/RECORD +32 -29
  29. /irie/apps/prediction/{forms.py → forms/__init__.py} +0 -0
  30. {irie-0.0.59.dist-info → irie-0.0.60.dist-info}/WHEEL +0 -0
  31. {irie-0.0.59.dist-info → irie-0.0.60.dist-info}/entry_points.txt +0 -0
  32. {irie-0.0.59.dist-info → irie-0.0.60.dist-info}/top_level.txt +0 -0
@@ -545,27 +545,27 @@ function debounce(func, wait, immediate) {
545
545
  };
546
546
  };
547
547
 
548
- // initialization of Toasts
549
- document.addEventListener("DOMContentLoaded", function() {
550
- var toastElList = [].slice.call(document.querySelectorAll(".toast"));
548
+ // // initialization of Toasts
549
+ // document.addEventListener("DOMContentLoaded", function() {
550
+ // var toastElList = [].slice.call(document.querySelectorAll(".toast"));
551
551
 
552
- var toastList = toastElList.map(function(toastEl) {
553
- return new bootstrap.Toast(toastEl);
554
- });
552
+ // var toastList = toastElList.map(function(toastEl) {
553
+ // return new bootstrap.Toast(toastEl);
554
+ // });
555
555
 
556
- var toastButtonList = [].slice.call(document.querySelectorAll(".toast-btn"));
556
+ // var toastButtonList = [].slice.call(document.querySelectorAll(".toast-btn"));
557
557
 
558
- toastButtonList.map(function(toastButtonEl) {
559
- toastButtonEl.addEventListener("click", function() {
560
- var toastToTrigger = document.getElementById(toastButtonEl.dataset.target);
558
+ // toastButtonList.map(function(toastButtonEl) {
559
+ // toastButtonEl.addEventListener("click", function() {
560
+ // var toastToTrigger = document.getElementById(toastButtonEl.dataset.target);
561
561
 
562
- if (toastToTrigger) {
563
- var toast = bootstrap.Toast.getInstance(toastToTrigger);
564
- toast.show();
565
- }
566
- });
567
- });
568
- });
562
+ // if (toastToTrigger) {
563
+ // var toast = bootstrap.Toast.getInstance(toastToTrigger);
564
+ // toast.show();
565
+ // }
566
+ // });
567
+ // });
568
+ // });
569
569
 
570
570
  // Tabs navigation
571
571
 
@@ -582,7 +582,7 @@ function initNavs() {
582
582
  moving_div.appendChild(tab);
583
583
  item.appendChild(moving_div);
584
584
 
585
- var list_length = item.getElementsByTagName("li").length;
585
+ // var list_length = item.getElementsByTagName("li").length;
586
586
 
587
587
  moving_div.style.padding = '0px';
588
588
  moving_div.style.width = item.querySelector('li:nth-child(1)').offsetWidth + 'px';
@@ -767,6 +767,62 @@ window.onload = function() {
767
767
  }
768
768
  };
769
769
 
770
+
771
+ class IrieMainNav {
772
+ #iconNavbarSidenav;
773
+ #iconSidenav;
774
+ #sidenav;
775
+ #body;
776
+ #className = 'g-sidenav-pinned';
777
+
778
+ constructor() {
779
+ this.#iconNavbarSidenav = document.getElementById('iconNavbarSidenav');
780
+ this.#iconSidenav = document.getElementById('iconSidenav');
781
+ this.#sidenav = document.getElementById('sidenav-main');
782
+ this.#body = document.getElementsByTagName('body')[0];
783
+
784
+ if (this.#iconNavbarSidenav) {
785
+ this.#iconNavbarSidenav.addEventListener("click", () => this.toggleSidenav());
786
+ }
787
+
788
+ if (this.#iconSidenav) {
789
+ this.#iconSidenav.addEventListener("click", () => this.toggleSidenav());
790
+ }
791
+ }
792
+
793
+ toggleSidenav() {
794
+ if (this.#body.classList.contains(this.#className)) {
795
+ this.#body.classList.remove(this.#className);
796
+ setTimeout(() => {
797
+ this.#sidenav.classList.remove('bg-white');
798
+ }, 100);
799
+ this.#sidenav.classList.remove('bg-transparent');
800
+ } else {
801
+ this.#body.classList.add(this.#className);
802
+ this.#sidenav.classList.add('bg-white');
803
+ this.#sidenav.classList.remove('bg-transparent');
804
+ // this.#iconSidenav.classList.remove('d-none');
805
+ // this.navbarMinimize();
806
+ }
807
+ }
808
+
809
+ navbarMinimize() {
810
+ const el = this.#iconNavbarSidenav;
811
+ let sidenavShow = document.getElementsByClassName('g-sidenav-show')[0];
812
+
813
+ if (!el.getAttribute("checked")) {
814
+ sidenavShow.classList.remove('g-sidenav-pinned');
815
+ sidenavShow.classList.add('g-sidenav-hidden');
816
+ el.setAttribute("checked", "true");
817
+ } else {
818
+ sidenavShow.classList.remove('g-sidenav-hidden');
819
+ sidenavShow.classList.add('g-sidenav-pinned');
820
+ el.removeAttribute("checked");
821
+ }
822
+ }
823
+ }
824
+
825
+
770
826
  // Toggle Sidenav
771
827
  const iconNavbarSidenav = document.getElementById('iconNavbarSidenav');
772
828
  const iconSidenav = document.getElementById('iconSidenav');
@@ -774,29 +830,30 @@ const sidenav = document.getElementById('sidenav-main');
774
830
  let body = document.getElementsByTagName('body')[0];
775
831
  let className = 'g-sidenav-pinned';
776
832
 
777
- if (iconNavbarSidenav) {
778
- iconNavbarSidenav.addEventListener("click", toggleSidenav);
779
- }
780
-
781
- if (iconSidenav) {
782
- iconSidenav.addEventListener("click", toggleSidenav);
783
- }
784
-
785
- function toggleSidenav() {
786
- if (body.classList.contains(className)) {
787
- body.classList.remove(className);
788
- setTimeout(function() {
789
- sidenav.classList.remove('bg-white');
790
- }, 100);
791
- sidenav.classList.remove('bg-transparent');
792
-
793
- } else {
794
- body.classList.add(className);
795
- sidenav.classList.add('bg-white');
796
- sidenav.classList.remove('bg-transparent');
797
- iconSidenav.classList.remove('d-none');
798
- }
799
- }
833
+ const irieMainNav = new IrieMainNav();
834
+ // if (iconNavbarSidenav) {
835
+ // iconNavbarSidenav.addEventListener("click", toggleSidenav);
836
+ // }
837
+
838
+ // if (iconSidenav) {
839
+ // iconSidenav.addEventListener("click", toggleSidenav);
840
+ // }
841
+
842
+ // function toggleSidenav() {
843
+ // if (body.classList.contains(className)) {
844
+ // body.classList.remove(className);
845
+ // setTimeout(function() {
846
+ // sidenav.classList.remove('bg-white');
847
+ // }, 100);
848
+ // sidenav.classList.remove('bg-transparent');
849
+
850
+ // } else {
851
+ // body.classList.add(className);
852
+ // sidenav.classList.add('bg-white');
853
+ // sidenav.classList.remove('bg-transparent');
854
+ // iconSidenav.classList.remove('d-none');
855
+ // }
856
+ // }
800
857
 
801
858
  // Resize navbar color depends on configurator active type of sidenav
802
859
 
@@ -811,6 +868,7 @@ if (sidenav) {
811
868
  sidenav.classList.remove('bg-white');
812
869
  } else {
813
870
  sidenav.classList.add('bg-white');
871
+ sidenav.classList.remove('bg-transparent');
814
872
  }
815
873
  } else {
816
874
  sidenav.classList.add('bg-white');
@@ -821,7 +879,7 @@ if (sidenav) {
821
879
 
822
880
  // Deactivate sidenav type buttons on resize and small screens
823
881
  window.addEventListener("resize", sidenavTypeOnResize);
824
- window.addEventListener("load", sidenavTypeOnResize);
882
+ window.addEventListener("load", sidenavTypeOnResize);
825
883
 
826
884
  function sidenavTypeOnResize() {
827
885
  let elements = document.querySelectorAll('[onclick="sidebarType(this)"]');
@@ -833,6 +891,7 @@ function sidenavTypeOnResize() {
833
891
  elements.forEach(function(el) {
834
892
  el.classList.remove('disabled');
835
893
  });
894
+ // irieMainNav.navbarMinimize();
836
895
  }
837
896
  }
838
897
 
@@ -1,4 +1,4 @@
1
- <footer class="bg-white rounded shadow p-5 mb-2 mt-2 py-3">
1
+ <footer class="bg-white shadow p-5 mb-2 mt-2 py-3">
2
2
  <div class="row">
3
3
  <div class="col-10 col-md-8 col-xl-8 mb-0 mb-md-0">
4
4
  <p class="mb-0 text-left">
@@ -44,6 +44,13 @@
44
44
  class="btn btn-sm btn-outline-primary d-inline-flex align-items-center">
45
45
  Asset Profile
46
46
  </a>
47
+ <form method="POST" action="#">
48
+ {% csrf_token %}
49
+ <button type="submit" class="btn btn-sm btn-outline-primary d-inline-flex align-items-center">
50
+ <svg class="icon icon-xxs" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
51
+ Evaluate
52
+ </button>
53
+ </form>
47
54
  </div>
48
55
  </div>
49
56
 
@@ -1,29 +1,29 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
3
  <head>
4
- <title>Test Maps</title>
5
- <meta property="og:description" content="Use a custom style layer with babylon.js to add a 3D model to the map." />
6
- <meta charset='utf-8'>
7
- <meta name="viewport" content="width=device-width, initial-scale=1">
8
- <link rel='stylesheet' href='https://unpkg.com/maplibre-gl@5.2.0/dist/maplibre-gl.css' />
9
- <script src='https://unpkg.com/maplibre-gl@5.2.0/dist/maplibre-gl.js'></script>
10
- <style>
11
- body { margin: 0; padding: 0; }
12
- html, body, #map { height: 100%; }
13
- </style>
14
- {% if viewer == "three" %}
15
- <script type="importmap">
16
- {
17
- "imports": {
18
- "three": "https://cdn.jsdelivr.net/npm/three@0.169.0/build/three.module.js",
19
- "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.169.0/examples/jsm/"
20
- }
4
+ <title>Asset Map</title>
5
+ <meta property="og:description" content="Use a custom style layer with babylon.js to add a 3D model to the map." />
6
+ <meta charset='utf-8'>
7
+ <meta name="viewport" content="width=device-width, initial-scale=1">
8
+ <link rel='stylesheet' href='https://unpkg.com/maplibre-gl@5.2.0/dist/maplibre-gl.css' />
9
+ <script src='https://unpkg.com/maplibre-gl@5.2.0/dist/maplibre-gl.js'></script>
10
+ <style>
11
+ body { margin: 0; padding: 0; }
12
+ html, body, #map { height: 100%; margin: 0}
13
+ </style>
14
+ {% if viewer == "three" %}
15
+ <script type="importmap">
16
+ {
17
+ "imports": {
18
+ "three": "https://cdn.jsdelivr.net/npm/three@0.169.0/build/three.module.js",
19
+ "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.169.0/examples/jsm/"
21
20
  }
22
- </script>
23
- {% else %}
24
- <script src="https://unpkg.com/babylonjs@5.42.2/babylon.js"></script>
25
- <script src="https://unpkg.com/babylonjs-loaders@5.42.2/babylonjs.loaders.min.js"></script>
26
- {% endif %}
21
+ }
22
+ </script>
23
+ {% else %}
24
+ <script src="https://unpkg.com/babylonjs@5.42.2/babylon.js"></script>
25
+ <script src="https://unpkg.com/babylonjs-loaders@5.42.2/babylonjs.loaders.min.js"></script>
26
+ {% endif %}
27
27
  </head>
28
28
  <body>
29
29
  <div id="map" data-location="{{ location }}"
@@ -16,7 +16,7 @@ function createAssetLayerThreeJS(options) {
16
16
  const modelTransform = {
17
17
  translateX: modelCoord.x,
18
18
  translateY: modelCoord.y, //-25*modelScale,
19
- translateZ: modelCoord.z+100*modelScale, // 35
19
+ translateZ: modelCoord.z+35*modelScale, // 100*modelScale, // 35
20
20
  rotateX: modelRotate[0],
21
21
  rotateY: modelRotate[1],
22
22
  rotateZ: modelRotate[2],
@@ -267,122 +267,124 @@ function calculateDistanceMercatorToMeters(from, to) {
267
267
  return {dEastMeter, dNorthMeter};
268
268
  }
269
269
 
270
- const div = document.querySelector('#map');
271
- const modelOrigin = JSON.parse(div.dataset.location); // [-124.1014, 40.50303];
272
- var modelSource = undefined;
273
- if (div.dataset.renderSource)
274
- modelSource = div.dataset.renderSource;
275
- else
276
- modelSource = div.dataset.renderInline;
277
-
278
- const unitToMeter = 1/3.2808;
279
-
280
- const MAPTILER_KEY = 'get_your_own_OpIi9ZULNHzrESv6T2vL';
281
- const mapid = 'winter'; // 'dataviz'; // 'basic-v2'; // 'aquarelle';
282
- const map = (window.map = new maplibregl.Map({
283
- container: 'map',
284
- style: `https://api.maptiler.com/maps/${mapid}/style.json?key=${MAPTILER_KEY}`,
285
- zoom: 18,
286
- center: modelOrigin,
287
- zoom: 18,
288
- maxZoom: 30,
289
- maxPitch: 85,
290
- pitch: 77,
291
- // create the gl context with MSAA antialiasing, so custom layers are antialiased
292
- canvasContextAttributes: {antialias: true}
293
- }));
294
-
295
- // Make interaction the same as THREE OrbitControls
296
- map.dragPan.disable();
297
- map.dragRotate.enable({ pitchWithRotate: true });
298
- map.scrollZoom.enable({ around: 'pointer' });
299
- map.dragPan.enable({
300
- deceleration: 2000, // px/s²
301
- linearity: 0.3, // lower = snappier stop
302
- maxSpeed: 2000
303
- });
304
- map.scrollZoom.setWheelZoomRate(1/600); // slower mouse‐wheel zoom
305
- map.keyboard.enable(); // arrow keys to pan/zoom
306
- map.touchZoomRotate.enable(); // two-finger pinch & rotate
307
-
308
-
309
- //
310
- // Add Buildings
311
- //
270
+ document.addEventListener('DOMContentLoaded', () => {
271
+ const div = document.querySelector('#map');
272
+ const modelOrigin = JSON.parse(div.dataset.location); // [-124.1014, 40.50303];
273
+ var modelSource = undefined;
274
+ if (div.dataset.renderSource)
275
+ modelSource = div.dataset.renderSource;
276
+ else
277
+ modelSource = div.dataset.renderInline;
278
+
279
+ const unitToMeter = 1/3.2808;
280
+
281
+ const MAPTILER_KEY = 'get_your_own_OpIi9ZULNHzrESv6T2vL';
282
+ const mapid = 'winter'; // 'dataviz'; // 'basic-v2'; // 'aquarelle';
283
+ const map = (window.map = new maplibregl.Map({
284
+ container: 'map',
285
+ style: `https://api.maptiler.com/maps/${mapid}/style.json?key=${MAPTILER_KEY}`,
286
+ zoom: 18,
287
+ center: modelOrigin,
288
+ zoom: 18,
289
+ maxZoom: 30,
290
+ maxPitch: 85,
291
+ pitch: 77,
292
+ // create the gl context with MSAA antialiasing, so custom layers are antialiased
293
+ canvasContextAttributes: {antialias: true}
294
+ }));
312
295
 
313
- // The 'building' layer in the streets vector source contains building-height
314
- // data from OpenStreetMap.
315
- map.on('load', () => {
316
- // Insert the layer beneath any symbol layer.
317
- const layers = map.getStyle().layers;
318
-
319
- let labelLayerId;
320
- for (let i = 0; i < layers.length; i++) {
321
- if (layers[i].type === 'symbol' && layers[i].layout['text-field']) {
322
- labelLayerId = layers[i].id;
323
- break;
296
+ // Make interaction the same as THREE OrbitControls
297
+ map.dragPan.disable();
298
+ map.dragRotate.enable({ pitchWithRotate: true });
299
+ map.scrollZoom.enable({ around: 'pointer' });
300
+ map.dragPan.enable({
301
+ deceleration: 2000, // px/s²
302
+ linearity: 0.3, // lower = snappier stop
303
+ maxSpeed: 2000
304
+ });
305
+ map.scrollZoom.setWheelZoomRate(1/600); // slower mouse‐wheel zoom
306
+ map.keyboard.enable(); // arrow keys to pan/zoom
307
+ map.touchZoomRotate.enable(); // two-finger pinch & rotate
308
+
309
+
310
+ //
311
+ // Add Buildings
312
+ //
313
+
314
+ // The 'building' layer in the streets vector source contains building-height
315
+ // data from OpenStreetMap.
316
+ map.on('load', () => {
317
+ // Insert the layer beneath any symbol layer.
318
+ const layers = map.getStyle().layers;
319
+
320
+ let labelLayerId;
321
+ for (let i = 0; i < layers.length; i++) {
322
+ if (layers[i].type === 'symbol' && layers[i].layout['text-field']) {
323
+ labelLayerId = layers[i].id;
324
+ break;
325
+ }
324
326
  }
325
- }
326
327
 
327
- map.addSource('openmaptiles', {
328
- url: `https://api.maptiler.com/tiles/v3/tiles.json?key=${MAPTILER_KEY}`,
329
- type: 'vector',
328
+ map.addSource('openmaptiles', {
329
+ url: `https://api.maptiler.com/tiles/v3/tiles.json?key=${MAPTILER_KEY}`,
330
+ type: 'vector',
331
+ });
332
+
333
+ map.addLayer(
334
+ {
335
+ 'id': '3d-buildings',
336
+ 'source': 'openmaptiles',
337
+ 'source-layer': 'building',
338
+ 'type': 'fill-extrusion',
339
+ 'minzoom': 15,
340
+ 'filter': ['!=', ['get', 'hide_3d'], true],
341
+ 'paint': {
342
+ 'fill-extrusion-color': [
343
+ 'interpolate',
344
+ ['linear'],
345
+ ['get', 'render_height'], 0, 'lightgray', 200, 'royalblue', 400, 'lightblue'
346
+ ],
347
+ 'fill-extrusion-height': [
348
+ 'interpolate',
349
+ ['linear'],
350
+ ['zoom'],
351
+ 15,
352
+ 0,
353
+ 16,
354
+ ['get', 'render_height']
355
+ ],
356
+ 'fill-extrusion-base': ['case',
357
+ ['>=', ['get', 'zoom'], 16],
358
+ ['get', 'render_min_height'], 0
359
+ ]
360
+ }
361
+ },
362
+ labelLayerId
363
+ );
330
364
  });
331
365
 
332
- map.addLayer(
333
- {
334
- 'id': '3d-buildings',
335
- 'source': 'openmaptiles',
336
- 'source-layer': 'building',
337
- 'type': 'fill-extrusion',
338
- 'minzoom': 15,
339
- 'filter': ['!=', ['get', 'hide_3d'], true],
340
- 'paint': {
341
- 'fill-extrusion-color': [
342
- 'interpolate',
343
- ['linear'],
344
- ['get', 'render_height'], 0, 'lightgray', 200, 'royalblue', 400, 'lightblue'
345
- ],
346
- 'fill-extrusion-height': [
347
- 'interpolate',
348
- ['linear'],
349
- ['zoom'],
350
- 15,
351
- 0,
352
- 16,
353
- ['get', 'render_height']
354
- ],
355
- 'fill-extrusion-base': ['case',
356
- ['>=', ['get', 'zoom'], 16],
357
- ['get', 'render_min_height'], 0
358
- ]
359
- }
360
- },
361
- labelLayerId
362
- );
363
- });
364
366
 
365
-
366
- //
367
- // Add Asset
368
- //
369
- const worldAltitude = 0;
370
- // +x east, +y up, +z north
371
- const modelRotate = [Math.PI / 2, 0, 0];
372
- // Maplibre.js default coordinate system (no rotations)
373
- // +x east, -y north, +z up
374
- // const modelRotate = [0, 0, 0];
375
-
376
- map.on('style.load', () => {
377
- {% if viewer == "three" %}
378
- map.addLayer(createAssetLayerThreeJS({
379
- {% else %}
380
- map.addLayer(createAssetLayerBabylon({
381
- {% endif %}
382
- map,
383
- modelSource,
384
- modelOrigin,
385
- modelRotate,
386
- unitToMeter
387
- }));
367
+ //
368
+ // Add Asset
369
+ //
370
+ const worldAltitude = 0;
371
+ // +x east, +y up, +z north
372
+ const modelRotate = [Math.PI / 2, 0, 0];
373
+ // Maplibre.js default coordinate system (no rotations)
374
+ // +x east, -y north, +z up
375
+ // const modelRotate = [0, 0, 0];
376
+
377
+ map.on('style.load', () => {
378
+ {% if viewer == "three" %}
379
+ map.addLayer(createAssetLayerThreeJS({
380
+ {% else %}
381
+ map.addLayer(createAssetLayerBabylon({
382
+ {% endif %}
383
+ map,
384
+ modelSource,
385
+ modelOrigin,
386
+ modelRotate,
387
+ unitToMeter
388
+ }));
389
+ });
388
390
  });
@@ -11,33 +11,33 @@
11
11
  </fieldset>
12
12
 
13
13
  <fieldset>
14
- <legend>New Datum</legend>
15
- <div id="formset-container" class="container">
16
- <div class="row">
17
- <div class="col-md-12 d-flex align-items-center mb-3">
18
- <div class="input-group">
19
- <span class="input-group-text col-md-5 text-gray">Angle x</span>
20
- <input id="input-datum-angle-x"
21
- type="number"
22
- step="any"
23
- name="angle x"
24
- value="{{ form.dx.value|default_if_none:'' }}"
25
- class="form-control col-md-8 text-gray" required></input>
26
- </div>
27
- <div class="input-group">
28
- <span class="input-group-text col-md-5 text-gray">Angle y</span>
29
- <input id="input-datum-angle-y"
30
- type="number"
31
- step="any"
32
- name="angle y"
33
- value="{{ form.dy.value|default_if_none:'' }}"
34
- class="form-control col-md-8 text-gray" required></input>
35
- </div>
36
- </div>
37
- </div>
38
- <button class="remove-form btn btn-danger btn-sm ml-2">Remove</button>
39
- </div>
40
- <button id="add-datum" class="btn btn-sm button btn-outline-primary mb-3">Add Datum</button>
14
+ <legend>New Datum</legend>
15
+ <div id="formset-container" class="container">
16
+ <div class="row">
17
+ <div class="col-md-12 d-flex align-items-center mb-3">
18
+ <div class="input-group">
19
+ <span class="input-group-text col-md-5 text-gray">Angle x</span>
20
+ <input id="input-datum-angle-x"
21
+ type="number"
22
+ step="any"
23
+ name="angle x"
24
+ value="{{ form.dx.value|default_if_none:'' }}"
25
+ class="form-control col-md-8 text-gray" required></input>
26
+ </div>
27
+ <div class="input-group">
28
+ <span class="input-group-text col-md-5 text-gray">Angle y</span>
29
+ <input id="input-datum-angle-y"
30
+ type="number"
31
+ step="any"
32
+ name="angle y"
33
+ value="{{ form.dy.value|default_if_none:'' }}"
34
+ class="form-control col-md-8 text-gray" required></input>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ <button class="remove-form btn btn-danger btn-sm ml-2">Remove</button>
39
+ </div>
40
+ <button id="add-datum" class="btn btn-sm button btn-outline-primary mb-3">Add Datum</button>
41
41
  </fieldset>
42
42
  <button type="button" id="plot-btn" class="btn btn-info btn-sm mb-3">Plot</button>
43
43
  <button type="submit" class="btn btn-sm button btn-success mb-3">Save</button>
@@ -42,13 +42,13 @@
42
42
 
43
43
  <link type="text/css" href="{{ ASSETS_ROOT }}/vendor/sweetalert2/dist/sweetalert2.min.css" rel="stylesheet">
44
44
  <link type="text/css" href="{{ ASSETS_ROOT }}/vendor/notyf/notyf.min.css" rel="stylesheet">
45
- <!-- <link type="text/css" href="{{ ASSETS_ROOT }}/css/brace.min.css" media="screen" rel="stylesheet"> -->
46
- <link type="text/css" href="{{ ASSETS_ROOT }}/css/brace.css" media="screen" rel="stylesheet">
45
+ <link type="text/css" href="{{ ASSETS_ROOT }}/css/brace.min.css" media="screen" rel="stylesheet">
46
+ <!-- <link type="text/css" href="{{ ASSETS_ROOT }}/css/brace.css" media="screen" rel="stylesheet"> -->
47
47
 
48
48
  {% block stylesheets %}{% endblock stylesheets %}
49
49
  </head>
50
50
 
51
- <body class="g-sidenav-show">
51
+ <body class="g-sidenav-show g-sidenav-pinned">
52
52
 
53
53
  {% include 'includes/sidebar.html' %}
54
54