Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OA Forms and Pagination #34

Merged
merged 7 commits into from
Jan 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions stack/django/.env
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ OA_ENV_EMAIL=console
OA_ENV_STORAGE=local

#### Your API Server protocol:host:port ####
REACT_APP_API_HOST=https://localapi.oaexample.com:8080
# REACT_APP_API_HOST=https://localapi.oaexample.com:8080
# REACT_APP_API_HOST=https://django-service:8080
# REACT_APP_API_HOST=http://localhost:8080
# REACT_APP_API_HOST=https://api.oaexample.com
REACT_APP_API_HOST=https://api.oaexample.com

#### Your Webapp Server protocol:host:port ####
REACT_APP_APP_HOST=https://localhost.oaexample.com:3000
# REACT_APP_APP_HOST=https://localhost.oaexample.com:3000
# REACT_APP_APP_HOST=http://localhost:3000
# REACT_APP_APP_HOST=https://oaexample.com
REACT_APP_APP_HOST=https://oaexample.com


DJANGO_SECRET_KEY=CHANGEME
Expand Down
40 changes: 20 additions & 20 deletions stack/django/oaexample_app/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,133 +118,133 @@ class TopicsViewSet(viewsets.ModelViewSet):
filter_backends = [filters.SearchFilter]
search_fields = ['name']


class ResourceTypesViewSet(viewsets.ModelViewSet):
queryset = ResourceTypes.objects.all().order_by('id')
serializer_class = ResourceTypesSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['name']


class MeetingTypesViewSet(viewsets.ModelViewSet):
queryset = MeetingTypes.objects.all().order_by('id')
serializer_class = MeetingTypesSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['name']


class StatesViewSet(viewsets.ModelViewSet):
queryset = States.objects.all().order_by('id')
serializer_class = StatesSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['name']


class PartiesViewSet(viewsets.ModelViewSet):
queryset = Parties.objects.all().order_by('id')
serializer_class = PartiesSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['name']


class StakeholdersViewSet(viewsets.ModelViewSet):
queryset = Stakeholders.objects.all().order_by('id')
serializer_class = StakeholdersSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['name']


class ResourcesViewSet(viewsets.ModelViewSet):
queryset = Resources.objects.all().order_by('id')
serializer_class = ResourcesSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['title']


class UsersViewSet(viewsets.ModelViewSet):
queryset = Users.objects.all().order_by('id')
serializer_class = UsersSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['first_name', 'last_name']


class CitiesViewSet(viewsets.ModelViewSet):
queryset = Cities.objects.all().order_by('id')
serializer_class = CitiesSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['name']


class OfficialsViewSet(viewsets.ModelViewSet):
queryset = Officials.objects.all().order_by('id')
serializer_class = OfficialsSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['title']


class RalliesViewSet(viewsets.ModelViewSet):
queryset = Rallies.objects.all().order_by('id')
serializer_class = RalliesSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['title']


class ActionPlansViewSet(viewsets.ModelViewSet):
queryset = ActionPlans.objects.all().order_by('id')
serializer_class = ActionPlansSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['title']


class MeetingsViewSet(viewsets.ModelViewSet):
queryset = Meetings.objects.all().order_by('id')
serializer_class = MeetingsSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['title']


class InvitesViewSet(viewsets.ModelViewSet):
queryset = Invites.objects.all().order_by('id')
serializer_class = InvitesSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['meeting__title']


class SubscriptionsViewSet(viewsets.ModelViewSet):
queryset = Subscriptions.objects.all().order_by('id')
serializer_class = SubscriptionsSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['rally__title', 'meeting__title']


class RoomsViewSet(viewsets.ModelViewSet):
queryset = Rooms.objects.all().order_by('id')
serializer_class = RoomsSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
filter_backends = [filters.SearchFilter]
search_fields = ['rally__title', 'meeting__title']


class AttendeesViewSet(viewsets.ModelViewSet):
queryset = Attendees.objects.all().order_by('id')
serializer_class = AttendeesSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]


####OBJECT-ACTIONS-VIEWSETS-ENDS####


Expand Down Expand Up @@ -491,7 +491,7 @@ def post(self, request, *args, **kwargs):
email=f'{phone_number}@sms-placeholder.com',
phone=phone_number)
created = True
redirect_url = f"/onboarding"
redirect_url = f"/users/{user.id}"

if created:
user.phone = phone_number # Save the phone field
Expand All @@ -518,4 +518,4 @@ def post(self, request, *args, **kwargs):

return JsonResponse({"error": "Invalid code"}, status=status.HTTP_400_BAD_REQUEST)

return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
3 changes: 3 additions & 0 deletions stack/django/oaexample_base/settings/security.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ def get_tld(hostname):

ALLOWED_HOSTS = [get_tld(API_HOST_PARTS.hostname), f".{get_tld(API_HOST_PARTS.hostname)}"]

# experimenting by adding the APP_HOST as and ALLOWED_HOST (per https://github.com/pennersr/django-allauth/issues/4041)
ALLOWED_HOSTS += [f"{get_tld(APP_HOST_PARTS.hostname)}", f".{get_tld(APP_HOST_PARTS.hostname)}"]

CORS_ALLOWED_ORIGINS = [APP_HOST, API_HOST]
DEV_PORT = '3000' if not APP_HOST_PARTS.port else APP_HOST_PARTS.port

