DBA-UL commited on
Commit
791a20d
·
1 Parent(s): 5ca0b18

Initial commit of static site files

Browse files
Files changed (4) hide show
  1. donnees_appareils.csv +101 -0
  2. index.html +118 -18
  3. main.js +182 -0
  4. style.css +134 -18
donnees_appareils.csv ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Tension_Appareil_1,Intensite_Appareil_1,Tension_Appareil_2,Intensite_Appareil_2,Tension_Appareil_3,Intensite_Appareil_3
2
+ 229.51454129839928,9.000852739220077,111.53639660955707,0.533267972589872,9.565848990724191,1.9391855097378035
3
+ 226.6067179427565,9.570811381439345,116.88440882084548,1.2891486413494657,11.3527318516045,0.8939858759961101
4
+ 237.15896243301975,4.721951816560043,114.31253961239443,1.2310947512432517,10.880762164937728,0.41753985550423955
5
+ 238.23665780699395,0.3445716890613826,114.87275663171603,2.5723795114713925,5.808777232152037,0.7720736605929451
6
+ 220.27386822481807,5.455948636802771,118.28144224779291,2.413692847468229,8.752936867846504,1.6268333413676375
7
+ 232.94809568382576,1.058732201701424,116.6116452763114,1.2543986391505333,9.9091453712085,1.1325053073486802
8
+ 239.45471427520306,4.577825164738752,113.3993762406029,0.49621688416915516,11.011765653822453,0.9689114674787006
9
+ 226.61272734814375,6.7357664543547555,111.18786781451061,0.5339725976570933,7.304551186716218,1.8225922616840917
10
+ 230.1229625307746,0.9386047090032287,112.92896867760805,1.7819519619244197,6.084060348412532,0.39571677987601767
11
+ 232.53363323845252,9.08716518907516,117.39914664825903,0.43048573345742,7.963562567434527,1.293296272795458
12
+ 226.53270281762633,8.0340912264607,112.09930971582064,4.2628244243935685,8.595860820876837,1.0323261613897412
13
+ 239.6368664317153,2.299088443334293,115.37371931005367,0.6124223312780424,8.831885963770619,1.8033817151191347
14
+ 228.20759330746785,2.60312594809279,112.76458643977006,2.099862549660892,10.85497623145144,1.2282786245145443
15
+ 235.6544322371858,0.2557856411990152,113.28335129994043,4.413804505177172,10.476436432914555,1.7751450806697842
16
+ 222.82595440914133,2.4712978482060457,116.99935539865797,4.896646161980084,8.666769862934235,0.31907031220204646
17
+ 232.97382916591408,6.822058097228061,114.84793032475875,2.213311575788681,7.570115881212496,0.5317870446548791
18
+ 226.53902260839368,5.513291295194921,112.01934720064659,0.7875429753889712,7.091866767867918,0.9617041731648152
19
+ 229.4758805748929,8.784914054998453,116.80981712766234,0.7818646989885117,6.229858617752105,1.0411949718420621
20
+ 238.8416226614468,7.689895672042668,118.6439608291389,0.9484064648901481,9.277631926175559,0.7743162134900957
21
+ 235.48578449752787,4.972588356027892,116.57735091498596,1.6308361546749415,7.491776733240263,0.1422305013402146
22
+ 227.8311718412963,6.105030912081427,117.49340595618965,0.23958808995644165,11.314040227992578,0.019058681303679603
23
+ 233.91145886747503,4.936189750136705,116.38690768661489,3.668144026436328,7.563799379592119,0.3682301076149217
24
+ 238.84771552508528,9.478982291082726,118.7572721070793,4.920687529543603,11.721305499492335,1.9839109373626895
25
+ 224.99708705765525,3.3223515127446754,112.97681623792089,0.3350199331883481,7.151177751745648,1.7957718982687167
26
+ 236.61543316871487,1.8637859518022144,114.2914770288409,4.379853563381855,6.563515729796843,1.4360741072653689
27
+ 233.39274162741685,6.016724907728358,118.35227388512908,2.115679763536919,6.114763707579604,0.5361277272492495
28
+ 222.46053266275365,8.486868051069623,111.81024346797813,3.8321543278495063,9.709101481716596,1.9012357364222998
29
+ 229.2982044305344,7.900738298788036,119.61918446497717,0.13672375345715976,10.12221263861377,1.4991998460746199
30
+ 227.2098248824637,3.2068859478946723,115.3298775827716,0.28864707609604584,6.05890365670836,0.2423854930015008
31
+ 234.07470998721504,5.806604953501864,112.24875667152921,0.23460026111396626,9.943014808133537,1.4376327600537748
32
+ 232.81574545544726,7.176687038667052,112.87309285070974,2.4151251120339348,9.862718321852617,0.11576186302882367
33
+ 232.7250161044474,8.89572066178636,110.95554435598577,3.422053415844227,6.50450225251987,0.5468557926892836
34
+ 221.16658408194152,4.245969976820902,115.4816710649331,2.9890294760701486,11.838757293794217,0.3732255860252012
35
+ 229.17093176523554,6.042799405033284,114.99114777795211,2.5130605773535493,10.791584611953578,1.0924787219028966
36
+ 234.05053406237954,5.034690329389095,119.49669117990312,4.091372812716014,9.596936510055656,0.4256416807032856
37
+ 222.66518773388927,5.307047788924116,118.48154838340247,2.858489369330225,7.450089938267852,0.049354587982709516
38
+ 232.2360181476184,4.5171888652930825,113.37591350987573,4.99489663683351,8.230715888579432,1.8727525478877478
39
+ 222.52380790436865,0.7355390780256723,118.99028873703718,4.704359713888646,10.534174275979716,0.673619340800865
40
+ 232.78037487356193,9.288740090040813,119.92820229925212,4.58428910240664,6.430093402558377,1.0746774180790803
41
+ 223.02025418724276,1.8976285027622621,114.16266718984625,0.8036152560417649,11.07367499105655,0.3167147133894622
42
+ 234.1292053015154,6.241421329813066,118.63416433058693,4.6896077909306975,5.759047099779602,1.7964781535158296
43
+ 223.937093982389,1.7919219427367112,110.88550750529971,0.5010465397516248,9.074765109995152,1.473482491814749
44
+ 231.47533839624955,0.771510815772556,116.42315865824219,3.8808146292207297,5.5160698952966865,0.43093405978062976
45
+ 228.10041620965006,2.0882142414153373,118.1964527046907,2.2583618666388303,9.886494625226796,0.0295878953875104
46
+ 235.33612979429458,7.681901025316547,117.36518901667054,0.9323602498581028,10.873135562647489,0.1082076926769135
47
+ 234.8976201075528,9.650692679435473,113.07751280475975,4.379051432735531,10.643915658934905,0.4005959736587337
48
+ 220.32346617439757,7.199739593202648,119.45772685475788,0.6964509549345906,10.94011896511404,0.42032000180139256
49
+ 224.95716444410579,4.485101602994101,110.60931274536622,4.775875752533645,10.184574477749788,0.5376742773085673
50
+ 231.27636146353686,2.463994523834948,113.86425776263482,4.668838816153936,8.958716221215852,1.6916117705319091
51
+ 223.79088798688983,8.306269273632424,114.9670981929367,4.008944661775788,8.894336172066463,0.7343686942652181
52
+ 224.93455848671226,8.412263600537397,117.66223502290028,2.7288548276042195,5.263646122283548,1.6149726557405015
53
+ 235.9015494070661,6.108548765402556,111.19002946777492,4.40460310674604,9.260615550799592,0.23945794483777155
54
+ 223.100977217898,8.690280022180456,114.17679175219887,4.128474291213713,7.250563374352626,1.1557914540134644
55
+ 239.96976184337703,5.975397619545438,112.76890715061411,4.295792269125209,6.488831485130074,0.8275838316272771
56
+ 239.0773296618044,9.328102654458771,118.03027368789752,3.2921193648178457,7.452490159802553,1.7564636516761754
57
+ 233.90009019196341,2.0236875578570097,113.91333843209604,4.899023738130234,10.8636748549978,0.3355546211801643
58
+ 223.55017831517702,9.676860073941357,119.1230383456872,4.080429215021905,9.506741704344764,1.7900615807387243
59
+ 236.5156799729438,4.776053869900839,112.23666520749025,4.211388789919391,10.059965239473602,1.642001990445183
60
+ 222.11262599359782,5.5569880419235105,110.81934478736338,3.6360785441524266,10.391280481996125,1.8289957501322935
61
+ 229.2107560776685,3.9291600984391386,111.52809777194945,1.0940938782635257,9.969412727986104,1.6839098963476713
62
+ 221.22318942141408,4.943650007291332,119.11776563515407,4.232208373600152,5.7522634907394625,1.5793555411811404
63
+ 234.96049807026375,8.983233720977688,118.00290517702281,3.2968040906601246,9.388820577353968,0.4394635492628726
64
+ 229.78911300350262,8.187619262021622,119.53884619979182,0.615273185392985,6.667103427857308,1.4009957566721802
65
+ 232.18387001181353,4.841977961987246,115.22612486436375,4.44748548037707,6.66401904970009,0.11254872316956263
66
+ 225.13241072476265,0.26106160843329623,119.06655907000909,4.703454763886114,10.044530727163345,0.808277622942829
67
+ 230.0383255634432,1.6301075227415753,118.84116317496448,3.3411766300520243,11.470349666777299,0.3088989032018164
68
+ 222.59868627101784,3.238127708552154,116.68594661392413,0.2740451024320508,11.704267940250636,0.8160428878211744
69
+ 222.33673767289602,9.243206692681117,111.25348516845925,3.2708460528288286,5.12680456611095,1.480771080353934
70
+ 234.8312024977542,8.205224525368049,116.30713960306745,3.040341343012814,11.683773814486626,1.5391242455555354
71
+ 224.1273915021103,8.927548439978722,113.81380567223808,0.6429804208612453,8.429566801006334,1.8075292624084738
72
+ 222.51743298744273,3.3125858726905264,117.22372447760787,1.8063271079919676,9.876470438532237,0.9250031859535711
73
+ 238.09208809963295,0.37350247308727447,114.14151484669497,4.809561354171447,10.689650750105569,0.1143604157536369
74
+ 221.59531582432024,2.3081143733481264,116.12305705081836,0.9355492658762882,7.288512594312677,0.9791982432131651
75
+ 222.8131939239641,4.1366575315408864,119.94944035439542,1.6765411545250906,7.839494467794683,1.8115651331159
76
+ 236.71030963664379,2.556983628156847,110.37886571672541,1.2543758126128788,8.252993032832409,0.27455569696817606
77
+ 222.62263152820165,9.848691679418284,119.23996009407121,2.437043215026081,7.672815981259372,0.8214590665088926
78
+ 238.87361791766142,5.085637257696952,114.36771091698924,3.446376137920476,10.242466205688572,0.19753514402806369
79
+ 230.4256648160904,3.1335931369288703,118.12304866300568,0.3330121673135532,11.111246276323076,0.18939697676261538
80
+ 230.5817886853514,9.010765689059701,116.49470031339754,0.8490835127765309,7.317575534810489,1.7129568742133303
81
+ 237.8894519612258,0.9672965370148191,119.30403463026916,4.144692708548768,6.338287029268842,1.5301676265253876
82
+ 228.2524592078487,8.880896897333189,118.86285845411747,3.78815864081143,11.548715217031583,1.3826642187373375
83
+ 229.9121980995921,4.470853868305013,116.69106002259868,2.930590589429843,6.562285118975956,1.3448240548328452
84
+ 224.97639134327727,4.67290340369306,119.65268020027739,4.114288036397216,9.946130202511977,1.458048939517323
85
+ 234.84610335266285,8.104512880308748,114.12315445233361,2.324566038540531,11.420962241569583,1.7659071825339776
86
+ 230.67442613078643,1.8303250575076102,113.44599079711915,3.4250175970008065,9.804035295494486,1.6401360672375813
87
+ 223.00039817225243,7.746595455676744,117.4171325614066,3.6341399164645867,10.970472723651802,0.10780013310303942
88
+ 230.73226275496694,3.6120113499470383,116.77531531889395,3.851794581710306,8.610858244410704,1.3192854841924722
89
+ 234.380415018996,5.523384293474416,118.42358503457444,1.580814529661469,10.705895586387935,1.84581433533419
90
+ 229.11030804297022,6.428361045142283,113.42230127554865,3.8146341263876105,9.03381765732604,1.308255038858338
91
+ 224.79282600349495,5.9564533885976605,113.58006814841424,3.777621988438552,5.5309717414872415,0.07004601772470082
92
+ 223.7634787221337,4.130442080995589,116.62325070391611,2.181650481176701,5.584809402447621,1.817651888221946
93
+ 227.0302455395079,7.6746100523889496,110.45980756438854,1.5220453779039507,11.436771821911805,0.8007182168626995
94
+ 221.02726373325007,2.2559421723252857,114.2678274473009,2.445294118078169,7.066989161948305,1.0719565369683481
95
+ 238.49011528576523,9.714274757070134,111.84270524691196,2.054117396179221,7.80789881535735,0.23158966284240318
96
+ 230.80293913819725,0.23004965296663044,113.15106416804484,1.1206389755939152,8.718862891522202,1.566198629925453
97
+ 223.21562263616346,1.4158694975486696,116.51611179726814,0.3343017135355706,10.71516399652621,1.809673617679199
98
+ 222.36437050198705,0.8821693453519205,117.14980779231765,0.33227169803894524,6.586377541526026,0.04493707036288648
99
+ 235.2585379794028,6.9049655710097815,119.0138711044466,1.4115938983669003,11.694548339152183,1.2187004910797257
100
+ 226.35944515813085,8.066574354914048,116.50826524365236,2.4390580295981064,8.279925666265036,0.9772981052776286
101
+ 231.96954259052606,7.469032824158897,115.5867991565946,1.1831989668386527,10.50884253308907,0.46963607043795164
index.html CHANGED
@@ -1,19 +1,119 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Tableau de Bord - Appareils</title>
7
+ <!-- Fonts -->
8
+ <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;600;800&display=swap" rel="stylesheet">
9
+ <!-- Chart.js -->
10
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
11
+ <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-annotation"></script>
12
+ <!-- PapaParse for CSV reading -->
13
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.4.1/papaparse.min.js"></script>
14
+ <link rel="stylesheet" href="style.css">
15
+ </head>
16
+ <body>
17
+ <div class="background-orbs">
18
+ <div class="orb orb-1"></div>
19
+ <div class="orb orb-2"></div>
20
+ <div class="orb orb-3"></div>
21
+ </div>
22
+
23
+ <div class="container">
24
+ <header class="glass-panel">
25
+ <h1>Monitoring des Appareils</h1>
26
+ <p>Analyse de la tension et de l'intensité en temps réel</p>
27
+ </header>
28
+
29
+ <main class="dashboard">
30
+ <aside class="controls glass-panel">
31
+ <h2>Paramètres</h2>
32
+
33
+ <div class="control-group">
34
+ <label>Période (Dates)</label>
35
+ <div class="date-inputs">
36
+ <div class="input-wrapper">
37
+ <span class="label-mini">Début</span>
38
+ <input type="date" id="start-date">
39
+ </div>
40
+ <div class="input-wrapper">
41
+ <span class="label-mini">Fin</span>
42
+ <input type="date" id="end-date">
43
+ </div>
44
+ </div>
45
+ </div>
46
+
47
+ <div class="control-group">
48
+ <label>Appareil</label>
49
+ <div class="radio-inputs">
50
+ <label class="radio-label">
51
+ <input type="radio" name="appareil" value="all" checked>
52
+ <span class="custom-radio"></span>
53
+ Tous
54
+ </label>
55
+ <label class="radio-label">
56
+ <input type="radio" name="appareil" value="1">
57
+ <span class="custom-radio"></span>
58
+ Appareil 1
59
+ </label>
60
+ <label class="radio-label">
61
+ <input type="radio" name="appareil" value="2">
62
+ <span class="custom-radio"></span>
63
+ Appareil 2
64
+ </label>
65
+ <label class="radio-label">
66
+ <input type="radio" name="appareil" value="3">
67
+ <span class="custom-radio"></span>
68
+ Appareil 3
69
+ </label>
70
+ </div>
71
+ </div>
72
+
73
+ <div class="control-group">
74
+ <label>Seuil d'Alerte</label>
75
+ <div class="threshold-inputs">
76
+ <div class="input-wrapper">
77
+ <span class="label-mini">Tension (V)</span>
78
+ <input type="number" id="threshold-voltage" placeholder="ex: 235">
79
+ </div>
80
+ <div class="input-wrapper">
81
+ <span class="label-mini">Intensité (A)</span>
82
+ <input type="number" id="threshold-current" placeholder="ex: 8">
83
+ </div>
84
+ </div>
85
+ </div>
86
+
87
+ <button id="apply-btn" class="glow-on-hover">Appliquer les filtres</button>
88
+ </aside>
89
+
90
+ <section class="main-content">
91
+ <div class="summary-cards">
92
+ <div class="summary-card glass-panel">
93
+ <h3>Somme des Tensions</h3>
94
+ <p id="sum-voltage" class="sum-value">0.00 V</p>
95
+ </div>
96
+ <div class="summary-card glass-panel">
97
+ <h3>Somme des Intensités</h3>
98
+ <p id="sum-current" class="sum-value">0.00 A</p>
99
+ </div>
100
+ </div>
101
+
102
+ <div class="charts-area">
103
+ <div class="chart-container glass-panel">
104
+ <h2>Évolution des Tensions</h2>
105
+ <canvas id="voltageChart"></canvas>
106
+ </div>
107
+
108
+ <div class="chart-container glass-panel">
109
+ <h2>Évolution des Intensités</h2>
110
+ <canvas id="currentChart"></canvas>
111
+ </div>
112
+ </div>
113
+ </section>
114
+ </main>
115
+ </div>
116
+
117
+ <script src="main.js"></script>
118
+ </body>
119
  </html>
