Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
0606c0f
Add types page and table
BionicCat27 Oct 18, 2022
7c147f8
Remove redundant type page comments
BionicCat27 Oct 18, 2022
6a0b15e
Add home page and navigation
Oct 19, 2022
55a6885
Add types, views and home pages
Oct 26, 2022
f7559cd
Add index table to view page
Oct 27, 2022
05cd9d6
Change types page to index table, remove tables
Oct 27, 2022
1052ea2
Add index list
Oct 27, 2022
562886a
Add nav context and view index list
Oct 27, 2022
1343ade
Add edit view page
Oct 27, 2022
66e08b8
Add target key to types page
Oct 27, 2022
fb40790
Add type index list to home page
BionicCat27 Nov 24, 2022
ef40f65
Add type edit page, nav targets
BionicCat27 Nov 24, 2022
d27e310
Add pointer cursor for clickable items
BionicCat27 Nov 24, 2022
bd01140
Add editable fields and better backbtn routing
BionicCat27 Dec 1, 2022
d32c1c4
Improve styling, hrs, inputs
BionicCat27 Dec 1, 2022
2a2fb6b
Add edit view displays list
BionicCat27 Dec 14, 2022
4f0a9e0
Add editable displays
BionicCat27 Dec 24, 2022
6c79101
Add save editable text on enter
BionicCat27 Dec 24, 2022
5562cf2
Add type index tables and type data retrieval
BionicCat27 Jan 2, 2023
1ddbaf4
Remove debugging logs, add keys to mapped objects
BionicCat27 Jan 2, 2023
579c0d7
Add default value, display titles
BionicCat27 Jan 2, 2023
d085466
Add basic list display, navigation history
BionicCat27 Jan 7, 2023
f3c7c90
Refactor home page to use data contexts
BionicCat27 Jan 7, 2023
8ebdbe9
Refactor view/type pages for data contexts
BionicCat27 Jan 7, 2023
8904542
Refactor type and view editing pages for context
BionicCat27 Jan 9, 2023
1ae9bfe
Make onChange call not execute on start
BionicCat27 Jan 11, 2023
33ff293
Change timeline page onvalue default function call
BionicCat27 Jan 11, 2023
a176763
Improved table styling
BionicCat27 Jan 13, 2023
3d9683c
Add data page editing and paths
BionicCat27 Feb 4, 2023
cee1d00
Wrap table row in table
BionicCat27 Feb 4, 2023
7cc4086
Add Card display
BionicCat27 Mar 2, 2023
fd782a3
Removing redundant pages
BionicCat27 Apr 14, 2023
a1d500a
Add card styling
BionicCat27 Apr 14, 2023
cfb2432
Improve display selector interface
BionicCat27 Apr 15, 2023
46c1677
Add remove button for typedata
BionicCat27 Apr 15, 2023
f536aa1
Add remove button styling and order by tidying
BionicCat27 Apr 15, 2023
bf2711e
Merge branch 'master' of https://github.com/BionicCat27/My-Simple-Pri…
BionicCat27 May 6, 2023
0b86e99
Fix list navigation
BionicCat27 May 6, 2023
ff1a480
Add type field selectors and editors
BionicCat27 May 7, 2023
99ad7c4
Add type data field editing
BionicCat27 May 7, 2023
ce5850c
Card orderby config implemented
BionicCat27 May 9, 2023
ff81e98
Fix sorting
BionicCat27 May 9, 2023
db9097b
Add unique value checkbox
BionicCat27 May 9, 2023
96f83f0
Merge branch 'master' of https://github.com/BionicCat27/My-Simple-Pri…
BionicCat27 Jun 28, 2023
a24cecd
Fix checkbox control
BionicCat27 Jun 28, 2023
65ad6d1
Add index field
BionicCat27 Jun 29, 2023
462fb5f
Allow only one index field on a type
BionicCat27 Jun 29, 2023
24560c7
Fix typedata field keying
BionicCat27 Jun 29, 2023
2829dd8
TEMP COMMIT
BionicCat27 Aug 15, 2023
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
20,648 changes: 14,031 additions & 6,617 deletions package-lock.json

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,12 @@
"cross-env": "^7.0.3",
"css-loader": "^6.5.1",
"dotenv": "^14.3.2",
"expo": "^48.0.4",
"firebase": "^9.6.5",
"nodemon": "^2.0.15",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-router-dom": "^6.2.1",
"style-loader": "^3.3.1"
}
}
}
56 changes: 36 additions & 20 deletions src/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,31 +8,47 @@ import './firebaseConfig';
import LoginPage from './pages/login/loginPage.js';
import SignupPage from './pages/signup/signupPage.js';
import NotFoundPage from './pages/notFound/notFoundPage.js';
import TodoPage from './pages/todo/todoPage.js';
import PrioritiesPage from './pages/priorities/prioritiesPage';
import ReviewPage from './pages/review/reviewPage';
import TimelinePage from './pages/timeline/timelinePage';
import HomePage from './pages/home/homePage';
import { AuthProvider } from './contexts/AuthContext';
import { DBProvider } from './contexts/DBContext';
import { NavigationProvider } from './contexts/NavigationContext';
import { TypesProvider } from './contexts/TypesContext';
import { ViewsProvider } from './contexts/ViewsContext';
import TypesPage from './pages/types/typesPage';
import TypePage from './pages/type/typePage';
import ViewsPage from './pages/views/viewsPage';
import ViewPage from './pages/view/viewPage';
import EditViewPage from './pages/editview/editViewPage';
import EditTypePage from './pages/edittype/editTypePage';
import TypeDataPage from './pages/typedata/typeDataPage';

