Skip to content
Open
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
14 changes: 13 additions & 1 deletion pscompose/api/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
tasks,
templates,
tests,
home,
)

# initialize FastAPI application
Expand All @@ -25,7 +26,18 @@
)

# include submodule routers
for lib in [addresses, archives, basic_auth, contexts, groups, schedules, tasks, templates, tests]:
for lib in [
addresses,
archives,
basic_auth,
contexts,
groups,
schedules,
tasks,
templates,
tests,
home,
]:
app.include_router(lib.router)


Expand Down
1 change: 1 addition & 0 deletions pscompose/api/routers/addresses.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ def get_existing_form(item_id: str):
} # Need to remove null fields

response_json["name"] = response.name # Adding "name" since it's not present in the json
response_json["favorited"] = response.favorited
except HTTPException:
raise HTTPException(status_code=404, detail=f"Address with id: {item_id} not found")

Expand Down
1 change: 1 addition & 0 deletions pscompose/api/routers/archives.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def get_existing_form(item_id: str):
} # Need to remove null fields

response_json["name"] = response.name # Adding "name" since it's not present in the json
response_json["favorited"] = response.favorited
except HTTPException:
raise HTTPException(status_code=404, detail=f"Address with id: {item_id} not found")

Expand Down
1 change: 1 addition & 0 deletions pscompose/api/routers/contexts.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ def get_existing_form(item_id: str):
} # Need to remove null fields

response_json["name"] = response.name # Adding "name" since it's not present in the json
response_json["favorited"] = response.favorited
except HTTPException:
raise HTTPException(status_code=404, detail=f"Address with id: {item_id} not found")

Expand Down
1 change: 1 addition & 0 deletions pscompose/api/routers/groups.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ def get_existing_form(item_id: str):
} # Need to remove null fields

response_json["name"] = response.name # Adding "name" since it's not present in the json
response_json["favorited"] = response.favorited
except HTTPException:
raise HTTPException(status_code=404, detail=f"Group with id: {item_id} not found")

Expand Down
23 changes: 23 additions & 0 deletions pscompose/api/routers/home.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from fastapi import APIRouter
from pscompose.backends.postgres import backend

# Setup CRUD endpoints
router = APIRouter(tags=["home"])


@router.get(
"/api/recently_edited",
summary="Return first 3 items of most recently edited",
)
def recently_edited():
rows = backend.get_recently_edited(3)
return rows


@router.get(
"/api/favorites",
summary="Return first 3 items of favorites",
)
def favorites():
rows = backend.get_favorites(3)
return rows
1 change: 1 addition & 0 deletions pscompose/api/routers/schedules.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ def get_existing_form(item_id: str):
} # Need to remove null fields

response_json["name"] = response.name # Adding "name" since it's not present in the json
response_json["favorited"] = response.favorited
except HTTPException:
raise HTTPException(status_code=404, detail=f"Address with id: {item_id} not found")

Expand Down
1 change: 1 addition & 0 deletions pscompose/api/routers/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def get_existing_form(item_id: str):
} # Need to remove null fields

response_json["name"] = response.name # Adding "name" since it's not present in the json
response_json["favorited"] = response.favorited
except HTTPException:
raise HTTPException(status_code=404, detail=f"Task with id: {item_id} not found")

Expand Down
1 change: 1 addition & 0 deletions pscompose/api/routers/templates.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ def get_existing_form(item_id: str):
response = backend.get_datatype(datatype=DataTypes.TEMPLATE, item_id=item_id)
response_json = response.json
response_json["name"] = response.name # Adding "name" since it's not present in the json
response_json["favorited"] = response.favorited
except HTTPException:
raise HTTPException(status_code=404, detail=f"Address with id: {item_id} not found")

Expand Down
1 change: 1 addition & 0 deletions pscompose/api/routers/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ def get_existing_form(item_id: str):
} # Need to remove null fields

response_json["name"] = response.name # Adding "name" since it's not present in the json
response_json["favorited"] = response.favorited
except HTTPException:
raise HTTPException(status_code=404, detail=f"Test with id: {item_id} not found")

