micro-users 1.6.2__tar.gz → 1.7.0__tar.gz
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 micro-users might be problematic. Click here for more details.
- {micro_users-1.6.2 → micro_users-1.7.0}/PKG-INFO +3 -1
- {micro_users-1.6.2 → micro_users-1.7.0}/README.md +3 -1
- {micro_users-1.6.2 → micro_users-1.7.0}/micro_users.egg-info/PKG-INFO +3 -1
- {micro_users-1.6.2 → micro_users-1.7.0}/micro_users.egg-info/SOURCES.txt +2 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/pyproject.toml +1 -1
- {micro_users-1.6.2 → micro_users-1.7.0}/setup.py +1 -1
- {micro_users-1.6.2 → micro_users-1.7.0}/users/filters.py +54 -19
- micro_users-1.7.0/users/static/users/css/detail.css +47 -0
- micro_users-1.7.0/users/static/users/css/login.css +184 -0
- micro_users-1.7.0/users/static/users/css/profile.css +123 -0
- micro_users-1.7.0/users/static/users/css/style.css +83 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/tables.py +0 -1
- {micro_users-1.6.2 → micro_users-1.7.0}/users/templates/registration/login.html +19 -34
- micro_users-1.7.0/users/templates/users/profile/profile.html +114 -0
- micro_users-1.7.0/users/templates/users/profile/profile_edit.html +100 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/templates/users/user_activity_log.html +2 -2
- micro_users-1.7.0/users/templates/users/user_detail.html +108 -0
- micro_users-1.6.2/users/static/users/css/login.css +0 -141
- micro_users-1.6.2/users/static/users/css/style.css +0 -201
- micro_users-1.6.2/users/templates/users/profile/profile.html +0 -63
- micro_users-1.6.2/users/templates/users/profile/profile_edit.html +0 -77
- micro_users-1.6.2/users/templates/users/user_detail.html +0 -52
- {micro_users-1.6.2 → micro_users-1.7.0}/LICENSE +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/MANIFEST.in +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/micro_users.egg-info/dependency_links.txt +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/micro_users.egg-info/requires.txt +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/micro_users.egg-info/top_level.txt +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/setup.cfg +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/__init__.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/admin.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/apps.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/forms.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/middleware.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/migrations/0001_initial.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/migrations/0002_alter_useractivitylog_action.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/migrations/0003_scope_alter_customuser_options_and_more.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/migrations/__init__.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/models.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/signals.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/static/img/default_profile.webp +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/static/img/login_logo.webp +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/static/users/js/anime.min.js +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/static/users/js/login.js +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/templates/users/manage_users.html +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/templates/users/partials/scope_actions.html +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/templates/users/partials/scope_form.html +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/templates/users/partials/scope_manager.html +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/templates/users/partials/user_actions.html +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/templates/users/user_form.html +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/templates/users/widgets/grouped_permissions.html +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/urls.py +0 -0
- {micro_users-1.6.2 → micro_users-1.7.0}/users/views.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: micro_users
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.7.0
|
|
4
4
|
Summary: Arabic Django user management app with abstract user, permissions, and activity logging
|
|
5
5
|
Home-page: https://github.com/debeski/micro-users
|
|
6
6
|
Author: DeBeski
|
|
@@ -208,3 +208,5 @@ MICRO_USERS_THEME = {
|
|
|
208
208
|
| v1.6.0 | • **Automated Activity Logging**: dynamic logging for all CREATE/UPDATE/DELETE actions via Middleware & Signals<br> • **Refactor**: Renamed `Department` model to `Scope` (Scope Management)<br> • Removed manual logging requirement<br> • **Architecture**: Decoupled models, forms, and tables using dynamic imports and `apps.get_model` <br> • **Soft Delete**: Users are now marked as inactive with a timestamp instead of being permanently deleted<br> • **Activity Log**: Deleted users appear with a strikethrough<br> • **CSS Refactor**: Extracted and cleaned up styling with CSS variables<br> • **Login**: Refactored login page with separated JS/CSS and a new modern default logo |
|
|
209
209
|
| v1.6.1 | • **Theme Configuration**: Added `MICRO_USERS_THEME` setting for easy color customization <br> • **Bug Fixes**: Explicitly excluded unwanted columns (id, ip_address, user_agent) from Activity Log table <br> • **UI**: Improved Scope Manager button visibility |
|
|
210
210
|
| v1.6.2 | • **UI**: Improved some tooltips for buttons and descriptions |
|
|
211
|
+
| v1.6.3 | • **Bug Fixes**: Fixed a crash with a table tooltip |
|
|
212
|
+
| v1.7.0 | • **New Theme**: Complete visual overhaul with modern, consistent styling <br> • **Refactor**: Updated Login, Profile, and Detail templates for better UX <br> • **Feature**: Added Scope filter to Activity Logs (superuser only) <br> • **UX**: Clear button in filters now preserves current sort order |
|
|
@@ -175,4 +175,6 @@ MICRO_USERS_THEME = {
|
|
|
175
175
|
| v1.5.0 | • Department Management (Modal-based CRUD)<br> • Department field implementation<br> • Template refactoring (partials/, profile/, users/ for logs)<br> • Verbose names for models |
|
|
176
176
|
| v1.6.0 | • **Automated Activity Logging**: dynamic logging for all CREATE/UPDATE/DELETE actions via Middleware & Signals<br> • **Refactor**: Renamed `Department` model to `Scope` (Scope Management)<br> • Removed manual logging requirement<br> • **Architecture**: Decoupled models, forms, and tables using dynamic imports and `apps.get_model` <br> • **Soft Delete**: Users are now marked as inactive with a timestamp instead of being permanently deleted<br> • **Activity Log**: Deleted users appear with a strikethrough<br> • **CSS Refactor**: Extracted and cleaned up styling with CSS variables<br> • **Login**: Refactored login page with separated JS/CSS and a new modern default logo |
|
|
177
177
|
| v1.6.1 | • **Theme Configuration**: Added `MICRO_USERS_THEME` setting for easy color customization <br> • **Bug Fixes**: Explicitly excluded unwanted columns (id, ip_address, user_agent) from Activity Log table <br> • **UI**: Improved Scope Manager button visibility |
|
|
178
|
-
| v1.6.2 | • **UI**: Improved some tooltips for buttons and descriptions |
|
|
178
|
+
| v1.6.2 | • **UI**: Improved some tooltips for buttons and descriptions |
|
|
179
|
+
| v1.6.3 | • **Bug Fixes**: Fixed a crash with a table tooltip |
|
|
180
|
+
| v1.7.0 | • **New Theme**: Complete visual overhaul with modern, consistent styling <br> • **Refactor**: Updated Login, Profile, and Detail templates for better UX <br> • **Feature**: Added Scope filter to Activity Logs (superuser only) <br> • **UX**: Clear button in filters now preserves current sort order |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: micro-users
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.7.0
|
|
4
4
|
Summary: Arabic Django user management app with abstract user, permissions, and activity logging
|
|
5
5
|
Home-page: https://github.com/debeski/micro-users
|
|
6
6
|
Author: DeBeski
|
|
@@ -208,3 +208,5 @@ MICRO_USERS_THEME = {
|
|
|
208
208
|
| v1.6.0 | • **Automated Activity Logging**: dynamic logging for all CREATE/UPDATE/DELETE actions via Middleware & Signals<br> • **Refactor**: Renamed `Department` model to `Scope` (Scope Management)<br> • Removed manual logging requirement<br> • **Architecture**: Decoupled models, forms, and tables using dynamic imports and `apps.get_model` <br> • **Soft Delete**: Users are now marked as inactive with a timestamp instead of being permanently deleted<br> • **Activity Log**: Deleted users appear with a strikethrough<br> • **CSS Refactor**: Extracted and cleaned up styling with CSS variables<br> • **Login**: Refactored login page with separated JS/CSS and a new modern default logo |
|
|
209
209
|
| v1.6.1 | • **Theme Configuration**: Added `MICRO_USERS_THEME` setting for easy color customization <br> • **Bug Fixes**: Explicitly excluded unwanted columns (id, ip_address, user_agent) from Activity Log table <br> • **UI**: Improved Scope Manager button visibility |
|
|
210
210
|
| v1.6.2 | • **UI**: Improved some tooltips for buttons and descriptions |
|
|
211
|
+
| v1.6.3 | • **Bug Fixes**: Fixed a crash with a table tooltip |
|
|
212
|
+
| v1.7.0 | • **New Theme**: Complete visual overhaul with modern, consistent styling <br> • **Refactor**: Updated Login, Profile, and Detail templates for better UX <br> • **Feature**: Added Scope filter to Activity Logs (superuser only) <br> • **UX**: Clear button in filters now preserves current sort order |
|
|
@@ -25,7 +25,9 @@ users/migrations/0003_scope_alter_customuser_options_and_more.py
|
|
|
25
25
|
users/migrations/__init__.py
|
|
26
26
|
users/static/img/default_profile.webp
|
|
27
27
|
users/static/img/login_logo.webp
|
|
28
|
+
users/static/users/css/detail.css
|
|
28
29
|
users/static/users/css/login.css
|
|
30
|
+
users/static/users/css/profile.css
|
|
29
31
|
users/static/users/css/style.css
|
|
30
32
|
users/static/users/js/anime.min.js
|
|
31
33
|
users/static/users/js/login.js
|
|
@@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"
|
|
|
8
8
|
|
|
9
9
|
[project]
|
|
10
10
|
name = "micro_users"
|
|
11
|
-
version = "1.
|
|
11
|
+
version = "1.7.0"
|
|
12
12
|
description = "Arabic Django user management app with abstract user, permissions, and activity logging"
|
|
13
13
|
readme = "README.md"
|
|
14
14
|
requires-python = ">=3.11"
|
|
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
|
|
|
5
5
|
|
|
6
6
|
setup(
|
|
7
7
|
name="micro_users",
|
|
8
|
-
version="1.
|
|
8
|
+
version="1.7.0",
|
|
9
9
|
author="DeBeski",
|
|
10
10
|
author_email="debeski1@gmail.com",
|
|
11
11
|
description="Arabic django user management app with abstract user, permissions, and activity logging",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import django_filters
|
|
4
4
|
from django.contrib.auth import get_user_model
|
|
5
5
|
from crispy_forms.helper import FormHelper
|
|
6
|
-
from crispy_forms.layout import Layout, Row, Column, Field, HTML
|
|
6
|
+
from crispy_forms.layout import Layout, Row, Column, Field, HTML, Hidden
|
|
7
7
|
from django.db.models import Q
|
|
8
8
|
from django.apps import apps # Import apps
|
|
9
9
|
|
|
@@ -23,11 +23,19 @@ class UserFilter(django_filters.FilterSet):
|
|
|
23
23
|
self.form.helper.form_method = 'GET'
|
|
24
24
|
self.form.helper.form_class = 'form-inline'
|
|
25
25
|
self.form.helper.form_show_labels = False
|
|
26
|
-
self.form.helper.layout = Layout(
|
|
26
|
+
self.form.helper.layout = Layout()
|
|
27
|
+
if 'sort' in self.data:
|
|
28
|
+
self.form.helper.layout.append(Hidden('sort', self.data['sort']))
|
|
29
|
+
# Prepare clear button URL with sort parameter if exists
|
|
30
|
+
clear_url = '{% url "manage_users" %}'
|
|
31
|
+
if 'sort' in self.data:
|
|
32
|
+
clear_url += f"?sort={self.data['sort']}"
|
|
33
|
+
|
|
34
|
+
self.form.helper.layout.append(
|
|
27
35
|
Row(
|
|
28
36
|
Column(Field('keyword', placeholder="البحث"), css_class='form-group col-auto flex-fill'),
|
|
29
37
|
Column(HTML('<button type="submit" class="btn btn-secondary w-100"><i class="bi bi-search bi-font text-light me-2"></i>بحـــث</button>'), css_class='col-auto text-center'),
|
|
30
|
-
Column(HTML('{% if request.GET and request.GET.keys|length > 1 %} <a href="{
|
|
38
|
+
Column(HTML(f'{{% if request.GET and request.GET.keys|length > 1 %}} <a href="{clear_url}" class="btn btn-warning bi-font">clear</a> {{% endif %}}'), css_class='form-group col-auto text-center'),
|
|
31
39
|
css_class='form-row'
|
|
32
40
|
),
|
|
33
41
|
)
|
|
@@ -56,6 +64,13 @@ class UserActivityLogFilter(django_filters.FilterSet):
|
|
|
56
64
|
choices=[],
|
|
57
65
|
empty_label="السنة",
|
|
58
66
|
)
|
|
67
|
+
scope = django_filters.ModelChoiceFilter(
|
|
68
|
+
queryset=apps.get_model('users', 'Scope').objects.all(),
|
|
69
|
+
field_name='user__scope',
|
|
70
|
+
label="النطاق",
|
|
71
|
+
empty_label="الكل",
|
|
72
|
+
required=False
|
|
73
|
+
)
|
|
59
74
|
class Meta:
|
|
60
75
|
model = apps.get_model('users', 'UserActivityLog')
|
|
61
76
|
fields = {
|
|
@@ -70,27 +85,48 @@ class UserActivityLogFilter(django_filters.FilterSet):
|
|
|
70
85
|
self.filters['year'].field.widget.attrs.update({
|
|
71
86
|
'onchange': 'this.form.submit();'
|
|
72
87
|
})
|
|
88
|
+
self.filters['scope'].field.widget.attrs.update({
|
|
89
|
+
'onchange': 'this.form.submit();'
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
if self.request and self.request.user.scope:
|
|
93
|
+
del self.filters['scope']
|
|
94
|
+
|
|
73
95
|
self.form.helper = FormHelper()
|
|
74
96
|
self.form.helper.form_method = 'GET'
|
|
75
97
|
self.form.helper.form_class = 'form-inline'
|
|
76
98
|
self.form.helper.form_show_labels = False
|
|
77
99
|
|
|
78
|
-
self.form.helper.layout = Layout(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
100
|
+
self.form.helper.layout = Layout()
|
|
101
|
+
if 'sort' in self.data:
|
|
102
|
+
self.form.helper.layout.append(Hidden('sort', self.data['sort']))
|
|
103
|
+
|
|
104
|
+
row_fields = [
|
|
105
|
+
Column(Field('keyword', placeholder="البحث"), css_class='form-group col-auto flex-fill'),
|
|
106
|
+
]
|
|
107
|
+
|
|
108
|
+
if not (self.request and self.request.user.scope):
|
|
109
|
+
row_fields.append(Column(Field('scope', placeholder="النطاق", dir="rtl"), css_class='form-group col-auto'))
|
|
110
|
+
|
|
111
|
+
# Prepare clear button URL with sort parameter if exists
|
|
112
|
+
clear_url = '{% url "user_activity_log" %}'
|
|
113
|
+
if 'sort' in self.data:
|
|
114
|
+
clear_url += f"?sort={self.data['sort']}"
|
|
115
|
+
|
|
116
|
+
row_fields.extend([
|
|
117
|
+
Column(Field('year', placeholder="السنة", dir="rtl"), css_class='form-group col-auto'),
|
|
118
|
+
Column(
|
|
119
|
+
Row(
|
|
120
|
+
Column(Field('timestamp__gte', css_class='flatpickr', placeholder="من "), css_class='col-6'),
|
|
121
|
+
Column(Field('timestamp__lte', css_class='flatpickr', placeholder="إلى "), css_class='col-6'),
|
|
122
|
+
),
|
|
123
|
+
css_class='col-auto flex-fill'
|
|
92
124
|
),
|
|
93
|
-
|
|
125
|
+
Column(HTML('<button type="submit" class="btn btn-secondary w-100"><i class="bi bi-search bi-font text-light me-2"></i>بحـــث</button>'), css_class='col-auto text-center'),
|
|
126
|
+
Column(HTML(f'{{% if request.GET and request.GET.keys|length > 1 %}} <a href="{clear_url}" class="btn btn-warning bi-font">clear</a> {{% endif %}}'), css_class='form-group col-auto text-center'),
|
|
127
|
+
])
|
|
128
|
+
|
|
129
|
+
self.form.helper.layout.append(Row(*row_fields, css_class='form-row'))
|
|
94
130
|
def filter_keyword(self, queryset, name, value):
|
|
95
131
|
"""
|
|
96
132
|
Filter the queryset by matching the keyword in username, email, phone, and occupation.
|
|
@@ -102,7 +138,6 @@ class UserActivityLogFilter(django_filters.FilterSet):
|
|
|
102
138
|
Q(action__icontains=value) |
|
|
103
139
|
Q(model_name__icontains=value) |
|
|
104
140
|
Q(number__icontains=value) |
|
|
105
|
-
Q(scope__name__icontains=value) |
|
|
106
141
|
Q(ip_address__icontains=value)
|
|
107
142
|
)
|
|
108
143
|
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
.glass-detail {
|
|
2
|
+
background: rgba(255, 255, 255, 0.9); /* Increased opacity */
|
|
3
|
+
backdrop-filter: none !important; /* Explicitly disabled */
|
|
4
|
+
-webkit-backdrop-filter: none !important;
|
|
5
|
+
border: 1px solid rgba(255, 255, 255, 0.4);
|
|
6
|
+
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.1);
|
|
7
|
+
border-radius: 16px;
|
|
8
|
+
padding: 2rem;
|
|
9
|
+
margin-top: 1rem;
|
|
10
|
+
}
|
|
11
|
+
.info-group {
|
|
12
|
+
margin-bottom: 1.5rem;
|
|
13
|
+
}
|
|
14
|
+
.info-label-sm {
|
|
15
|
+
font-size: 0.85rem;
|
|
16
|
+
color: #6c757d;
|
|
17
|
+
font-weight: 600;
|
|
18
|
+
margin-bottom: 0.25rem;
|
|
19
|
+
}
|
|
20
|
+
.info-value-lg {
|
|
21
|
+
font-size: 1.1rem;
|
|
22
|
+
font-weight: 700;
|
|
23
|
+
color: var(--title);
|
|
24
|
+
}
|
|
25
|
+
.status-badge {
|
|
26
|
+
display: inline-flex;
|
|
27
|
+
align-items: center;
|
|
28
|
+
gap: 6px;
|
|
29
|
+
padding: 6px 12px;
|
|
30
|
+
border-radius: 20px;
|
|
31
|
+
font-size: 0.9rem;
|
|
32
|
+
font-weight: 600;
|
|
33
|
+
}
|
|
34
|
+
.status-active {
|
|
35
|
+
background-color: rgba(25, 135, 84, 0.15);
|
|
36
|
+
color: #198754;
|
|
37
|
+
}
|
|
38
|
+
.status-inactive {
|
|
39
|
+
background-color: rgba(220, 53, 69, 0.15);
|
|
40
|
+
color: #dc3545;
|
|
41
|
+
}
|
|
42
|
+
.section-header {
|
|
43
|
+
color: var(--primal_dark);
|
|
44
|
+
border-bottom: 2px solid rgba(0,0,0,0.05);
|
|
45
|
+
padding-bottom: 10px;
|
|
46
|
+
font-weight: 800;
|
|
47
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--selection-bg: #dbdbdb;
|
|
3
|
+
--selection-moz-bg: #dbdbdb;
|
|
4
|
+
--bg-gradient: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
|
|
5
|
+
--left-bg: rgba(255, 255, 255, 0.85); /* Glassmorphism */
|
|
6
|
+
--left-shadow: rgba(0,0,0,0.05); /* Softer shadow */
|
|
7
|
+
--right-bg: #2b3035; /* Darker accent */
|
|
8
|
+
--right-shadow: rgba(0,0,0,0.1);
|
|
9
|
+
--right-text: #F1F1F2;
|
|
10
|
+
--label-color: #5a6474;
|
|
11
|
+
--input-text: #2c3e50;
|
|
12
|
+
--submit-color: #707075;
|
|
13
|
+
--submit-focus: #575757;
|
|
14
|
+
--submit-active: #4d4d4d;
|
|
15
|
+
--primary-color: #2363c3;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
::selection { background: var(--selection-bg); }
|
|
19
|
+
::-webkit-selection { background: var(--selection-bg); }
|
|
20
|
+
::-moz-selection { background: var(--selection-moz-bg); }
|
|
21
|
+
|
|
22
|
+
/* REMOVED body styles that break titlebar layout (display: flex, center, etc) */
|
|
23
|
+
/* Instead, we style the page container to center content inside the main content area */
|
|
24
|
+
.page {
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
height: 100%;
|
|
28
|
+
width: 100%;
|
|
29
|
+
align-items: center;
|
|
30
|
+
justify-content: center;
|
|
31
|
+
min-height: calc(100vh - 100px); /* Ensure vertical centering within available space */
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Gradient background applied to body via style.css or separate logic,
|
|
35
|
+
but since this login.css is likely scoped or loaded on login page,
|
|
36
|
+
we can set background on .page or keep it on body if safe.
|
|
37
|
+
To be safe and avoid breaking layout, we set background on body
|
|
38
|
+
but NOT layout properties. */
|
|
39
|
+
body {
|
|
40
|
+
background: var(--bg-gradient);
|
|
41
|
+
/* No display:flex here to avoid squishing the titlebar */
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.container {
|
|
45
|
+
height: 480px; /* Increased height */
|
|
46
|
+
margin: 0 auto;
|
|
47
|
+
width: 800px; /* Increased width */
|
|
48
|
+
display: flex;
|
|
49
|
+
background: transparent;
|
|
50
|
+
align-items: center;
|
|
51
|
+
justify-content: center;
|
|
52
|
+
position: relative;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@media (max-width: 767px) {
|
|
56
|
+
.container {
|
|
57
|
+
flex-direction: column;
|
|
58
|
+
height: auto;
|
|
59
|
+
width: 90%;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.left {
|
|
64
|
+
background: var(--left-bg);
|
|
65
|
+
height: 380px;
|
|
66
|
+
position: absolute;
|
|
67
|
+
left: 50px; /* Overlap effect */
|
|
68
|
+
width: 400px;
|
|
69
|
+
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.07);
|
|
70
|
+
backdrop-filter: blur(8px);
|
|
71
|
+
-webkit-backdrop-filter: blur(8px);
|
|
72
|
+
border-radius: 20px;
|
|
73
|
+
border: 1px solid rgba(255, 255, 255, 0.18);
|
|
74
|
+
z-index: 2;
|
|
75
|
+
display: flex;
|
|
76
|
+
flex-direction: column;
|
|
77
|
+
justify-content: center;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@media (max-width: 767px) {
|
|
81
|
+
.left {
|
|
82
|
+
position: relative;
|
|
83
|
+
width: 100%;
|
|
84
|
+
left: 0;
|
|
85
|
+
margin-bottom: 20px;
|
|
86
|
+
height: auto;
|
|
87
|
+
padding: 40px 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.right {
|
|
92
|
+
background: var(--right-bg);
|
|
93
|
+
box-shadow: 0 8px 32px 0 var(--right-shadow);
|
|
94
|
+
color: var(--right-text);
|
|
95
|
+
position: absolute;
|
|
96
|
+
right: 50px;
|
|
97
|
+
width: 350px;
|
|
98
|
+
height: 480px;
|
|
99
|
+
border-radius: 20px;
|
|
100
|
+
z-index: 1;
|
|
101
|
+
display: flex;
|
|
102
|
+
align-items: center;
|
|
103
|
+
justify-content: center;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
@media (max-width: 767px) {
|
|
107
|
+
.right {
|
|
108
|
+
position: relative;
|
|
109
|
+
width: 100%;
|
|
110
|
+
right: 0;
|
|
111
|
+
height: 250px;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.form {
|
|
116
|
+
margin: 40px;
|
|
117
|
+
text-align: right; /* RTL */
|
|
118
|
+
width: calc(100% - 80px);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
label {
|
|
122
|
+
color: var(--label-color);
|
|
123
|
+
display: block;
|
|
124
|
+
font-size: 14px;
|
|
125
|
+
font-weight: 600;
|
|
126
|
+
margin-top: 20px;
|
|
127
|
+
margin-bottom: 8px;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
input {
|
|
131
|
+
background: rgba(255, 255, 255, 0.5);
|
|
132
|
+
border: 1px solid #e1e8ed;
|
|
133
|
+
border-radius: 8px;
|
|
134
|
+
color: var(--input-text);
|
|
135
|
+
font-size: 16px;
|
|
136
|
+
height: 45px;
|
|
137
|
+
line-height: 45px;
|
|
138
|
+
outline: none !important;
|
|
139
|
+
width: 100%;
|
|
140
|
+
padding: 0 15px; /* Add padding */
|
|
141
|
+
margin-top: 5px; /* Reduced top margin since we use padding */
|
|
142
|
+
margin-bottom: 15px;
|
|
143
|
+
transition: all 0.3s ease;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
input:focus {
|
|
147
|
+
border-color: var(--primary-color);
|
|
148
|
+
background: white;
|
|
149
|
+
box-shadow: 0 0 0 3px rgba(35, 99, 195, 0.1);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
input::-moz-focus-inner { border: 0; }
|
|
153
|
+
|
|
154
|
+
#submit {
|
|
155
|
+
color: white;
|
|
156
|
+
margin-top: 30px;
|
|
157
|
+
transition: all 0.3s;
|
|
158
|
+
background-color: var(--primary-color);
|
|
159
|
+
border: none;
|
|
160
|
+
cursor: pointer;
|
|
161
|
+
font-weight: 700;
|
|
162
|
+
letter-spacing: 0.5px;
|
|
163
|
+
box-shadow: 0 4px 15px rgba(35, 99, 195, 0.3);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
#submit:hover {
|
|
167
|
+
background-color: #1e4f99;
|
|
168
|
+
transform: translateY(-2px);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
#submit:active { transform: translateY(0); }
|
|
172
|
+
|
|
173
|
+
/* New Utility Classes for specific elements */
|
|
174
|
+
.login-input {
|
|
175
|
+
font-size: 18px !important;
|
|
176
|
+
}
|
|
177
|
+
.login-submit {
|
|
178
|
+
font-size: 18px !important;
|
|
179
|
+
}
|
|
180
|
+
.logo-img {
|
|
181
|
+
width: 80%;
|
|
182
|
+
max-width: 200px;
|
|
183
|
+
opacity: 0.9;
|
|
184
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/* Profile View Styles */
|
|
2
|
+
.glass-profile {
|
|
3
|
+
background: rgba(255, 255, 255, 0.65);
|
|
4
|
+
backdrop-filter: blur(12px);
|
|
5
|
+
-webkit-backdrop-filter: blur(12px);
|
|
6
|
+
border: 1px solid rgba(255, 255, 255, 0.4);
|
|
7
|
+
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.1);
|
|
8
|
+
border-radius: 16px;
|
|
9
|
+
padding: 2rem;
|
|
10
|
+
}
|
|
11
|
+
.profile-img-container {
|
|
12
|
+
position: relative;
|
|
13
|
+
overflow: hidden;
|
|
14
|
+
border-radius: 50%;
|
|
15
|
+
width: 200px;
|
|
16
|
+
height: 200px;
|
|
17
|
+
margin: 0 auto;
|
|
18
|
+
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
|
|
19
|
+
border: 4px solid rgba(255, 255, 255, 0.8);
|
|
20
|
+
}
|
|
21
|
+
.profile-img-container img {
|
|
22
|
+
width: 100%;
|
|
23
|
+
height: 100%;
|
|
24
|
+
object-fit: cover;
|
|
25
|
+
}
|
|
26
|
+
.info-label {
|
|
27
|
+
font-size: 0.9rem;
|
|
28
|
+
color: #6c757d;
|
|
29
|
+
margin-bottom: 0.2rem;
|
|
30
|
+
}
|
|
31
|
+
.info-value {
|
|
32
|
+
font-size: 1.25rem;
|
|
33
|
+
font-weight: 600;
|
|
34
|
+
color: var(--title);
|
|
35
|
+
margin-bottom: 1.5rem;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Scoped Action Button for View Profile */
|
|
39
|
+
.glass-profile .action-btn {
|
|
40
|
+
transition: all 0.3s ease;
|
|
41
|
+
border-radius: 12px;
|
|
42
|
+
padding: 10px 20px;
|
|
43
|
+
font-weight: 500;
|
|
44
|
+
display: flex;
|
|
45
|
+
align-items: center;
|
|
46
|
+
justify-content: center;
|
|
47
|
+
gap: 8px;
|
|
48
|
+
}
|
|
49
|
+
.glass-profile .action-btn:hover {
|
|
50
|
+
transform: translateY(-2px);
|
|
51
|
+
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.glass-profile .page-title {
|
|
55
|
+
color: var(--primal_dark);
|
|
56
|
+
font-weight: 800;
|
|
57
|
+
margin-bottom: 2rem;
|
|
58
|
+
text-shadow: 0 2px 4px rgba(0,0,0,0.05);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* Profile Edit Styles */
|
|
62
|
+
.glass-card {
|
|
63
|
+
background: rgba(255, 255, 255, 0.65);
|
|
64
|
+
backdrop-filter: blur(12px);
|
|
65
|
+
-webkit-backdrop-filter: blur(12px);
|
|
66
|
+
border: 1px solid rgba(255, 255, 255, 0.4);
|
|
67
|
+
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.1);
|
|
68
|
+
border-radius: 16px;
|
|
69
|
+
padding: 2rem;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.glass-card .page-title {
|
|
73
|
+
color: var(--primal_dark);
|
|
74
|
+
font-weight: 800;
|
|
75
|
+
margin-bottom: 1.5rem;
|
|
76
|
+
text-shadow: 0 2px 4px rgba(0,0,0,0.05);
|
|
77
|
+
}
|
|
78
|
+
.form-label-custom {
|
|
79
|
+
font-weight: 600;
|
|
80
|
+
color: #495057;
|
|
81
|
+
margin-bottom: 0.5rem;
|
|
82
|
+
display: block;
|
|
83
|
+
}
|
|
84
|
+
.form-control-glass {
|
|
85
|
+
background: rgba(255, 255, 255, 0.5);
|
|
86
|
+
border: 1px solid rgba(0, 0, 0, 0.1);
|
|
87
|
+
border-radius: 8px;
|
|
88
|
+
padding: 0.6rem 1rem;
|
|
89
|
+
transition: all 0.3s ease;
|
|
90
|
+
}
|
|
91
|
+
.form-control-glass:focus {
|
|
92
|
+
background: rgba(255, 255, 255, 0.9);
|
|
93
|
+
box-shadow: 0 0 0 4px rgba(35, 99, 195, 0.15);
|
|
94
|
+
border-color: var(--primal);
|
|
95
|
+
}
|
|
96
|
+
.profile-preview-container {
|
|
97
|
+
position: sticky;
|
|
98
|
+
top: 20px;
|
|
99
|
+
text-align: center;
|
|
100
|
+
}
|
|
101
|
+
.preview-img {
|
|
102
|
+
border-radius: 50%;
|
|
103
|
+
box-shadow: 0 8px 20px rgba(0,0,0,0.15);
|
|
104
|
+
border: 5px solid rgba(255, 255, 255, 0.8);
|
|
105
|
+
transition: transform 0.3s ease;
|
|
106
|
+
}
|
|
107
|
+
.preview-img:hover {
|
|
108
|
+
transform: scale(1.02);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* Scoped Action Button for Edit Profile */
|
|
112
|
+
.glass-card .action-btn {
|
|
113
|
+
border-radius: 10px;
|
|
114
|
+
padding: 10px 25px;
|
|
115
|
+
font-weight: 600;
|
|
116
|
+
display: inline-flex;
|
|
117
|
+
align-items: center;
|
|
118
|
+
gap: 8px;
|
|
119
|
+
transition: all 0.2s;
|
|
120
|
+
}
|
|
121
|
+
.glass-card .action-btn:hover {
|
|
122
|
+
transform: translateY(-2px);
|
|
123
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/* Custom styles for Micro Users App */
|
|
2
|
+
|
|
3
|
+
.icard { transition: all 0.3s ease-in-out; }
|
|
4
|
+
.icard:hover { box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.1) !important; }
|
|
5
|
+
|
|
6
|
+
/* Table Danger Fixes */
|
|
7
|
+
.table > tbody > tr.table-danger > td,
|
|
8
|
+
.table > tbody > tr.table-danger > th {
|
|
9
|
+
--bs-table-bg-type: #f8d7da !important;
|
|
10
|
+
}
|
|
11
|
+
.table-hover > tbody > tr.table-danger:hover > td,
|
|
12
|
+
.table-hover > tbody > tr.table-danger:hover > th {
|
|
13
|
+
--bs-table-bg-type: #f1b0b7 !important;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.missing-numbers-table {
|
|
17
|
+
width: 100%;
|
|
18
|
+
table-layout: fixed;
|
|
19
|
+
word-wrap: break-word;
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-wrap: wrap;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.missing-numbers-table tr {
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-wrap: wrap;
|
|
27
|
+
width: 100%;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.missing-numbers-table td {
|
|
31
|
+
padding: 5px 5px 15px 5px;
|
|
32
|
+
text-align: center;
|
|
33
|
+
min-width: 80px; /* Adjust to fit your needs */
|
|
34
|
+
border-style: solid !important;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@media print {
|
|
38
|
+
.missing-numbers-table td {
|
|
39
|
+
padding: 1px 1px 0px 1px;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* Utils */
|
|
44
|
+
.dropdown-menu.show{
|
|
45
|
+
--bs-dropdown-min-width: 94px;
|
|
46
|
+
overflow-x:visible;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.tooltip-custom .tooltip-inner {
|
|
50
|
+
font-size: 1.2rem;
|
|
51
|
+
background-color: var(--title);
|
|
52
|
+
color: white;
|
|
53
|
+
padding: 8px 12px;
|
|
54
|
+
border-radius: 5px;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Strikethrough for deleted rows */
|
|
58
|
+
tr.row-deleted {
|
|
59
|
+
color: #aeaeae !important;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Override bootstrap table striping for deleted rows */
|
|
63
|
+
.table > tbody > tr.row-deleted > td,
|
|
64
|
+
.table > tbody > tr.row-deleted > th {
|
|
65
|
+
--bs-table-bg-type: rgba(0, 0, 0, 0.02) !important;
|
|
66
|
+
color: #aeaeae !important;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
tr.row-deleted td {
|
|
70
|
+
position: relative;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
tr.row-deleted td::after {
|
|
74
|
+
content: '';
|
|
75
|
+
position: absolute;
|
|
76
|
+
top: 50%;
|
|
77
|
+
left: 0;
|
|
78
|
+
width: 100%;
|
|
79
|
+
height: 1px;
|
|
80
|
+
background: #aeaeae;
|
|
81
|
+
z-index: 1;
|
|
82
|
+
pointer-events: none;
|
|
83
|
+
}
|