const App = () => {
return (
<AuthProvider>
<DBProvider>
<BrowserRouter>
<Routes>
<Route path="/" element={<PrioritiesPage />} />
<Route path="/priorities" element={<PrioritiesPage />} />
<Route path="/todo" element={<TodoPage />} />
<Route path="/review" element={<ReviewPage />} />
<Route path="/timeline" element={<TimelinePage />} />
<Route path="/login" element={<LoginPage />} />
<Route path="/signup" element={<SignupPage />} />
<Route path="*" element={<NotFoundPage />} />
</Routes >
</BrowserRouter >
</DBProvider>
</AuthProvider>
<NavigationProvider>
<AuthProvider>
<DBProvider>
<TypesProvider>
<ViewsProvider>
<BrowserRouter>
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/login" element={<LoginPage />} />
<Route path="/signup" element={<SignupPage />} />
<Route path="/types" element={<TypesPage />} />
<Route path="/type" element={<TypePage />} />
<Route path="/views" element={<ViewsPage />} />
<Route path="/view" element={<ViewPage />} />
<Route path="/editview" element={<EditViewPage />} />
<Route path="/edittype" element={<EditTypePage />} />
<Route path="/data" element={<TypeDataPage />} />
<Route path="*" element={<NotFoundPage />} />
</Routes >
</BrowserRouter >
</ViewsProvider>
</TypesProvider>
</DBProvider>
</AuthProvider>
</NavigationProvider>
);
};

Expand Down
20 changes: 20 additions & 0 deletions src/components/Displays/CardsDisplay/Card.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//React
import React, { useContext } from 'react';
import { NavigationContext } from '../../../contexts/NavigationContext';
import './Card.css';
const Card = (props) => {

const { navigateToPage } = useContext(NavigationContext);

const cardTitle = props.cardTitle;
const typeKey = props.typeKey;
const dataKey = props.dataKey;

return (
<div draggable className={"content_card clickable"} onClick={() => { navigateToPage("/data", { typeKey: typeKey, dataKey: dataKey }); }}>
{cardTitle}
</div >
);
};

export default Card;
53 changes: 53 additions & 0 deletions src/components/Displays/CardsDisplay/CardsDisplay.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//React
import React, { useContext } from 'react';
import { NavigationContext } from '../../../contexts/NavigationContext';
import { TypesContext } from '../../../contexts/TypesContext';
import IndexTableFormRow from '../../IndexTable/IndexTableFormRow';
import Card from './Card';
const CardsDisplay = (props) => {

const { getType } = useContext(TypesContext);

const display = props.display;
let typeKey = display.type;
let typeData = getType(typeKey);

let orderBy = display?.orderBy;

if (!typeData || !typeData.name) {
return (
<p>No type found.</p>
);
}

let datatype = { name: "Data", field: `types/${typeKey}/data`, target: "data" };
let fields = [{ name: "Name", field: "name" }, { name: "Description", field: "description" }];

function keyData(data) {
if (!data) {
return [];
}
let keyedData = Object.keys(data).map((key) => {
let value = data[key];
value.key = key;
return value;
});
return keyedData;
}
let keyedData = keyData(typeData.data);
return (
<>
<h2>{display.title}</h2>
<table><thead><IndexTableFormRow datatype={datatype} fields={fields} /></thead></table>
{keyedData.sort((object1, object2) => {
if (object1?.fields && object2?.fields) {
return object1.fields[orderBy] - object2.fields[orderBy];
}
}).map((object) => {
return <Card className={"clickable"} key={JSON.stringify(object)} cardTitle={object.name} typeKey={typeData.key} dataKey={object.key} />;
})}
</>
);
};

