Echo-ai commited on
Commit
b6a55b1
·
verified ·
1 Parent(s): 3c3e573

Upload 5 files

Browse files
templates/admin/add_blog.html ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}Add Blog{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="add-blog-container">
7
+ <div class="form-box">
8
+ <h2 class="glitch" data-text="ADD NEW BLOG">ADD NEW BLOG</h2>
9
+ <div class="warning-box">
10
+ <i class="fas fa-exclamation-triangle"></i>
11
+ <span>CLASSIFIED INFORMATION</span>
12
+ </div>
13
+ <form method="POST" action="{{ url_for('admin.add_blog') }}" class="blog-form">
14
+ <div class="form-group">
15
+ <label for="title">
16
+ <i class="fas fa-heading"></i> TITLE
17
+ </label>
18
+ <input type="text" class="form-control" id="title" name="title" required>
19
+ </div>
20
+
21
+ <div class="form-group">
22
+ <label for="content">
23
+ <i class="fas fa-file-alt"></i> CONTENT
24
+ </label>
25
+ <textarea class="form-control" id="content" name="content" rows="8" required></textarea>
26
+ </div>
27
+
28
+ <div class="form-group">
29
+ <label for="image_url">
30
+ <i class="fas fa-image"></i> IMAGE URL
31
+ </label>
32
+ <input type="url" class="form-control" id="image_url" name="image_url">
33
+ </div>
34
+
35
+ <div class="button-group">
36
+ <button type="submit" class="btn btn-danger">
37
+ <i class="fas fa-plus me-2"></i>PUBLISH BLOG
38
+ </button>
39
+ <a href="{{ url_for('admin.index') }}" class="btn btn-outline-danger">
40
+ <i class="fas fa-times me-2"></i>CANCEL
41
+ </a>
42
+ </div>
43
+ </form>
44
+ </div>
45
+ </div>
46
+ {% endblock %}
47
+
48
+ {% block extra_css %}
49
+ <style>
50
+ .add-blog-container {
51
+ display: flex;
52
+ justify-content: center;
53
+ align-items: flex-start;
54
+ min-height: 80vh;
55
+ padding: 2rem;
56
+ }
57
+
58
+ .form-box {
59
+ background: rgba(0, 0, 0, 0.8);
60
+ border: 1px solid var(--accent);
61
+ padding: 2rem;
62
+ border-radius: 4px;
63
+ width: 100%;
64
+ max-width: 800px;
65
+ position: relative;
66
+ overflow: hidden;
67
+ }
68
+
69
+ .form-box::before {
70
+ content: '';
71
+ position: absolute;
72
+ top: 0;
73
+ left: 0;
74
+ width: 100%;
75
+ height: 2px;
76
+ background: linear-gradient(to right, transparent, var(--accent), transparent);
77
+ animation: scan 2s linear infinite;
78
+ }
79
+
80
+ @keyframes scan {
81
+ 0% { transform: translateX(-100%); }
82
+ 100% { transform: translateX(100%); }
83
+ }
84
+
85
+ .form-box h2 {
86
+ text-align: center;
87
+ color: var(--accent);
88
+ font-family: 'Share Tech Mono', monospace;
89
+ margin-bottom: 2rem;
90
+ }
91
+
92
+ .warning-box {
93
+ background: rgba(255, 0, 0, 0.1);
94
+ border: 1px solid var(--accent);
95
+ padding: 1rem;
96
+ margin-bottom: 2rem;
97
+ text-align: center;
98
+ color: var(--accent);
99
+ font-family: 'Share Tech Mono', monospace;
100
+ }
101
+
102
+ .warning-box i {
103
+ margin-right: 0.5rem;
104
+ animation: blink 1s infinite;
105
+ }
106
+
107
+ @keyframes blink {
108
+ 0%, 100% { opacity: 1; }
109
+ 50% { opacity: 0; }
110
+ }
111
+
112
+ .form-group {
113
+ margin-bottom: 1.5rem;
114
+ }
115
+
116
+ .form-group label {
117
+ display: block;
118
+ margin-bottom: 0.5rem;
119
+ color: var(--text);
120
+ font-family: 'Share Tech Mono', monospace;
121
+ }
122
+
123
+ .form-control {
124
+ background: rgba(0, 0, 0, 0.5);
125
+ border: 1px solid var(--accent);
126
+ color: var(--text);
127
+ padding: 0.75rem;
128
+ width: 100%;
129
+ font-family: 'Share Tech Mono', monospace;
130
+ }
131
+
132
+ .form-control:focus {
133
+ outline: none;
134
+ box-shadow: 0 0 5px var(--accent);
135
+ border-color: var(--accent);
136
+ background: rgba(0, 0, 0, 0.7);
137
+ }
138
+
139
+ textarea.form-control {
140
+ resize: vertical;
141
+ min-height: 200px;
142
+ }
143
+
144
+ .button-group {
145
+ display: flex;
146
+ gap: 1rem;
147
+ margin-top: 2rem;
148
+ }
149
+
150
+ .btn {
151
+ flex: 1;
152
+ padding: 0.75rem;
153
+ font-family: 'Share Tech Mono', monospace;
154
+ letter-spacing: 1px;
155
+ transition: all 0.3s ease;
156
+ }
157
+
158
+ .btn-danger {
159
+ background: var(--accent);
160
+ border: none;
161
+ }
162
+
163
+ .btn-outline-danger {
164
+ background: transparent;
165
+ border: 1px solid var(--accent);
166
+ color: var(--accent);
167
+ }
168
+
169
+ .btn:hover {
170
+ transform: translateY(-2px);
171
+ box-shadow: 0 2px 10px rgba(255, 0, 0, 0.3);
172
+ }
173
+
174
+ .btn-outline-danger:hover {
175
+ background: rgba(255, 0, 0, 0.1);
176
+ }
177
+ </style>
178
+ {% endblock %}
templates/admin/add_gang.html ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}Add Gang{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="add-gang-container">
7
+ <div class="form-box">
8
+ <h2 class="glitch" data-text="ADD NEW GANG">ADD NEW GANG</h2>
9
+ <div class="warning-box">
10
+ <i class="fas fa-exclamation-triangle"></i>
11
+ <span>CLASSIFIED INFORMATION</span>
12
+ </div>
13
+ <form method="POST" action="{{ url_for('admin.add_gang') }}" class="gang-form">
14
+ <div class="form-group">
15
+ <label for="name">
16
+ <i class="fas fa-users"></i> GANG NAME
17
+ </label>
18
+ <input type="text" class="form-control" id="name" name="name" required>
19
+ </div>
20
+
21
+ <div class="form-group">
22
+ <label for="description">
23
+ <i class="fas fa-file-alt"></i> DESCRIPTION
24
+ </label>
25
+ <textarea class="form-control" id="description" name="description" rows="4" required></textarea>
26
+ </div>
27
+
28
+ <div class="form-group">
29
+ <label for="known_members">
30
+ <i class="fas fa-user-secret"></i> KNOWN MEMBERS
31
+ </label>
32
+ <textarea class="form-control" id="known_members" name="known_members" rows="4" placeholder="Enter each member's name on a new line"></textarea>
33
+ </div>
34
+
35
+ <div class="form-group">
36
+ <label for="territory">
37
+ <i class="fas fa-map-marker-alt"></i> TERRITORY
38
+ </label>
39
+ <textarea class="form-control" id="territory" name="territory" rows="3" placeholder="Enter each territory on a new line"></textarea>
40
+ </div>
41
+
42
+ <div class="form-group">
43
+ <label for="known_activities">
44
+ <i class="fas fa-exclamation-circle"></i> KNOWN ACTIVITIES
45
+ </label>
46
+ <textarea class="form-control" id="known_activities" name="known_activities" rows="4" placeholder="Enter each activity on a new line"></textarea>
47
+ </div>
48
+
49
+ <div class="form-group">
50
+ <label for="image_url">
51
+ <i class="fas fa-image"></i> IMAGE URL
52
+ </label>
53
+ <input type="url" class="form-control" id="image_url" name="image_url">
54
+ </div>
55
+
56
+ <div class="button-group">
57
+ <button type="submit" class="btn btn-danger">
58
+ <i class="fas fa-plus me-2"></i>ADD GANG
59
+ </button>
60
+ <a href="{{ url_for('admin.index') }}" class="btn btn-outline-danger">
61
+ <i class="fas fa-times me-2"></i>CANCEL
62
+ </a>
63
+ </div>
64
+ </form>
65
+ </div>
66
+ </div>
67
+ {% endblock %}
68
+
69
+ {% block extra_css %}
70
+ <style>
71
+ .add-gang-container {
72
+ display: flex;
73
+ justify-content: center;
74
+ align-items: flex-start;
75
+ min-height: 80vh;
76
+ padding: 2rem;
77
+ }
78
+
79
+ .form-box {
80
+ background: rgba(0, 0, 0, 0.8);
81
+ border: 1px solid var(--accent);
82
+ padding: 2rem;
83
+ border-radius: 4px;
84
+ width: 100%;
85
+ max-width: 800px;
86
+ position: relative;
87
+ overflow: hidden;
88
+ }
89
+
90
+ .form-box::before {
91
+ content: '';
92
+ position: absolute;
93
+ top: 0;
94
+ left: 0;
95
+ width: 100%;
96
+ height: 2px;
97
+ background: linear-gradient(to right, transparent, var(--accent), transparent);
98
+ animation: scan 2s linear infinite;
99
+ }
100
+
101
+ @keyframes scan {
102
+ 0% { transform: translateX(-100%); }
103
+ 100% { transform: translateX(100%); }
104
+ }
105
+
106
+ .form-box h2 {
107
+ text-align: center;
108
+ color: var(--accent);
109
+ font-family: 'Share Tech Mono', monospace;
110
+ margin-bottom: 2rem;
111
+ }
112
+
113
+ .warning-box {
114
+ background: rgba(255, 0, 0, 0.1);
115
+ border: 1px solid var(--accent);
116
+ padding: 1rem;
117
+ margin-bottom: 2rem;
118
+ text-align: center;
119
+ color: var(--accent);
120
+ font-family: 'Share Tech Mono', monospace;
121
+ }
122
+
123
+ .warning-box i {
124
+ margin-right: 0.5rem;
125
+ animation: blink 1s infinite;
126
+ }
127
+
128
+ @keyframes blink {
129
+ 0%, 100% { opacity: 1; }
130
+ 50% { opacity: 0; }
131
+ }
132
+
133
+ .form-group {
134
+ margin-bottom: 1.5rem;
135
+ }
136
+
137
+ .form-group label {
138
+ display: block;
139
+ margin-bottom: 0.5rem;
140
+ color: var(--text);
141
+ font-family: 'Share Tech Mono', monospace;
142
+ }
143
+
144
+ .form-control {
145
+ background: rgba(0, 0, 0, 0.5);
146
+ border: 1px solid var(--accent);
147
+ color: var(--text);
148
+ padding: 0.75rem;
149
+ width: 100%;
150
+ font-family: 'Share Tech Mono', monospace;
151
+ }
152
+
153
+ .form-control:focus {
154
+ outline: none;
155
+ box-shadow: 0 0 5px var(--accent);
156
+ border-color: var(--accent);
157
+ background: rgba(0, 0, 0, 0.7);
158
+ }
159
+
160
+ textarea.form-control {
161
+ resize: vertical;
162
+ min-height: 100px;
163
+ }
164
+
165
+ .button-group {
166
+ display: flex;
167
+ gap: 1rem;
168
+ margin-top: 2rem;
169
+ }
170
+
171
+ .btn {
172
+ flex: 1;
173
+ padding: 0.75rem;
174
+ font-family: 'Share Tech Mono', monospace;
175
+ letter-spacing: 1px;
176
+ transition: all 0.3s ease;
177
+ }
178
+
179
+ .btn-danger {
180
+ background: var(--accent);
181
+ border: none;
182
+ }
183
+
184
+ .btn-outline-danger {
185
+ background: transparent;
186
+ border: 1px solid var(--accent);
187
+ color: var(--accent);
188
+ }
189
+
190
+ .btn:hover {
191
+ transform: translateY(-2px);
192
+ box-shadow: 0 2px 10px rgba(255, 0, 0, 0.3);
193
+ }
194
+
195
+ .btn-outline-danger:hover {
196
+ background: rgba(255, 0, 0, 0.1);
197
+ }
198
+ </style>
199
+ {% endblock %}
templates/admin/edit_blog.html ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}Edit Blog{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="edit-blog-container">
7
+ <div class="form-box">
8
+ <h2 class="glitch" data-text="EDIT BLOG">EDIT BLOG</h2>
9
+ <div class="warning-box">
10
+ <i class="fas fa-exclamation-triangle"></i>
11
+ <span>CLASSIFIED INFORMATION</span>
12
+ </div>
13
+ <form method="POST" action="{{ url_for('admin.edit_blog', blog_id=blog.id) }}" class="blog-form">
14
+ <div class="form-group">
15
+ <label for="title">
16
+ <i class="fas fa-heading"></i> TITLE
17
+ </label>
18
+ <input type="text" class="form-control" id="title" name="title" value="{{ blog.title }}" required>
19
+ </div>
20
+
21
+ <div class="form-group">
22
+ <label for="content">
23
+ <i class="fas fa-file-alt"></i> CONTENT
24
+ </label>
25
+ <textarea class="form-control" id="content" name="content" rows="8" required>{{ blog.content }}</textarea>
26
+ </div>
27
+
28
+ <div class="form-group">
29
+ <label for="image_url">
30
+ <i class="fas fa-image"></i> IMAGE URL
31
+ </label>
32
+ <input type="url" class="form-control" id="image_url" name="image_url" value="{{ blog.image_url or '' }}">
33
+ </div>
34
+
35
+ <div class="button-group">
36
+ <button type="submit" class="btn btn-danger">
37
+ <i class="fas fa-save me-2"></i>SAVE CHANGES
38
+ </button>
39
+ <a href="{{ url_for('admin.index') }}" class="btn btn-outline-danger">
40
+ <i class="fas fa-times me-2"></i>CANCEL
41
+ </a>
42
+ </div>
43
+ </form>
44
+ </div>
45
+ </div>
46
+ {% endblock %}
47
+
48
+ {% block extra_css %}
49
+ <style>
50
+ .edit-blog-container {
51
+ display: flex;
52
+ justify-content: center;
53
+ align-items: flex-start;
54
+ min-height: 80vh;
55
+ padding: 2rem;
56
+ }
57
+
58
+ .form-box {
59
+ background: rgba(0, 0, 0, 0.8);
60
+ border: 1px solid var(--accent);
61
+ padding: 2rem;
62
+ border-radius: 4px;
63
+ width: 100%;
64
+ max-width: 800px;
65
+ position: relative;
66
+ overflow: hidden;
67
+ }
68
+
69
+ .form-box::before {
70
+ content: '';
71
+ position: absolute;
72
+ top: 0;
73
+ left: 0;
74
+ width: 100%;
75
+ height: 2px;
76
+ background: linear-gradient(to right, transparent, var(--accent), transparent);
77
+ animation: scan 2s linear infinite;
78
+ }
79
+
80
+ @keyframes scan {
81
+ 0% { transform: translateX(-100%); }
82
+ 100% { transform: translateX(100%); }
83
+ }
84
+
85
+ .form-box h2 {
86
+ text-align: center;
87
+ color: var(--accent);
88
+ font-family: 'Share Tech Mono', monospace;
89
+ margin-bottom: 2rem;
90
+ }
91
+
92
+ .warning-box {
93
+ background: rgba(255, 0, 0, 0.1);
94
+ border: 1px solid var(--accent);
95
+ padding: 1rem;
96
+ margin-bottom: 2rem;
97
+ text-align: center;
98
+ color: var(--accent);
99
+ font-family: 'Share Tech Mono', monospace;
100
+ }
101
+
102
+ .warning-box i {
103
+ margin-right: 0.5rem;
104
+ animation: blink 1s infinite;
105
+ }
106
+
107
+ @keyframes blink {
108
+ 0%, 100% { opacity: 1; }
109
+ 50% { opacity: 0; }
110
+ }
111
+
112
+ .form-group {
113
+ margin-bottom: 1.5rem;
114
+ }
115
+
116
+ .form-group label {
117
+ display: block;
118
+ margin-bottom: 0.5rem;
119
+ color: var(--text);
120
+ font-family: 'Share Tech Mono', monospace;
121
+ }
122
+
123
+ .form-control {
124
+ background: rgba(0, 0, 0, 0.5);
125
+ border: 1px solid var(--accent);
126
+ color: var(--text);
127
+ padding: 0.75rem;
128
+ width: 100%;
129
+ font-family: 'Share Tech Mono', monospace;
130
+ }
131
+
132
+ .form-control:focus {
133
+ outline: none;
134
+ box-shadow: 0 0 5px var(--accent);
135
+ border-color: var(--accent);
136
+ background: rgba(0, 0, 0, 0.7);
137
+ }
138
+
139
+ textarea.form-control {
140
+ resize: vertical;
141
+ min-height: 200px;
142
+ }
143
+
144
+ .button-group {
145
+ display: flex;
146
+ gap: 1rem;
147
+ margin-top: 2rem;
148
+ }
149
+
150
+ .btn {
151
+ flex: 1;
152
+ padding: 0.75rem;
153
+ font-family: 'Share Tech Mono', monospace;
154
+ letter-spacing: 1px;
155
+ transition: all 0.3s ease;
156
+ }
157
+
158
+ .btn-danger {
159
+ background: var(--accent);
160
+ border: none;
161
+ }
162
+
163
+ .btn-outline-danger {
164
+ background: transparent;
165
+ border: 1px solid var(--accent);
166
+ color: var(--accent);
167
+ }
168
+
169
+ .btn:hover {
170
+ transform: translateY(-2px);
171
+ box-shadow: 0 2px 10px rgba(255, 0, 0, 0.3);
172
+ }
173
+
174
+ .btn-outline-danger:hover {
175
+ background: rgba(255, 0, 0, 0.1);
176
+ }
177
+ </style>
178
+ {% endblock %}
templates/admin/edit_gang.html ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}Edit Gang{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="edit-gang-container">
7
+ <div class="form-box">
8
+ <h2 class="glitch" data-text="EDIT GANG">EDIT GANG</h2>
9
+ <div class="warning-box">
10
+ <i class="fas fa-exclamation-triangle"></i>
11
+ <span>CLASSIFIED INFORMATION</span>
12
+ </div>
13
+ <form method="POST" action="{{ url_for('admin.edit_gang', gang_id=gang.id) }}" class="gang-form">
14
+ <div class="form-group">
15
+ <label for="name">
16
+ <i class="fas fa-users"></i> GANG NAME
17
+ </label>
18
+ <input type="text" class="form-control" id="name" name="name" value="{{ gang.name }}" required>
19
+ </div>
20
+
21
+ <div class="form-group">
22
+ <label for="description">
23
+ <i class="fas fa-file-alt"></i> DESCRIPTION
24
+ </label>
25
+ <textarea class="form-control" id="description" name="description" rows="4" required>{{ gang.description }}</textarea>
26
+ </div>
27
+
28
+ <div class="form-group">
29
+ <label for="status">
30
+ <i class="fas fa-info-circle"></i> STATUS
31
+ </label>
32
+ <select class="form-control" id="status" name="status">
33
+ <option value="Active" {% if gang.status == 'Active' %}selected{% endif %}>Active</option>
34
+ <option value="Inactive" {% if gang.status == 'Inactive' %}selected{% endif %}>Inactive</option>
35
+ <option value="Unknown" {% if gang.status == 'Unknown' %}selected{% endif %}>Unknown</option>
36
+ </select>
37
+ </div>
38
+
39
+ <div class="form-group">
40
+ <label for="location">
41
+ <i class="fas fa-map-marker-alt"></i> LOCATION
42
+ </label>
43
+ <input type="text" class="form-control" id="location" name="location" value="{{ gang.location or '' }}">
44
+ </div>
45
+
46
+ <div class="form-group">
47
+ <label for="image_url">
48
+ <i class="fas fa-image"></i> IMAGE URL
49
+ </label>
50
+ <input type="url" class="form-control" id="image_url" name="image_url" value="{{ gang.image_url or '' }}">
51
+ </div>
52
+
53
+ <div class="button-group">
54
+ <button type="submit" class="btn btn-danger">
55
+ <i class="fas fa-save me-2"></i>SAVE CHANGES
56
+ </button>
57
+ <a href="{{ url_for('admin.index') }}" class="btn btn-outline-danger">
58
+ <i class="fas fa-times me-2"></i>CANCEL
59
+ </a>
60
+ </div>
61
+ </form>
62
+ </div>
63
+ </div>
64
+ {% endblock %}
65
+
66
+ {% block extra_css %}
67
+ <style>
68
+ .edit-gang-container {
69
+ display: flex;
70
+ justify-content: center;
71
+ align-items: flex-start;
72
+ min-height: 80vh;
73
+ padding: 2rem;
74
+ }
75
+
76
+ .form-box {
77
+ background: rgba(0, 0, 0, 0.8);
78
+ border: 1px solid var(--accent);
79
+ padding: 2rem;
80
+ border-radius: 4px;
81
+ width: 100%;
82
+ max-width: 600px;
83
+ position: relative;
84
+ overflow: hidden;
85
+ }
86
+
87
+ .form-box::before {
88
+ content: '';
89
+ position: absolute;
90
+ top: 0;
91
+ left: 0;
92
+ width: 100%;
93
+ height: 2px;
94
+ background: linear-gradient(to right, transparent, var(--accent), transparent);
95
+ animation: scan 2s linear infinite;
96
+ }
97
+
98
+ @keyframes scan {
99
+ 0% { transform: translateX(-100%); }
100
+ 100% { transform: translateX(100%); }
101
+ }
102
+
103
+ .form-box h2 {
104
+ text-align: center;
105
+ color: var(--accent);
106
+ font-family: 'Share Tech Mono', monospace;
107
+ margin-bottom: 2rem;
108
+ }
109
+
110
+ .warning-box {
111
+ background: rgba(255, 0, 0, 0.1);
112
+ border: 1px solid var(--accent);
113
+ padding: 1rem;
114
+ margin-bottom: 2rem;
115
+ text-align: center;
116
+ color: var(--accent);
117
+ font-family: 'Share Tech Mono', monospace;
118
+ }
119
+
120
+ .warning-box i {
121
+ margin-right: 0.5rem;
122
+ animation: blink 1s infinite;
123
+ }
124
+
125
+ @keyframes blink {
126
+ 0%, 100% { opacity: 1; }
127
+ 50% { opacity: 0; }
128
+ }
129
+
130
+ .form-group {
131
+ margin-bottom: 1.5rem;
132
+ }
133
+
134
+ .form-group label {
135
+ display: block;
136
+ margin-bottom: 0.5rem;
137
+ color: var(--text);
138
+ font-family: 'Share Tech Mono', monospace;
139
+ }
140
+
141
+ .form-control {
142
+ background: rgba(0, 0, 0, 0.5);
143
+ border: 1px solid var(--accent);
144
+ color: var(--text);
145
+ padding: 0.75rem;
146
+ width: 100%;
147
+ font-family: 'Share Tech Mono', monospace;
148
+ }
149
+
150
+ .form-control:focus {
151
+ outline: none;
152
+ box-shadow: 0 0 5px var(--accent);
153
+ border-color: var(--accent);
154
+ background: rgba(0, 0, 0, 0.7);
155
+ }
156
+
157
+ select.form-control {
158
+ appearance: none;
159
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23ff0000' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14L2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E");
160
+ background-repeat: no-repeat;
161
+ background-position: right 1rem center;
162
+ padding-right: 2.5rem;
163
+ }
164
+
165
+ .button-group {
166
+ display: flex;
167
+ gap: 1rem;
168
+ margin-top: 2rem;
169
+ }
170
+
171
+ .btn {
172
+ flex: 1;
173
+ padding: 0.75rem;
174
+ font-family: 'Share Tech Mono', monospace;
175
+ letter-spacing: 1px;
176
+ transition: all 0.3s ease;
177
+ }
178
+
179
+ .btn-danger {
180
+ background: var(--accent);
181
+ border: none;
182
+ }
183
+
184
+ .btn-outline-danger {
185
+ background: transparent;
186
+ border: 1px solid var(--accent);
187
+ color: var(--accent);
188
+ }
189
+
190
+ .btn:hover {
191
+ transform: translateY(-2px);
192
+ box-shadow: 0 2px 10px rgba(255, 0, 0, 0.3);
193
+ }
194
+
195
+ .btn-outline-danger:hover {
196
+ background: rgba(255, 0, 0, 0.1);
197
+ }
198
+ </style>
199
+ {% endblock %}
templates/admin/index.html ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}Admin Dashboard{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="admin-dashboard">
7
+ <section class="gangs-section">
8
+ <div class="section-header">
9
+ <h2 class="glitch" data-text="GANGS">GANGS</h2>
10
+ <a href="{{ url_for('admin.add_gang') }}" class="btn btn-danger">
11
+ <i class="fas fa-plus"></i> ADD GANG
12
+ </a>
13
+ </div>
14
+
15
+ <div class="data-grid">
16
+ {% for gang in gangs %}
17
+ <div class="data-card">
18
+ <div class="card-header">
19
+ {% if gang.image_url %}
20
+ <div class="card-image">
21
+ <img src="{{ gang.image_url }}" alt="{{ gang.name }}">
22
+ </div>
23
+ {% endif %}
24
+ <h3>{{ gang.name }}</h3>
25
+ </div>
26
+ <div class="card-body">
27
+ <p class="description">{{ gang.description[:150] }}...</p>
28
+ <div class="details">
29
+ <div class="detail-item">
30
+ <i class="fas fa-users"></i>
31
+ <span>{{ gang.known_members|length }} Members</span>
32
+ </div>
33
+ <div class="detail-item">
34
+ <i class="fas fa-map-marker-alt"></i>
35
+ <span>{{ gang.territory|length }} Territories</span>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ <div class="card-footer">
40
+ <a href="{{ url_for('admin.edit_gang', gang_id=gang.id) }}" class="btn btn-sm btn-outline-danger">
41
+ <i class="fas fa-edit"></i> EDIT
42
+ </a>
43
+ <form action="{{ url_for('admin.delete_gang', gang_id=gang.id) }}" method="POST" class="d-inline">
44
+ <button type="submit" class="btn btn-sm btn-outline-danger" onclick="return confirm('Are you sure you want to delete this gang?')">
45
+ <i class="fas fa-trash"></i> DELETE
46
+ </button>
47
+ </form>
48
+ </div>
49
+ </div>
50
+ {% endfor %}
51
+ </div>
52
+ </section>
53
+
54
+ <section class="blogs-section">
55
+ <div class="section-header">
56
+ <h2 class="glitch" data-text="BLOGS">BLOGS</h2>
57
+ <a href="{{ url_for('admin.add_blog') }}" class="btn btn-danger">
58
+ <i class="fas fa-plus"></i> ADD BLOG
59
+ </a>
60
+ </div>
61
+
62
+ <div class="data-grid">
63
+ {% for blog in blogs %}
64
+ <div class="data-card">
65
+ <div class="card-header">
66
+ {% if blog.image_url %}
67
+ <div class="card-image">
68
+ <img src="{{ blog.image_url }}" alt="{{ blog.title }}">
69
+ </div>
70
+ {% endif %}
71
+ <h3>{{ blog.title }}</h3>
72
+ </div>
73
+ <div class="card-body">
74
+ <p class="description">{{ blog.content[:150] }}...</p>
75
+ <div class="meta">
76
+ <span class="date">
77
+ <i class="fas fa-calendar"></i>
78
+ {{ blog.created_at.split('T')[0] }}
79
+ </span>
80
+ </div>
81
+ </div>
82
+ <div class="card-footer">
83
+ <a href="{{ url_for('admin.edit_blog', blog_id=blog.id) }}" class="btn btn-sm btn-outline-danger">
84
+ <i class="fas fa-edit"></i> EDIT
85
+ </a>
86
+ <form action="{{ url_for('admin.delete_blog', blog_id=blog.id) }}" method="POST" class="d-inline">
87
+ <button type="submit" class="btn btn-sm btn-outline-danger" onclick="return confirm('Are you sure you want to delete this blog?')">
88
+ <i class="fas fa-trash"></i> DELETE
89
+ </button>
90
+ </form>
91
+ </div>
92
+ </div>
93
+ {% endfor %}
94
+ </div>
95
+ </section>
96
+ </div>
97
+ {% endblock %}
98
+
99
+ {% block extra_css %}
100
+ <style>
101
+ .admin-dashboard {
102
+ padding: 2rem;
103
+ }
104
+
105
+ .section-header {
106
+ display: flex;
107
+ justify-content: space-between;
108
+ align-items: center;
109
+ margin-bottom: 2rem;
110
+ }
111
+
112
+ .section-header h2 {
113
+ color: var(--accent);
114
+ font-family: 'Share Tech Mono', monospace;
115
+ margin: 0;
116
+ }
117
+
118
+ .data-grid {
119
+ display: grid;
120
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
121
+ gap: 2rem;
122
+ margin-bottom: 3rem;
123
+ }
124
+
125
+ .data-card {
126
+ background: rgba(0, 0, 0, 0.8);
127
+ border: 1px solid var(--accent);
128
+ position: relative;
129
+ overflow: hidden;
130
+ }
131
+
132
+ .data-card::before {
133
+ content: '';
134
+ position: absolute;
135
+ top: 0;
136
+ left: 0;
137
+ width: 100%;
138
+ height: 2px;
139
+ background: linear-gradient(to right, transparent, var(--accent), transparent);
140
+ animation: scan 2s linear infinite;
141
+ }
142
+
143
+ @keyframes scan {
144
+ 0% { transform: translateX(-100%); }
145
+ 100% { transform: translateX(100%); }
146
+ }
147
+
148
+ .card-header {
149
+ padding: 1rem;
150
+ border-bottom: 1px solid var(--accent);
151
+ }
152
+
153
+ .card-image {
154
+ width: 100%;
155
+ height: 150px;
156
+ overflow: hidden;
157
+ margin-bottom: 1rem;
158
+ border: 1px solid var(--accent);
159
+ }
160
+
161
+ .card-image img {
162
+ width: 100%;
163
+ height: 100%;
164
+ object-fit: cover;
165
+ transition: transform 0.3s ease;
166
+ }
167
+
168
+ .card-image:hover img {
169
+ transform: scale(1.05);
170
+ }
171
+
172
+ .card-header h3 {
173
+ color: var(--accent);
174
+ font-family: 'Share Tech Mono', monospace;
175
+ margin: 0;
176
+ font-size: 1.2rem;
177
+ }
178
+
179
+ .card-body {
180
+ padding: 1rem;
181
+ }
182
+
183
+ .description {
184
+ color: var(--text);
185
+ margin-bottom: 1rem;
186
+ font-size: 0.9rem;
187
+ opacity: 0.8;
188
+ }
189
+
190
+ .details {
191
+ display: flex;
192
+ gap: 1rem;
193
+ margin-top: 1rem;
194
+ }
195
+
196
+ .detail-item {
197
+ display: flex;
198
+ align-items: center;
199
+ gap: 0.5rem;
200
+ color: var(--text);
201
+ font-size: 0.9rem;
202
+ }
203
+
204
+ .detail-item i {
205
+ color: var(--accent);
206
+ }
207
+
208
+ .meta {
209
+ color: var(--text);
210
+ font-size: 0.9rem;
211
+ opacity: 0.8;
212
+ }
213
+
214
+ .meta i {
215
+ margin-right: 0.5rem;
216
+ color: var(--accent);
217
+ }
218
+
219
+ .card-footer {
220
+ padding: 1rem;
221
+ border-top: 1px solid var(--accent);
222
+ display: flex;
223
+ gap: 1rem;
224
+ }
225
+
226
+ .btn {
227
+ font-family: 'Share Tech Mono', monospace;
228
+ letter-spacing: 1px;
229
+ transition: all 0.3s ease;
230
+ }
231
+
232
+ .btn-danger {
233
+ background: var(--accent);
234
+ border: none;
235
+ padding: 0.5rem 1rem;
236
+ }
237
+
238
+ .btn-outline-danger {
239
+ background: transparent;
240
+ border: 1px solid var(--accent);
241
+ color: var(--accent);
242
+ padding: 0.5rem 1rem;
243
+ }
244
+
245
+ .btn:hover {
246
+ transform: translateY(-2px);
247
+ box-shadow: 0 2px 10px rgba(255, 0, 0, 0.3);
248
+ }
249
+
250
+ .btn-outline-danger:hover {
251
+ background: rgba(255, 0, 0, 0.1);
252
+ }
253
+
254
+ .btn i {
255
+ margin-right: 0.5rem;
256
+ }
257
+
258
+ @media (max-width: 768px) {
259
+ .admin-dashboard {
260
+ padding: 1rem;
261
+ }
262
+
263
+ .data-grid {
264
+ grid-template-columns: 1fr;
265
+ }
266
+ }
267
+ </style>
268
+ {% endblock %}