Expand Down
32 changes: 14 additions & 18 deletions stack/reactjs/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,34 +1,30 @@
import * as React from 'react';
import Router from './Router';
import ObjectActionsProvider from './object-actions/ObjectActionsProvider';
import { ThemeProvider } from './theme/ThemeContext';
import { NavDrawerProvider } from './NavDrawerProvider';
import TrackingConsent from './components/TrackingConsent';
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import { AuthContextProvider } from './allauth/auth';
import { SnackbarProvider } from 'notistack';
import { EnvProvider } from './object-actions/EnvProvider';
import * as React from "react";
import Router from "./Router";
import { ThemeProvider } from "./theme/ThemeContext";
import { NavDrawerProvider } from "./NavDrawerProvider";
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
import { AuthContextProvider } from "./allauth/auth";
import { SnackbarProvider } from "notistack";
import { EnvProvider } from "./object-actions/forming/EnvProvider";

export default function App() {
return (
<ThemeProvider>
<SnackbarProvider
maxSnack={4}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'center',
vertical: "bottom",
horizontal: "center"
}}
style={{ marginBottom: 50 }}
>
<EnvProvider>
<AuthContextProvider>
<NavDrawerProvider>
<ObjectActionsProvider>
<LocalizationProvider dateAdapter={AdapterDayjs}>
<Router />
</LocalizationProvider>
</ObjectActionsProvider>
<LocalizationProvider dateAdapter={AdapterDayjs}>
<Router />
</LocalizationProvider>
</NavDrawerProvider>
</AuthContextProvider>
</EnvProvider>
Expand Down
13 changes: 0 additions & 13 deletions stack/reactjs/src/components/DrawerMenu.tsx

This file was deleted.

47 changes: 24 additions & 23 deletions stack/reactjs/src/components/NavMenu.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import React from 'react';
import { Link, useLocation } from 'react-router-dom';
import { Box, Collapse, Divider, List, ListItemButton, ListItemText } from '@mui/material';
import { NAVITEMS } from '../object-actions/types/types';
import AuthMenu from '../components/AuthMenu';
import { ExpandLess, ExpandMore } from '@mui/icons-material';
import OALogo from '../object-actions/docs/OALogo';
import OaMenu from '../object-actions/docs/OaMenu';
import ThemeSwitcher from '../theme/ThemeSwitcher';
import React from "react";
import { Link, useLocation } from "react-router-dom";
import { Box, Collapse, Divider, List, ListItemAvatar, ListItemButton, ListItemText } from "@mui/material";
import { NAVITEMS } from "../object-actions/types/types";
import AuthMenu from "../components/AuthMenu";
import { ExpandLess, ExpandMore } from "@mui/icons-material";
import OALogo from "../object-actions/docs/OALogo";
import OaMenu from "../object-actions/docs/OaMenu";
import ThemeSwitcher from "../theme/ThemeSwitcher";

const NavMenu = () => {
const location = useLocation();
const [objectsOpen, setObjectsOpen] = React.useState(false);
const [oaMenuOpen, setOAMenuOpen] = React.useState(
location.pathname.indexOf('/oa/') === 0,
location.pathname.indexOf("/oa/") === 0
);

const handleClick = () => {
Expand All @@ -21,31 +21,31 @@ const NavMenu = () => {

return (
<React.Fragment>
<List id={'NavMenu'} dense={true}>
<List id={"NavMenu"} dense={true} style={{marginBottom: 0, paddingBottom:0}}>
<AuthMenu />

<Divider
sx={{
marginBottom: 1,
marginTop: 1,
backgroundColor: 'primary.dark',
backgroundColor: "primary.dark"
}}
/>

<ListItemButton
dense={true}
style={{ justifyContent: 'space-between' }}
style={{ justifyContent: "space-between" }}
onClick={handleClick}
>
<ListItemText primary="Objects" />
{objectsOpen ? (
<ExpandLess fontSize={'small'} />
<ExpandLess fontSize={"small"} />
) : (
<ExpandMore fontSize={'small'} />
<ExpandMore fontSize={"small"} />
)}
</ListItemButton>

<Collapse in={objectsOpen} timeout="auto" unmountOnExit>
<div id={'ObjectTypesMenu'}>
<div id={"ObjectTypesMenu"}>
{NAVITEMS.map((item) => {
return (
<ListItemButton
Expand All @@ -60,20 +60,21 @@ const NavMenu = () => {
})}
</div>
</Collapse>

</List>

<Divider
sx={{ marginBottom: 1, marginTop: 1, backgroundColor: 'primary.dark' }}
sx={{ backgroundColor: "primary.dark" }}
/>

<List dense={true}>
<ListItemButton onClick={() => setOAMenuOpen(!oaMenuOpen)}>
<OALogo height={24} />
<ListItemText sx={{ml:1}} primary={'O/A'} />
<ListItemAvatar sx={{ minWidth: 40 }}><OALogo height={21} /></ListItemAvatar>
<ListItemText primary={"O/A"} />
{oaMenuOpen ? (
<ExpandLess fontSize={'small'} />
<ExpandLess fontSize={"small"} />
) : (
<ExpandMore fontSize={'small'} />
<ExpandMore fontSize={"small"} />
)}
</ListItemButton>

Expand All @@ -82,7 +83,7 @@ const NavMenu = () => {
</Collapse>
</List>

<Box p={1} ml={2} style={{ textAlign: 'center' }}>
<Box p={1} ml={2} style={{ textAlign: "center" }}>
<ThemeSwitcher />
</Box>
</React.Fragment>
Expand Down
Loading