export default CardsDisplay;
160 changes: 160 additions & 0 deletions src/components/Displays/CardsDisplay/EditableCardsDisplay.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
//React
import { off, onValue, ref, remove, update } from 'firebase/database';
import React, { useContext, useEffect, useState } from 'react';
import { AuthContext } from '../../../contexts/AuthContext';
import { DBContext } from '../../../contexts/DBContext';
import EditableText from '../../EditableText/EditableText';
import { TypesContext } from '../../../contexts/TypesContext';
const EditableCardsDisplay = (props) => {

const { user } = useContext(AuthContext);
const { database } = useContext(DBContext);
const { getType } = useContext(TypesContext);

const [typesDbRef, setTypesDbRef] = useState(undefined);
const [displayDbRef, setDisplayDbRef] = useState(undefined);
const [types, setTypes] = useState([]);

const display = props.display;
const displayRef = props.displayRef;

let displayType = display?.type || undefined;
let displayOrderBy = display?.orderBy || undefined;

let typeData = getType(displayType);
let typeFields = [];
if (typeData?.fields) {
typeFields = Object.keys(typeData.fields).map((key) => {
let value = typeData.fields[key];
value.key = key;
return value;
});
}


//Set db ref on user set
useEffect(() => {
if (user) {
if (typesDbRef) {
off(typesDbRef);
}
if (displayDbRef) {
off(displayDbRef);
}
setTypesDbRef(ref(database, `users/${user.uid}/types`));
if (display) {
setDisplayDbRef(ref(database, `${displayRef}`));
}
setTypes([]);
}
}, [user]);

useEffect(() => {
if (!typesDbRef) {
return;
}
if (!user) {
console.log("Can't load content - no user found.");
return;
}
onValue(typesDbRef, (snapshot) => {
const data = snapshot.val();
if (data == null) {
console.log("An error occurred.");
setTypes([]);
return;
}
let keyedData = Object.keys(data).map((key) => {
let value = data[key];
value.key = key;
return value;
});
setTypes(keyedData);
});
}, [typesDbRef]);

function setDisplayType(value) {
if (displayDbRef) {
let updates = {};
updates["type"] = value;
let res = update(displayDbRef, updates);
}
}

function setDisplayValue(dataPath, fieldName, value) {
if (displayDbRef) {
let updates = {};
updates[fieldName] = value;

let res = update(displayDbRef, updates);
}
};

function setOrderBy(value) {
if (displayDbRef) {
let updates = {};
updates["orderBy"] = value;
let res = update(displayDbRef, updates);
}
}

function clearType() {
remove(ref(database, `${displayRef}/type`));

}

function clearOrderBy() {
remove(ref(database, `${displayRef}/orderBy`));
}

if (!display) {
return null;
}

return (
<div>
<h3>Card Display</h3>
<label>Title</label>
<EditableText value={display.title} fieldName="title" element={(content) => <h3>{content}</h3>} changeValue={setDisplayValue} dbPath={""} />
<label>Type</label>
<select value={displayType ? displayType : "Select Type"} onChange={field => setDisplayType(field.target.value)}>
{(display && display.type)
? null
: <option defaultValue={true} hidden disabled>Select Type</option>
}
{types.map((type) => {
if (type.key == displayType) {
return <option key={type.key} value={type.key} defaultValue>{type.name}</option>;
}
return (
<option key={type.key} value={type.key}>{type.name}</option>
);
})}
</select>
<p className={"clickable clear_button"} onClick={() => clearType()}>Clear</p>
{
typeData ? <>
<label>Order By</label>
<select value={displayOrderBy ? displayOrderBy : "Select Order By Field"} onChange={field => setOrderBy(field.target.value)}>
{(display && display.orderBy)
? null
: <option defaultValue hidden disabled>Select Order By Field</option>
}
{typeFields.map((field) => {
if (field.key === displayOrderBy) {
return <option key={field.key} value={field.key} defaultValue={true}>{field.title}</option>;
}
return (
<option key={field.key} value={field.key}>{field.title}</option>
);
})}
</select>
<p className={"clickable clear_button"} onClick={() => clearOrderBy()}>Clear</p>
</> : null
}

</div>
);
};

export default EditableCardsDisplay;
Loading