main.js ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // main.js
2
+
3
+ Chart.defaults.color = '#a0aabf';
4
+ Chart.defaults.font.family = "'Outfit', sans-serif";
5
+
6
+ let rawData = [];
7
+ let voltageChart = null;
8
+ let currentChart = null;
9
+
10
+ const colors = {
11
+ app1: 'rgba(0, 240, 255, 1)', // Neon Blue
12
+ app2: 'rgba(189, 0, 255, 1)', // Purple
13
+ app3: 'rgba(0, 255, 102, 1)', // Neon Green
14
+ alert: 'rgba(255, 0, 85, 0.8)' // Red for alert
15
+ };
16
+
17
+ document.addEventListener('DOMContentLoaded', () => {
18
+ loadCSVData();
19
+ document.getElementById('apply-btn').addEventListener('click', updateDashboard);
20
+ });
21
+
22
+ function loadCSVData() {
23
+ Papa.parse('donnees_appareils (1).csv', {
24
+ download: true,
25
+ header: true,
26
+ dynamicTyping: true,
27
+ skipEmptyLines: true,
28
+ complete: function(results) {
29
+ console.log("CSV Parsed:", results.data);
30
+ rawData = results.data;
31
+
32
+ if (rawData.length > 0) {
33
+ // Initialiser les dates min et max
34
+ const dates = rawData.map(d => d.Date).filter(d => d);
35
+ if (dates.length > 0) {
36
+ const minDate = dates[0];
37
+ const maxDate = dates[dates.length - 1];
38
+
39
+ document.getElementById('start-date').value = minDate;
40
+ document.getElementById('end-date').value = maxDate;
41
+ document.getElementById('start-date').min = minDate;
42
+ document.getElementById('start-date').max = maxDate;
43
+ document.getElementById('end-date').min = minDate;
44
+ document.getElementById('end-date').max = maxDate;
45
+ }
46
+ }
47
+
48
+ initializeCharts();
49
+ updateDashboard();
50
+ },
51
+ error: function(err) {
52
+ console.error("Erreur CSV:", err);
53
+ alert("Erreur lors de la lecture du fichier 'donnees_appareils (1).csv'.");
54
+ }
55
+ });
56
+ }
57
+
58
+ function initializeCharts() {
59
+ const ctxVoltage = document.getElementById('voltageChart').getContext('2d');
60
+ const ctxCurrent = document.getElementById('currentChart').getContext('2d');
61
+
62
+ const commonOptions = {
63
+ responsive: true,
64
+ maintainAspectRatio: false,
65
+ plugins: {
66
+ legend: { position: 'top', labels: { color: '#fff', usePointStyle: true, boxWidth: 8 } },
67
+ tooltip: { mode: 'index', intersect: false, backgroundColor: 'rgba(20, 25, 40, 0.9)', titleColor: '#fff', bodyColor: '#a0aabf', borderColor: 'rgba(255,255,255,0.1)', borderWidth: 1 },
68
+ annotation: { annotations: {} }
69
+ },
70
+ scales: {
71
+ x: { grid: { color: 'rgba(255, 255, 255, 0.05)' }, title: { display: true, text: 'Date / Heure' } },
72
+ y: { grid: { color: 'rgba(255, 255, 255, 0.05)' } }
73
+ },
74
+ elements: { line: { tension: 0.4, borderWidth: 2 }, point: { radius: 0, hitRadius: 10, hoverRadius: 6 } },
75
+ interaction: { mode: 'nearest', axis: 'x', intersect: false }
76
+ };
77
+
78
+ voltageChart = new Chart(ctxVoltage, {
79
+ type: 'line', data: { labels: [], datasets: [] },
80
+ options: { ...commonOptions, scales: { ...commonOptions.scales, y: { ...commonOptions.scales.y, title: { display: true, text: 'Tension (V)' } } } }
81
+ });
82
+
83
+ currentChart = new Chart(ctxCurrent, {
84
+ type: 'line', data: { labels: [], datasets: [] },
85
+ options: { ...commonOptions, scales: { ...commonOptions.scales, y: { ...commonOptions.scales.y, title: { display: true, text: 'Intensité (A)' } } } }
86
+ });
87
+ }
88
+
89
+ function updateDashboard() {
90
+ if (!rawData || rawData.length === 0) return;
91
+
92
+ const startDateStr = document.getElementById('start-date').value;
93
+ const endDateStr = document.getElementById('end-date').value;
94
+ const selectedAppareil = document.querySelector('input[name="appareil"]:checked').value;
95
+ const threshVol = parseFloat(document.getElementById('threshold-voltage').value);
96
+ const threshCur = parseFloat(document.getElementById('threshold-current').value);
97
+
98
+ // Filtrer par date
99
+ let filteredData = rawData;
100
+ if (startDateStr && endDateStr) {
101
+ filteredData = rawData.filter(d => {
102
+ if (!d.Date) return false;
103
+ // On peut comparer directement les strings YYYY-MM-DD
104
+ return d.Date >= startDateStr && d.Date <= endDateStr;
105
+ });
106
+ }
107
+
108
+ const labels = filteredData.map(d => `${d.Date} ${d.Heure}`);
109
+
110
+ // Calcul des sommes et préparation des datasets
111
+ let sumVoltage = 0;
112
+ let sumCurrent = 0;
113
+
114
+ let voltDatasets = [];
115
+ let currDatasets = [];
116
+
117
+ // Fonction d'aide pour ajouter un dataset et cumuler les sommes
118
+ const processAppareil = (appNum, color) => {
119
+ const keyVol = `Tension_Appareil_${appNum}`;
120
+ const keyCur = `Intensite_Appareil_${appNum}`;
121
+
122
+ const volData = filteredData.map(d => {
123
+ const val = parseFloat(d[keyVol]) || 0;
124
+ sumVoltage += val;
125
+ return val;
126
+ });
127
+
128
+ const curData = filteredData.map(d => {
129
+ const val = parseFloat(d[keyCur]) || 0;
130
+ sumCurrent += val;
131
+ return val;
132
+ });
133
+
134
+ voltDatasets.push(createDataset(`Tension App ${appNum}`, volData, color));
135
+ currDatasets.push(createDataset(`Intensité App ${appNum}`, curData, color));
136
+ };
137
+
138
+ if (selectedAppareil === '1' || selectedAppareil === 'all') processAppareil(1, colors.app1);
139
+ if (selectedAppareil === '2' || selectedAppareil === 'all') processAppareil(2, colors.app2);
140
+ if (selectedAppareil === '3' || selectedAppareil === 'all') processAppareil(3, colors.app3);
141
+
142
+ // Mise à jour de l'UI des sommes
143
+ document.getElementById('sum-voltage').innerText = sumVoltage.toLocaleString('fr-FR', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' V';
144
+ document.getElementById('sum-current').innerText = sumCurrent.toLocaleString('fr-FR', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' A';
145
+
146
+ // Mise à jour des graphiques
147
+ voltageChart.data.labels = labels;
148
+ voltageChart.data.datasets = voltDatasets;
149
+ setAlertAnnotation(voltageChart, threshVol);
150
+ voltageChart.update();
151
+
152
+ currentChart.data.labels = labels;
153
+ currentChart.data.datasets = currDatasets;
154
+ setAlertAnnotation(currentChart, threshCur);
155
+ currentChart.update();
156
+ }
157
+
158
+ function createDataset(label, data, color) {
159
+ return {
160
+ label: label,
161
+ data: data,
162
+ borderColor: color,
163
+ backgroundColor: color.replace('1)', '0.1)'),
164
+ fill: true,
165
+ pointBackgroundColor: color,
166
+ pointBorderColor: '#fff',
167
+ };
168
+ }
169
+
170
+ function setAlertAnnotation(chartInstance, thresholdValue) {
171
+ if (!isNaN(thresholdValue) && thresholdValue > 0) {
172
+ chartInstance.options.plugins.annotation.annotations = {
173
+ line1: {
174
+ type: 'line', yMin: thresholdValue, yMax: thresholdValue,
175
+ borderColor: colors.alert, borderWidth: 2, borderDash: [5, 5],
176
+ label: { display: true, content: 'SEUIL ALERTE', position: 'end', backgroundColor: colors.alert, color: '#fff', font: { size: 10, weight: 'bold' } }
177
+ }
178
+ };
179
+ } else {
180
+ chartInstance.options.plugins.annotation.annotations = {};
181
+ }
182
+ }
style.css CHANGED
@@ -1,28 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
 
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
 
 
 
 
 
 
 
 
24
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
28
  }
 
1
+ /* Previous root variables */
2
+ :root {
3
+ --bg-color: #0b0f19;
4
+ --panel-bg: rgba(20, 25, 40, 0.6);
5
+ --panel-border: rgba(255, 255, 255, 0.1);
6
+ --text-primary: #ffffff;
7
+ --text-secondary: #a0aabf;
8
+ --accent-blue: #00f0ff;
9
+ --accent-purple: #bd00ff;
10
+ --accent-green: #00ff66;
11
+ --accent-red: #ff0055;
12
+ --font-main: 'Outfit', sans-serif;
13
+ }
14
+
15
+ * { box-sizing: border-box; margin: 0; padding: 0; }
16
+
17
  body {
18
+ background-color: var(--bg-color);
19
+ color: var(--text-primary);
20
+ font-family: var(--font-main);
21
+ min-height: 100vh;
22
+ overflow-x: hidden;
23
+ position: relative;
24
+ }
25
+
26
+ .background-orbs {
27
+ position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: -1; overflow: hidden;
28
+ }
29
+
30
+ .orb {
31
+ position: absolute; border-radius: 50%; filter: blur(100px); opacity: 0.5; animation: float 20s infinite ease-in-out;
32
+ }
33
+
34
+ .orb-1 { width: 400px; height: 400px; background: var(--accent-purple); top: -100px; left: -100px; }
35
+ .orb-2 { width: 300px; height: 300px; background: var(--accent-blue); bottom: -50px; right: -50px; animation-delay: -5s; }
36
+ .orb-3 { width: 250px; height: 250px; background: var(--accent-green); top: 40%; left: 50%; animation-delay: -10s; opacity: 0.3; }
37
+
38
+ @keyframes float {
39
+ 0%, 100% { transform: translate(0, 0) scale(1); }
40
+ 33% { transform: translate(30px, -50px) scale(1.1); }
41
+ 66% { transform: translate(-20px, 20px) scale(0.9); }
42
+ }
43
+
44
+ .container { max-width: 1400px; margin: 0 auto; padding: 2rem; }
45
+
46
+ .glass-panel {
47
+ background: var(--panel-bg);
48
+ backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
49
+ border: 1px solid var(--panel-border); border-radius: 20px;
50
+ padding: 1.5rem; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
51
+ }
52
+
53
+ header { text-align: center; margin-bottom: 2rem; }
54
+ header h1 {
55
+ font-size: 2.5rem; font-weight: 800;
56
+ background: linear-gradient(90deg, var(--accent-blue), var(--accent-purple));
57
+ -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin-bottom: 0.5rem;
58
  }
59
+ header p { color: var(--text-secondary); font-size: 1.1rem; }
60
 
61
+ .dashboard { display: grid; grid-template-columns: 300px 1fr; gap: 2rem; }
62
+
63
+ .controls { display: flex; flex-direction: column; gap: 2rem; height: fit-content; }
64
+ .controls h2 { font-size: 1.5rem; font-weight: 600; border-bottom: 1px solid var(--panel-border); padding-bottom: 1rem; }
65
+ .control-group { display: flex; flex-direction: column; gap: 0.8rem; }
66
+ .control-group label { font-weight: 600; color: var(--accent-blue); font-size: 1.1rem; }
67
+
68
+ .date-inputs { display: flex; flex-direction: column; gap: 1rem; }
69
+ .input-wrapper { display: flex; flex-direction: column; gap: 0.3rem; }
70
+ .label-mini { font-size: 0.85rem; color: var(--text-secondary); }
71
+
72
+ input[type="number"], input[type="date"] {
73
+ width: 100%; background: rgba(0, 0, 0, 0.3); border: 1px solid var(--panel-border);
74
+ color: white; padding: 0.8rem; border-radius: 10px; font-family: var(--font-main);
75
+ font-size: 1rem; outline: none; transition: all 0.3s ease;
76
  }
77
 
78
+ /* Chrome/Webkit specific for date icon */
79
+ ::-webkit-calendar-picker-indicator { filter: invert(1); cursor: pointer; }
80
+
81
+ input:focus { border-color: var(--accent-blue); box-shadow: 0 0 10px rgba(0, 240, 255, 0.2); }
82
+
83
+ /* Radio buttons stylisés */
84
+ .radio-inputs { display: flex; flex-direction: column; gap: 0.8rem; }
85
+ .radio-label {
86
+ display: flex; align-items: center; gap: 0.8rem; cursor: pointer; color: var(--text-primary);
87
+ font-size: 1rem; transition: color 0.3s;
88
+ }
89
+ .radio-label:hover { color: var(--accent-blue); }
90
+ .radio-label input[type="radio"] { display: none; }
91
+ .custom-radio {
92
+ width: 20px; height: 20px; border: 2px solid var(--text-secondary); border-radius: 50%;
93
+ display: inline-block; position: relative; transition: all 0.3s ease;
94
+ }
95
+ .radio-label input[type="radio"]:checked + .custom-radio {
96
+ border-color: var(--accent-blue); box-shadow: 0 0 10px rgba(0, 240, 255, 0.5);
97
+ }
98
+ .radio-label input[type="radio"]:checked + .custom-radio::after {
99
+ content: ''; width: 10px; height: 10px; background: var(--accent-blue);
100
+ border-radius: 50%; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
101
  }
102
 
103
+ .threshold-inputs { display: flex; flex-direction: column; gap: 1rem; }
104
+
105
+ .glow-on-hover {
106
+ padding: 1rem; border: none; outline: none; color: #fff;
107
+ background: linear-gradient(45deg, var(--accent-blue), var(--accent-purple));
108
+ cursor: pointer; position: relative; z-index: 0; border-radius: 10px;
109
+ font-size: 1.1rem; font-weight: 600; font-family: var(--font-main); transition: transform 0.2s ease;
110
+ }
111
+ .glow-on-hover:hover { transform: translateY(-2px); }
112
+ .glow-on-hover:before {
113
+ content: ''; background: linear-gradient(45deg, #ff0000, #ff7300, #fffb00, #48ff00, #00ffd5, #002bff, #7a00ff, #ff00c8, #ff0000);
114
+ position: absolute; top: -2px; left:-2px; background-size: 400%; z-index: -1; filter: blur(5px);
115
+ width: calc(100% + 4px); height: calc(100% + 4px); animation: glowing 20s linear infinite;
116
+ opacity: 0; transition: opacity .3s ease-in-out; border-radius: 10px;
117
  }
118
+ .glow-on-hover:hover:before { opacity: 1; }
119
+ .glow-on-hover:after {
120
+ z-index: -1; content: ''; position: absolute; width: 100%; height: 100%;
121
+ background: linear-gradient(45deg, var(--accent-blue), var(--accent-purple));
122
+ left: 0; top: 0; border-radius: 10px;
123
+ }
124
+ @keyframes glowing { 0% { background-position: 0 0; } 50% { background-position: 400% 0; } 100% { background-position: 0 0; } }
125
+
126
+ .main-content { display: flex; flex-direction: column; gap: 2rem; }
127
+
128
+ .summary-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; }
129
+ .summary-card { text-align: center; display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 2rem; }
130
+ .summary-card h3 { color: var(--text-secondary); font-size: 1.2rem; margin-bottom: 1rem; font-weight: 400; }
131
+ .sum-value { font-size: 2.5rem; font-weight: 800; color: var(--text-primary); text-shadow: 0 0 20px rgba(0, 240, 255, 0.4); }
132
+ #sum-voltage { background: linear-gradient(90deg, var(--accent-blue), var(--accent-purple)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
133
+ #sum-current { background: linear-gradient(90deg, var(--accent-green), var(--accent-blue)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
134
+
135
+
136
+ .charts-area { display: flex; flex-direction: column; gap: 2rem; }
137
+ .chart-container { height: 400px; display: flex; flex-direction: column; }
138
+ .chart-container h2 { font-size: 1.3rem; margin-bottom: 1rem; color: var(--text-primary); }
139
+ canvas { flex-grow: 1; width: 100% !important; height: 100% !important; }
140
 
141
+ @media (max-width: 900px) {
142
+ .dashboard { grid-template-columns: 1fr; }
143
+ .summary-cards { grid-template-columns: 1fr; }
144
  }