From 0b1534a4220592e80663768c9f285ae867da39ef Mon Sep 17 00:00:00 2001 From: a2-imeri <Alfret2.imeri@live.uwe.ac.uk> Date: Wed, 26 Jun 2024 16:48:17 +0100 Subject: [PATCH] Update CSS Style --- .../rules/__pycache__/views.cpython-310.pyc | Bin 4348 -> 4609 bytes MisplaceAI/rules/views.py | 21 +++- .../components/Common/Form/ErrorMessage.js | 2 +- .../components/Common/Form/FormContainer.js | 14 ++- frontend/src/components/Rules/AddRule.js | 100 ++++++++++-------- frontend/src/components/Rules/GetRules.js | 14 ++- frontend/src/components/Rules/UpdateRule.js | 61 +++++++---- .../UserProfile/EditableInfoForm.js | 7 +- .../detection/DetectionContainer.js | 16 ++- .../components/detection/DetectionResults.js | 3 +- .../components/detection/FileUploadForm.js | 3 +- .../src/components/detection/UploadForm.js | 2 +- .../forms/UserProfile/ChangePasswordForm.js | 6 +- frontend/src/pages/Admin/AdminDashboard.js | 19 ++-- .../NormalDetection/NormalDetectionPage.js | 2 +- frontend/src/pages/Rules/ManageRulesPage.js | 6 +- .../src/pages/UserDashboard/UserDashboard.js | 18 ++-- frontend/src/pages/UserProfile/UserProfile.js | 28 ++--- frontend/src/services/ruleApi.js | 2 + frontend/src/styles/_auth.css | 15 ++- frontend/src/styles/_components.css | 82 ++++++++++++-- frontend/src/styles/_forms.css | 3 - frontend/src/styles/_global.css | 17 +-- frontend/src/styles/_layout.css | 34 ++---- frontend/src/styles/_responsive.css | 89 ++++++++-------- frontend/src/styles/dashboard.css | 30 +----- 26 files changed, 325 insertions(+), 269 deletions(-) diff --git a/MisplaceAI/rules/__pycache__/views.cpython-310.pyc b/MisplaceAI/rules/__pycache__/views.cpython-310.pyc index 51706342ccfe8763354ef1f34e42cb72f0f8e3ac..9954d00955e64d52f74351e51b23c8cae74bb9fd 100644 GIT binary patch delta 505 zcmeyP*r>vn&&$ijz`(%p$-E{_R%9dJQy!s}j8SZvDe>`{dAC?oi;D7#eobcObz%&d z?7>?iaEm7=KRK}^Ge0jrGo`pFVDcH>ipf?yy!Cwy3=Aa<C5$ypDU7{LwX8LaSxmKT zHEau*Q<xSq*0O_H%;^jZnQA#o7)n@b*um;JOIWkmve;`lQdoK!Yq@H;7H}+NDAp_C zOkqu7%VaF!%HmF8?_~;RsNt+(jpwOh&Ej3aSHrcCk&&T>bpiiE21bSwfg0B4dd6Dr z63!a#ET$5!EJ27CO%A^zD+UIJB3lsQ0U~@sgdd3T2N5g`3=En=MFJo;H;51e5egsz z6e>lWAeIP-2m}#9Ac7f0u!0B^5CJtin1P`v7{oUO5quy*9Ar38kpze>$-uyHi@m5c zCpA7ZrAP`SBn=`$K?K-R8xSi5L_kesV3=IUB0BjDABSQwNCOWe8zUDZ4<io~A0r2o z5F;BC4<iR72a^C}mH1?NKGDe^_<{t&Kn8$R7eS1l{E%0e)ro<Dp>A>(e>kJ?=0p5e Fi~vdkXSo0X delta 155 zcmZov`J>2}&&$ijz`(#D@VzSSrO-ycr#wQMj8SZvDe>`{dAC?oi;D7#swT7YIx+f9 z_TViMh~mk~Pfje!%+HI@Oerq%n|y}1V)AWPp2<fzh1j?m7#NE9COdG-PX5U$J-LWq zm@#Pbe0~L{BKygLJd%^Y@COS7gVacY2x$-zH2EQ~Fsl;-14HrTe1ULAj?KpftQY}a CjVwz5 diff --git a/MisplaceAI/rules/views.py b/MisplaceAI/rules/views.py index 8ab33c1..c53681b 100644 --- a/MisplaceAI/rules/views.py +++ b/MisplaceAI/rules/views.py @@ -106,11 +106,22 @@ class AdminManageRuleView(APIView): def put(self, request, rule_id, *args, **kwargs): rule = get_object_or_404(Rule, id=rule_id) - serializer = RuleSerializer(rule, data=request.data) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=status.HTTP_200_OK) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + data = request.data + item_id = data.get('item') + location_ids = data.get('locations', []) + + item = get_object_or_404(Item, id=item_id) + locations = Location.objects.filter(id__in=location_ids) + + if not locations.exists(): + return Response({'error': 'One or more locations are invalid.'}, status=status.HTTP_400_BAD_REQUEST) + + rule.item = item + rule.locations.set(locations) + rule.save() + + serializer = RuleSerializer(rule) + return Response(serializer.data, status=status.HTTP_200_OK) def delete(self, request, rule_id, *args, **kwargs): rule = get_object_or_404(Rule, id=rule_id) diff --git a/frontend/src/components/Common/Form/ErrorMessage.js b/frontend/src/components/Common/Form/ErrorMessage.js index 1c08c41..53aa745 100644 --- a/frontend/src/components/Common/Form/ErrorMessage.js +++ b/frontend/src/components/Common/Form/ErrorMessage.js @@ -3,7 +3,7 @@ import React from 'react'; import PropTypes from 'prop-types'; const ErrorMessage = ({ message }) => ( - <p className="text-danger text-center">{message}</p> + <p className="text-danger">{message}</p> ); ErrorMessage.propTypes = { diff --git a/frontend/src/components/Common/Form/FormContainer.js b/frontend/src/components/Common/Form/FormContainer.js index 9d2e12c..3bdb1a4 100644 --- a/frontend/src/components/Common/Form/FormContainer.js +++ b/frontend/src/components/Common/Form/FormContainer.js @@ -17,11 +17,15 @@ const FormContainer = ({ children, onSubmit }) => { }; return ( - <div className="auth-form"> - {error && <ErrorMessage message={error} />} - <form onSubmit={handleSubmit}> - {children} - </form> + <div className="row justify-content-center"> + <div className="auth-form"> + <div className="card-body"> + {error && <ErrorMessage message={error} />} + <form onSubmit={handleSubmit}> + {children} + </form> + </div> + </div> </div> ); }; diff --git a/frontend/src/components/Rules/AddRule.js b/frontend/src/components/Rules/AddRule.js index 16e792a..671d1c5 100644 --- a/frontend/src/components/Rules/AddRule.js +++ b/frontend/src/components/Rules/AddRule.js @@ -57,54 +57,60 @@ const AddRule = ({ onRuleAdded }) => { }; return ( - <div className="form-container"> - <h3>Add Rule</h3> - {error && <p className="text-danger">{error}</p>} - <form onSubmit={handleSubmit}> - <div className="form-group"> - <label>Item</label> - <div className="checkbox-container"> - {items.map((item) => ( - <label key={item.id} className="checkbox-wrapper-12"> - <div className="cbx"> - <input - type="checkbox" - checked={selectedItem === item.id} - onChange={() => handleItemChange(item.id)} - /> - <label></label> - <svg width="15" height="14" viewBox="0 0 15 14" fill="none"> - <path d="M2 8.36364L6.23077 12L13 2"></path> - </svg> - </div> - <span>{item.name}</span> - </label> - ))} - </div> - </div> - <div className="form-group"> - <label>Locations</label> - <div className="checkbox-container"> - {locations.map((location) => ( - <label key={location.id} className="checkbox-wrapper-12"> - <div className="cbx"> - <input - type="checkbox" - checked={selectedLocations.includes(location.id)} - onChange={() => handleLocationChange(location.id)} - /> - <label></label> - <svg width="15" height="14" viewBox="0 0 15 14" fill="none"> - <path d="M2 8.36364L6.23077 12L13 2"></path> - </svg> - </div> - <span>{location.name}</span> - </label> - ))} - </div> + + <div className="dashboard-card"> + <div className="card card-wide"> + <div className="card-body"> + <h3 className="card-title">Add Rule</h3> + + {error && <p className="text-danger">{error}</p>} + <form onSubmit={handleSubmit}> + <div className="form-group"> + <label>Item</label> + <div className="checkbox-container"> + {items.map((item) => ( + <label key={item.id} className="checkbox-wrapper-12"> + <div className="cbx"> + <input + type="checkbox" + checked={selectedItem === item.id} + onChange={() => handleItemChange(item.id)} + /> + <label></label> + <svg width="15" height="14" viewBox="0 0 15 14" fill="none"> + <path d="M2 8.36364L6.23077 12L13 2"></path> + </svg> + </div> + <span>{item.name}</span> + </label> + ))} + </div> + </div> + <div className="form-group"> + <label>Locations</label> + <div className="checkbox-container"> + {locations.map((location) => ( + <label key={location.id} className="checkbox-wrapper-12"> + <div className="cbx"> + <input + type="checkbox" + checked={selectedLocations.includes(location.id)} + onChange={() => handleLocationChange(location.id)} + /> + <label></label> + <svg width="15" height="14" viewBox="0 0 15 14" fill="none"> + <path d="M2 8.36364L6.23077 12L13 2"></path> + </svg> + </div> + <span>{location.name}</span> + </label> + ))} + </div> + </div> + <button type="submit" className="btn btn-primary">Add Rule</button> + </form> </div> - <button type="submit" className="btn btn-primary">Add Rule</button> - </form> + </div> </div> ); }; diff --git a/frontend/src/components/Rules/GetRules.js b/frontend/src/components/Rules/GetRules.js index 971b826..4bfd1a1 100644 --- a/frontend/src/components/Rules/GetRules.js +++ b/frontend/src/components/Rules/GetRules.js @@ -1,4 +1,4 @@ -// src/components/Rules/GetRules.js +/* src/components/Rules/GetRules.js */ import React, { useEffect, useState } from 'react'; import { getRules, deleteRule } from '../../services/ruleApi'; @@ -23,15 +23,21 @@ const GetRules = ({ onEditRule, onDeleteRule, refresh }) => { }; return ( - <div className="dashboard-card rules-list"> + <div className="dashboard-card"> <div className="card card-wide"> <div className="card-body"> <h2 className="card-title">Rules List</h2> <ul className="list-group"> + <li className="list-group-header"> + <span>Items</span> + <span>Locations</span> + <span>Actions</span> + </li> {rules.map(rule => ( <li key={rule.id} className="list-group-item"> - <span>{rule.item.name} - {rule.locations.map(location => location.name).join(', ')}</span> - <div> + <span className="item-label">{rule.item.name}</span> + <span className="location-label">{rule.locations.map(location => location.name).join(', ')}</span> + <div className="button-group"> <button className="btn btn-secondary" onClick={() => onEditRule(rule)}>Edit</button> <button className="btn btn-danger" onClick={() => handleDelete(rule.id)}>Delete</button> </div> diff --git a/frontend/src/components/Rules/UpdateRule.js b/frontend/src/components/Rules/UpdateRule.js index 8334233..570f0ef 100644 --- a/frontend/src/components/Rules/UpdateRule.js +++ b/frontend/src/components/Rules/UpdateRule.js @@ -1,4 +1,5 @@ // src/components/Rules/UpdateRule.js + import React, { useState, useEffect } from 'react'; import { updateRule } from '../../services/ruleApi'; import { getItems } from '../../services/itemApi'; @@ -45,35 +46,51 @@ const UpdateRule = ({ rule, onUpdateCompleted }) => { <form onSubmit={handleSubmit}> <div className="form-group"> <label>Item</label> - <select - className="form-control" - value={selectedItem} - onChange={(e) => setSelectedItem(e.target.value)} - required - > - <option value="" disabled>Select an item</option> + <div className="checkbox-container"> {items.map((item) => ( - <option key={item.id} value={item.id}> - {item.name} - </option> + <label key={item.id} className="checkbox-wrapper-12"> + <div className="cbx"> + <input + type="checkbox" + checked={selectedItem === item.id} + onChange={() => setSelectedItem(item.id)} + /> + <label></label> + <svg width="15" height="14" viewBox="0 0 15 14" fill="none"> + <path d="M2 8.36364L6.23077 12L13 2"></path> + </svg> + </div> + <span>{item.name}</span> + </label> ))} - </select> + </div> </div> <div className="form-group"> <label>Locations</label> - <select - className="form-control" - multiple - value={selectedLocations} - onChange={(e) => setSelectedLocations(Array.from(e.target.selectedOptions, option => option.value))} - required - > + <div className="checkbox-container"> {locations.map((location) => ( - <option key={location.id} value={location.id}> - {location.name} - </option> + <label key={location.id} className="checkbox-wrapper-12"> + <div className="cbx"> + <input + type="checkbox" + checked={selectedLocations.includes(location.id)} + onChange={() => setSelectedLocations((prev) => { + if (prev.includes(location.id)) { + return prev.filter(id => id !== location.id); + } else { + return [...prev, location.id]; + } + })} + /> + <label></label> + <svg width="15" height="14" viewBox="0 0 15 14" fill="none"> + <path d="M2 8.36364L6.23077 12L13 2"></path> + </svg> + </div> + <span>{location.name}</span> + </label> ))} - </select> + </div> </div> <button type="submit" className="btn btn-primary">Update Rule</button> </form> diff --git a/frontend/src/components/UserProfile/EditableInfoForm.js b/frontend/src/components/UserProfile/EditableInfoForm.js index 737338a..5e34d1b 100644 --- a/frontend/src/components/UserProfile/EditableInfoForm.js +++ b/frontend/src/components/UserProfile/EditableInfoForm.js @@ -1,8 +1,7 @@ -// src/components/UserProfile/EditableInfoForm.js +/* src/components/UserProfile/EditableInfoForm.js */ import React, { useState } from 'react'; import PropTypes from 'prop-types'; -import FormContainer from '../Common/Form/FormContainer'; import FormField from '../Common/Form/FormField'; import PasswordInputField from '../Common/Password/PasswordInputField'; import SubmitButton from '../Common/buttons/SubmitButton'; @@ -20,7 +19,7 @@ const EditableInfoForm = ({ label, type, onSubmit, onCancel, loading, error }) = }; return ( - <FormContainer onSubmit={handleSubmit}> + <form onSubmit={handleSubmit} > <FormField label={label} type={type} @@ -39,7 +38,7 @@ const EditableInfoForm = ({ label, type, onSubmit, onCancel, loading, error }) = <SubmitButton className="submit-button" label={loading ? 'Updating...' : `Update ${label}`} disabled={loading} /> <CancelButton className="action-button" label="Cancel" onClick={onCancel} /> </div> - </FormContainer> + </form> ); }; diff --git a/frontend/src/components/detection/DetectionContainer.js b/frontend/src/components/detection/DetectionContainer.js index 1bbd552..040b097 100644 --- a/frontend/src/components/detection/DetectionContainer.js +++ b/frontend/src/components/detection/DetectionContainer.js @@ -1,4 +1,4 @@ -// src/components/detection/DetectionContainer.js +/* src/components/detection/DetectionContainer.js */ import React from 'react'; import '../../styles/main.css'; // Ensure this path is correct based on your project structure @@ -7,14 +7,12 @@ const DetectionContainer = ({ title, children }) => { return ( <div className="pages-container-center"> <div className="row justify-content-center"> - <div className="col-12 col-md-10 col-lg-8"> - <div className="card shadow-lg border-0"> - <div className="card-header text-center bg-primary text-white py-4"> - <h1 className="mb-0">{title}</h1> - </div> - <div className="card-body p-5"> - {children} - </div> + <div className="card shadow-lg border-0"> + <div className="text-center bg-primary text-white py-4"> + <h1 className="mb-0">{title}</h1> + </div> + <div className="card-body p-5"> + {children} </div> </div> </div> diff --git a/frontend/src/components/detection/DetectionResults.js b/frontend/src/components/detection/DetectionResults.js index 6d767ea..2c9749b 100644 --- a/frontend/src/components/detection/DetectionResults.js +++ b/frontend/src/components/detection/DetectionResults.js @@ -1,4 +1,5 @@ -// src/components/detection/DetectionResults.js +/* src/components/detection/DetectionResults.js */ + import React from 'react'; import '../../styles/main.css'; diff --git a/frontend/src/components/detection/FileUploadForm.js b/frontend/src/components/detection/FileUploadForm.js index cf9a250..3b6a618 100644 --- a/frontend/src/components/detection/FileUploadForm.js +++ b/frontend/src/components/detection/FileUploadForm.js @@ -1,4 +1,5 @@ -// src/components/detection/FileUploadForm.js +/* src/components/detection/FileUploadForm.js */ + import React from 'react'; import '../../styles/main.css'; diff --git a/frontend/src/components/detection/UploadForm.js b/frontend/src/components/detection/UploadForm.js index d8c00f4..625ddb5 100644 --- a/frontend/src/components/detection/UploadForm.js +++ b/frontend/src/components/detection/UploadForm.js @@ -1,4 +1,4 @@ -// src/components/detection/UploadForm.js +/* src/components/detection/UploadForm.js */ import React from 'react'; diff --git a/frontend/src/forms/UserProfile/ChangePasswordForm.js b/frontend/src/forms/UserProfile/ChangePasswordForm.js index 737df3c..6ab1542 100644 --- a/frontend/src/forms/UserProfile/ChangePasswordForm.js +++ b/frontend/src/forms/UserProfile/ChangePasswordForm.js @@ -3,7 +3,7 @@ import React, { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import api from '../../services/api'; -import FormContainer from '../../components/Common/Form/FormContainer'; + import PasswordInputField from '../../components/Common/Password/PasswordInputField'; import ErrorMessage from '../../components/Common/Form/ErrorMessage'; import SubmitButton from '../../components/Common/buttons/SubmitButton'; @@ -118,7 +118,7 @@ const ChangePasswordForm = ({ onUpdatePassword }) => { {showForm && ( <div className="card card-wide"> <div className="card-body"> - <FormContainer onSubmit={handleSubmit}> + <form onSubmit={handleSubmit} > {error && <ErrorMessage message={error} />} <PasswordInputField label="Current Password" @@ -146,7 +146,7 @@ const ChangePasswordForm = ({ onUpdatePassword }) => { <SubmitButton className="submit-button" label={loading ? 'Updating...' : 'Update Password'} disabled={!isFormValid || loading} /> <CancelButton className="action-button" label="Cancel" onClick={handleCancel} /> </div> - </FormContainer> + </form> </div> </div> )} diff --git a/frontend/src/pages/Admin/AdminDashboard.js b/frontend/src/pages/Admin/AdminDashboard.js index 0e5770b..4482d17 100644 --- a/frontend/src/pages/Admin/AdminDashboard.js +++ b/frontend/src/pages/Admin/AdminDashboard.js @@ -7,13 +7,18 @@ import { Link } from 'react-router-dom'; const AdminDashboard = () => { return ( <div className="pages-container-center"> - <h1>Admin Dashboard</h1> - <div className="list-group"> - <Link to="/admin/users" className="list-group-item list-group-item-action">Users Activity</Link> - <Link to="/admin/Manage-Locations" className="list-group-item list-group-item-action">Manage Locations</Link> - <Link to="/admin/manage-items" className="list-group-item list-group-item-action">Manage Items</Link> - <Link to="/admin/manage-rules" className="list-group-item list-group-item-action">Manage Rules</Link> - + <div className="row justify-content-center"> + <div className="card shadow-lg border-0"> + <div className="card-body p-5"> + <h1>Admin Dashboard</h1> + <div className="list-group"> + <Link to="/admin/users" className="list-group-item list-group-item-action">Users Activity</Link> + <Link to="/admin/Manage-Locations" className="list-group-item list-group-item-action">Manage Locations</Link> + <Link to="/admin/manage-items" className="list-group-item list-group-item-action">Manage Items</Link> + <Link to="/admin/manage-rules" className="list-group-item list-group-item-action">Manage Rules</Link> + </div> + </div> + </div> </div> </div> ); diff --git a/frontend/src/pages/NormalDetection/NormalDetectionPage.js b/frontend/src/pages/NormalDetection/NormalDetectionPage.js index 2b4f377..a0f574b 100644 --- a/frontend/src/pages/NormalDetection/NormalDetectionPage.js +++ b/frontend/src/pages/NormalDetection/NormalDetectionPage.js @@ -1,4 +1,4 @@ -// src/pages/NormalDetection/NormalDetectionPage.js +/* src/pages/NormalDetection/NormalDetectionPage.js */ import React, { useState } from 'react'; import { Modal, Button } from 'react-bootstrap'; diff --git a/frontend/src/pages/Rules/ManageRulesPage.js b/frontend/src/pages/Rules/ManageRulesPage.js index fd22d68..2be97c1 100644 --- a/frontend/src/pages/Rules/ManageRulesPage.js +++ b/frontend/src/pages/Rules/ManageRulesPage.js @@ -32,10 +32,8 @@ const ManageRulesPage = () => { <div className="pages-container-center"> <h1 className="dashboard-title">Manage Rules</h1> <div className="dashboard-card"> - <AddRule onRuleAdded={handleRuleAdded} /> - {editingRule && ( - <UpdateRule rule={editingRule} onUpdateCompleted={handleUpdateCompleted} /> - )} + {!editingRule && <AddRule onRuleAdded={handleRuleAdded} />} + {editingRule && <UpdateRule rule={editingRule} onUpdateCompleted={handleUpdateCompleted} />} <GetRules onEditRule={handleEditRule} onDeleteRule={handleDeleteRule} refresh={refreshRules} /> </div> </div> diff --git a/frontend/src/pages/UserDashboard/UserDashboard.js b/frontend/src/pages/UserDashboard/UserDashboard.js index 68bf075..1708e35 100644 --- a/frontend/src/pages/UserDashboard/UserDashboard.js +++ b/frontend/src/pages/UserDashboard/UserDashboard.js @@ -19,12 +19,18 @@ const UserDashboard = () => { return ( <div className="pages-container-center"> - <h1 className="dashboard-title">User Dashboard</h1> - <h2 className="dashboard-greeting">Hello, {username}</h2> - <div className="dashboard-buttons-container"> - <ButtonLink to="/user/profile" label="User Profile" /> - <ButtonLink to="/user/manage-rules" label="Manage Rules" /> - {/* Add more ButtonLink components here as needed */} + <div className="row justify-content-center"> + <div className="card shadow-lg border-0"> + <div className="card-body p-5"> + <h1 className="dashboard-title">User Dashboard</h1> + <h2 className="dashboard-greeting">Hello, {username}</h2> + <div className="dashboard-buttons-container"> + <ButtonLink to="/user/profile" label="User Profile" /> + <ButtonLink to="/user/manage-rules" label="Manage Rules" /> + {/* Add more ButtonLink components here as needed */} + </div> + </div> + </div> </div> </div> ); diff --git a/frontend/src/pages/UserProfile/UserProfile.js b/frontend/src/pages/UserProfile/UserProfile.js index ea77ab3..08fede3 100644 --- a/frontend/src/pages/UserProfile/UserProfile.js +++ b/frontend/src/pages/UserProfile/UserProfile.js @@ -1,4 +1,4 @@ -// src/pages/UserProfile/UserProfile.js +/* src/pages/UserProfile/UserProfile.js */ import React, { useState, useEffect } from 'react'; import ChangeEmailForm from '../../forms/UserProfile/ChangeEmailForm'; @@ -41,19 +41,21 @@ const UserProfile = () => { }; return ( - <div className="pages-container-center"> + <div className="pages-container-center text-center"> <h1 className="dashboard-title">User Profile</h1> - <ChangeEmailForm - currentEmail={currentEmail} - onUpdateEmail={handleUpdateEmail} - /> - <ChangeUsernameForm - currentUsername={currentUsername} - onUpdateUsername={handleUpdateUsername} - /> - <ChangePasswordForm - onUpdatePassword={handleUpdatePassword} - /> + <div className="dashboard-card"> + <ChangeEmailForm + currentEmail={currentEmail} + onUpdateEmail={handleUpdateEmail} + /> + <ChangeUsernameForm + currentUsername={currentUsername} + onUpdateUsername={handleUpdateUsername} + /> + <ChangePasswordForm + onUpdatePassword={handleUpdatePassword} + /> + </div> </div> ); }; diff --git a/frontend/src/services/ruleApi.js b/frontend/src/services/ruleApi.js index c3b2a5a..c4b049e 100644 --- a/frontend/src/services/ruleApi.js +++ b/frontend/src/services/ruleApi.js @@ -1,3 +1,5 @@ +//src/services/ruleApi.js + import api, { getCsrfToken } from './api'; export const addRule = async (ruleData) => { diff --git a/frontend/src/styles/_auth.css b/frontend/src/styles/_auth.css index af6db5c..44641be 100644 --- a/frontend/src/styles/_auth.css +++ b/frontend/src/styles/_auth.css @@ -1,13 +1,12 @@ /* src/styles/_auth.css */ - .auth-form { - background-color: #ffffff; + background-color: var(--light-color); padding: 3rem; border-radius: 10px; box-shadow: 0 0 20px rgba(0, 0, 0, 0.1); - width: 100%; - max-width: 500px; + width: 95%; + } .auth-form h2 { @@ -28,8 +27,8 @@ } .auth-form .btn-primary { - background-color: #007bff; - border-color: #007bff; + background-color: var(--primary-color); + border-color: var(--primary-color); width: 100%; padding: 0.75rem; font-size: 1rem; @@ -37,6 +36,6 @@ } .auth-form .btn-primary:hover { - background-color: #0056b3; - border-color: #004085; + background-color: darken(var(--primary-color), 10%); + border-color: darken(var(--primary-color), 15%); } \ No newline at end of file diff --git a/frontend/src/styles/_components.css b/frontend/src/styles/_components.css index 4d1467f..27548a4 100644 --- a/frontend/src/styles/_components.css +++ b/frontend/src/styles/_components.css @@ -2,8 +2,15 @@ /* Shared styles for cards */ .card { - width: 100%; - max-width: 600px; + margin: 1rem 0; + border: none; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + border-radius: 10px; +} + + +.card-wide { + width: 95%; margin: 1rem 0; border: none; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); @@ -12,6 +19,14 @@ .card-body { padding: 2.5rem; + display: flex; + flex-direction: column; + align-items: center; + /* Center items horizontally */ + justify-content: center; + /* Center items vertically */ + text-align: center; + /* Ensure text is centered */ } .card-title { @@ -19,11 +34,14 @@ } /* Button styles */ +.btn { + transition: background-color 0.3s ease; +} + .btn-primary { background-color: var(--primary-color); border: none; color: #fff; - transition: background-color 0.3s ease; } .btn-primary:hover { @@ -34,7 +52,6 @@ background-color: var(--secondary-color); border: none; color: #fff; - transition: background-color 0.3s ease; } .btn-secondary:hover { @@ -45,7 +62,6 @@ background-color: var(--danger-color); border: none; color: #fff; - transition: background-color 0.3s ease; } .btn-danger:hover { @@ -68,12 +84,64 @@ margin-right: 0.5rem; } -/* List styles */ + +/* List group styles */ +.list-group { + padding-left: 0; + margin-bottom: 1rem; + border-radius: 0.25rem; + width: 100%; + /* Make the list group take full width */ +} + +.list-group-header { + display: flex; + justify-content: space-between; + padding: 0.75rem 1.25rem; + background-color: #f8f9fa; + border: 1px solid rgba(0, 0, 0, 0.125); + font-weight: bold; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + .list-group-item { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem 1.25rem; + background-color: #fff; border: 1px solid rgba(0, 0, 0, 0.125); - border-radius: 0.25rem; + border-top: none; + /* Remove top border to avoid double borders */ +} + +.list-group-item span { + flex: 1; + margin-right: 1rem; + /* Adds space between text and buttons */ +} + +.list-group-item .button-group { + display: flex; + flex-direction: column; + /* Arrange buttons in a column */ + gap: 0.5rem; + /* Adds space between buttons */ + margin-left: 1rem; + /* Adds space between text and buttons */ +} + +.item-label { + width: 35%; + /* Adjust width as needed */ + text-align: left; + /* Align text to the left */ +} + +.location-label { + width: 35%; + /* Adjust width as needed */ + text-align: left; + /* Align text to the left */ } \ No newline at end of file diff --git a/frontend/src/styles/_forms.css b/frontend/src/styles/_forms.css index 811ff06..0ac25b1 100644 --- a/frontend/src/styles/_forms.css +++ b/frontend/src/styles/_forms.css @@ -30,16 +30,13 @@ display: flex; flex-wrap: wrap; gap: 10px; - /* Adds space between checkboxes */ } .checkbox-wrapper-12 { display: flex; align-items: center; gap: 5px; - /* Adds space between checkbox and text */ border: 1px solid #ddd; - /* Adds a small border around each checkbox */ padding: 5px; border-radius: 4px; } diff --git a/frontend/src/styles/_global.css b/frontend/src/styles/_global.css index 24cdf8f..dc1d1e9 100644 --- a/frontend/src/styles/_global.css +++ b/frontend/src/styles/_global.css @@ -7,7 +7,7 @@ html { padding: 0; height: 100%; width: 100%; - font-family: Arial, sans-serif; + font-family: var(--font-family-base); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } @@ -25,20 +25,7 @@ html { } .text-danger { - color: #dc3545; + color: var(--danger-color); text-align: center; margin-top: 1rem; -} - - -.pages-container-center { - display: flex; - flex-direction: column; - align-items: center; - justify-content: flex-start; - /* Align items from top to bottom */ - padding-top: 2rem; - /* Adjust padding as needed */ - min-height: 100vh; - /* Ensure it takes the full viewport height */ } \ No newline at end of file diff --git a/frontend/src/styles/_layout.css b/frontend/src/styles/_layout.css index 4b0253e..e78407a 100644 --- a/frontend/src/styles/_layout.css +++ b/frontend/src/styles/_layout.css @@ -8,7 +8,7 @@ } .form-container { - background-color: #ffffff; + background-color: var(--light-color); padding: 2rem; border-radius: 5px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); @@ -18,31 +18,13 @@ -.full-height-container { - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; -} - -.manage-content-container { - max-width: 900px; - margin: 0 auto; - padding: 2rem; -} - -.centered-content { - display: flex; - justify-content: center; - align-items: center; - min-height: 80vh; - /* Adjust based on your layout needs */ -} - -.page-container { +/* Updated for wider container */ +.pages-container-center { display: flex; flex-direction: column; - min-height: 100vh; - justify-content: center; - align-items: center; + /* Centers content horizontally */ + justify-content: flex-start; + /* Aligns content to the top vertically */ + padding-top: 2rem; + margin: 0 auto; } \ No newline at end of file diff --git a/frontend/src/styles/_responsive.css b/frontend/src/styles/_responsive.css index 35f20d3..dad5348 100644 --- a/frontend/src/styles/_responsive.css +++ b/frontend/src/styles/_responsive.css @@ -1,92 +1,87 @@ /* src/styles/_responsive.css */ -/* General responsive styles */ -@media (max-width: 768px) { - .auth-container { - padding: 10px; +@media (min-width: 100px) { + .pages-container-center { + width: 95%; } .auth-form { - padding: 20px; + width: 95%; } - .pages-container-center { - padding: 10px; + .card-wide { + width: 95%; } +} - .dashboard-title { - font-size: 2rem; - } - .card-wide { + +@media (min-width: 600px) { + .pages-container-center { width: 90%; } - .checkbox-container { - max-height: 200px; - overflow-y: auto; + .auth-form { + width: 70%; } - .checkbox-wrapper-12 { - flex: 1 1 100%; + .card-wide { + width: 90%; } } -@media (min-width: 769px) and (max-width: 1199px) { - .card-wide { + + +@media (min-width: 768px) { + .pages-container-center { width: 80%; } - .checkbox-container { - max-height: 300px; - overflow-y: auto; + .auth-form { + width: 68%; } - .checkbox-wrapper-12 { - flex: 1 1 48%; + .card-wide { + width: 80%; } } @media (min-width: 1200px) { - .card-body { - padding: 3rem; + .pages-container-center { + width: 65%; } - .btn-lg { - font-size: 1.25rem; - padding: 0.75rem 1.5rem; + .auth-form { + width: 60%; } .card-wide { - width: 60%; - max-width: 900px; + width: 70%; } +} - .checkbox-container { - max-height: 400px; - overflow-y: auto; +@media (min-width: 1600px) { + .pages-container-center { + width: 60%; } - .checkbox-wrapper-12 { - flex: 1 1 30%; + .auth-form { + width: 50%; } -} -/* Specific adjustments for the form container */ -.form-container { - width: 100%; - max-width: 600px; - margin: 0 auto; } -@media (max-width: 768px) { - .form-container { - max-width: 100%; + + + +@media (min-width: 2000px) { + .pages-container-center { + width: 55%; } } -@media (min-width: 1200px) { - .form-container { - max-width: 800px; +@media (min-width: 2500px) { + .pages-container-center { + width: 50%; } } \ No newline at end of file diff --git a/frontend/src/styles/dashboard.css b/frontend/src/styles/dashboard.css index ceda990..7eb825a 100644 --- a/frontend/src/styles/dashboard.css +++ b/frontend/src/styles/dashboard.css @@ -3,6 +3,7 @@ .dashboard-title { font-size: 2.5rem; margin-bottom: 1rem; + text-align: center; } .dashboard-greeting { @@ -21,33 +22,4 @@ display: flex; flex-direction: column; align-items: center; -} - -.card-wide { - width: 60%; - max-width: 900px; - margin: 1rem 0; - border: none; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - border-radius: 10px; -} - -.card-body { - padding: 2.5rem; -} - -.card-title { - text-align: center; -} - -@media (max-width: 768px) { - .card-wide { - width: 80%; - } -} - -@media (max-width: 480px) { - .card-wide { - width: 100%; - } } \ No newline at end of file -- GitLab