Expand Down
21 changes: 20 additions & 1 deletion pscompose/backends/postgres.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ def __init__(self):
DataTable.__table__.create(bind=engine, checkfirst=True)
self.session = sessionmaker(bind=engine)()

def create_datatype(self, ref_set, datatype, json, name, created_by, last_edited_by):
def create_datatype(
self, ref_set, datatype, json, name, created_by, last_edited_by, favorited
):
try:
new_type = DataTable(
ref_set=ref_set,
Expand All @@ -24,6 +26,7 @@ def create_datatype(self, ref_set, datatype, json, name, created_by, last_edited
name=name,
created_by=created_by,
last_edited_by=last_edited_by,
favorited=favorited,
# created_at = created_at,
# last_edited_at = last_edited_at,
# url = url
Expand Down Expand Up @@ -61,6 +64,7 @@ def update_datatype(self, existing_result, updated_data):
"ref_set": existing_result.ref_set,
"last_edited_by": existing_result.last_edited_by,
"last_edited_at": existing_result.last_edited_at,
"favorited": existing_result.favorited,
}
except Exception as e:
self.session.rollback()
Expand Down Expand Up @@ -179,5 +183,20 @@ def get_datatype(self, datatype, item_id):
else:
return result

def get_recently_edited(self, limit: int = 5):
query = self.session.query(DataTable).order_by(DataTable.created_at.desc()).limit(limit)
rows = query.all()
return [row for row in rows]

def get_favorites(self, limit: int = 5):
query = (
self.session.query(DataTable)
.filter_by(favorited=True)
.order_by(DataTable.created_at.desc())
.limit(limit)
)
rows = query.all()
return [row for row in rows]


backend = PostgresBackend()
4 changes: 2 additions & 2 deletions pscompose/form_schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,12 +89,12 @@
{
"type": "Control",
"scope": "#/properties/lead-bind-address",
"customComponent": "input-text",
"customComponent": "input-text-autocomplete",
},
{
"type": "Control",
"scope": "#/properties/pscheduler-address",
"customComponent": "input-text",
"customComponent": "input-text-autocomplete",
},
{
"type": "Control",
Expand Down
68 changes: 35 additions & 33 deletions pscompose/frontend/app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,10 @@
<script src="/components/web-modal.js" type="module"></script>
<script src="/components/input-text.js" type="module"></script>
<script src="/components/input-text-area.js" type="module"></script>
<script src="/components/input-text-autocomplete.js" type="module"></script>
<script src="/components/input-number.js" type="module"></script>
<script src="/components/input-checkbox.js" type="module"></script>
<script src="/components/input-checkbox-star.js" type="module"></script>
<script src="/components/input-label.js" type="module"></script>
<script src="/components/input-message.js" type="module"></script>
<script src="/components/progress-bar.js" type="module"></script>
Expand Down Expand Up @@ -246,63 +248,63 @@
icon: "locate",
},
],
addresses: {
address: {
singular: "Address",
plural: "Addresses",
page_url: "/addresses/",
page_template: "/pages/data_form.html",
list_endpoint: "http://localhost:8000/api/address/",
icon: "hard-drive-download",
},
archives: {
archive: {
singular: "Archive",
plural: "Archives",
page_url: "/archives/",
page_template: "/pages/data_form.html",
list_endpoint: "http://localhost:8000/api/archive/",
icon: "database",
},
contexts: {
context: {
singular: "Context",
plural: "Contexts",
page_url: "/contexts/",
page_template: "/pages/data_form.html",
list_endpoint: "http://localhost:8000/api/context/",
icon: "file-question",
},
groups: {
group: {
singular: "Group",
plural: "Groups",
page_url: "/groups/",
page_template: "/pages/data_form.html",
list_endpoint: "http://localhost:8000/api/group/",
icon: "group",
},
schedules: {
schedule: {
singular: "Schedule",
plural: "Schedules",
page_url: "/schedules/",
page_template: "/pages/data_form.html",
list_endpoint: "http://localhost:8000/api/schedule/",
icon: "calendar-check",
},
tasks: {
task: {
singular: "Task",
plural: "Tasks",
page_url: "/tasks/",
page_template: "/pages/data_form.html",
list_endpoint: "http://localhost:8000/api/task/",
icon: "clipboard-list",
},
templates: {
template: {
singular: "Template",
plural: "Templates",
page_url: "/templates/",
page_template: "/pages/data_form.html",
list_endpoint: "http://localhost:8000/api/template/",
icon: "locate",
},
tests: {
test: {
singular: "Test",
plural: "Tests",
page_url: "/tests/",
Expand All @@ -313,14 +315,14 @@
},
};
psCompose.menu = {
addresses: psCompose.metadata["addresses"],
archives: psCompose.metadata["archives"],
contexts: psCompose.metadata["contexts"],
groups: psCompose.metadata["groups"],
schedules: psCompose.metadata["schedules"],
tasks: psCompose.metadata["tasks"],
templates: psCompose.metadata["templates"],
tests: psCompose.metadata["tests"],
address: psCompose.metadata["address"],
archive: psCompose.metadata["archive"],
context: psCompose.metadata["context"],
group: psCompose.metadata["group"],
schedule: psCompose.metadata["schedule"],
task: psCompose.metadata["task"],
template: psCompose.metadata["template"],
test: psCompose.metadata["test"],
};
psCompose.router = {
"/wizard/1/addresses/": psCompose.metadata["wizard"][0],
Expand All @@ -333,22 +335,22 @@
"/wizard/8/template/": psCompose.metadata["wizard"][7],
"/import/1/import_template/": psCompose.metadata["import"][0],
"/import/2/import_template_saved/": psCompose.metadata["import"][1],
"/addresses/": psCompose.metadata["addresses"],
"/addresses/new/": psCompose.metadata["addresses"],
"/archives/": psCompose.metadata["archives"],
"/archives/new/": psCompose.metadata["archives"],
"/contexts/": psCompose.metadata["contexts"],
"/contexts/new/": psCompose.metadata["contexts"],
"/groups/": psCompose.metadata["groups"],
"/groups/new/": psCompose.metadata["groups"],
"/schedules/": psCompose.metadata["schedules"],
"/schedules/new/": psCompose.metadata["schedules"],
"/tasks/": psCompose.metadata["tasks"],
"/tasks/new/": psCompose.metadata["tasks"],
"/templates/": psCompose.metadata["templates"],
"/templates/new/": psCompose.metadata["templates"],
"/tests/": psCompose.metadata["tests"],
"/tests/new/": psCompose.metadata["tests"],
"/addresses/": psCompose.metadata["address"],
"/addresses/new/": psCompose.metadata["address"],
"/archives/": psCompose.metadata["archive"],
"/archives/new/": psCompose.metadata["archive"],
"/contexts/": psCompose.metadata["context"],
"/contexts/new/": psCompose.metadata["context"],
"/groups/": psCompose.metadata["group"],
"/groups/new/": psCompose.metadata["group"],
"/schedules/": psCompose.metadata["schedule"],
"/schedules/new/": psCompose.metadata["schedule"],
"/tasks/": psCompose.metadata["task"],
"/tasks/new/": psCompose.metadata["task"],
"/templates/": psCompose.metadata["template"],
"/templates/new/": psCompose.metadata["template"],
"/tests/": psCompose.metadata["test"],
"/tests/new/": psCompose.metadata["test"],
};

// the actual URL router
Expand All @@ -358,7 +360,7 @@
return "/pages/index.html";
}
psCompose.activeRoute = psCompose.router[path];
psCompose.activeMenuItem = path.split("/")[1];
psCompose.activeMenuItem = psCompose.router[path].singular.toLowerCase();
psCompose.subsection = path.split("/")[2];
psCompose.pathParts = path.split("/");

Expand Down
7 changes: 7 additions & 0 deletions pscompose/frontend/components/dropdown-single-select.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,13 @@ export class SingleSelectDropdown extends FormControl {
li.addEventListener("click", (e) => this.handleOptionClick(e));
this.optionsEl.appendChild(li);
});
document.addEventListener("click", (e) => this.closeDropdownOutside(e));
}

closeDropdownOutside(e) {
if (!this.contains(e.target)) {
this.optionsEl.classList.remove("open");
}
}

render() {
Expand Down
Loading