Skip to content
Draft
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
5 changes: 3 additions & 2 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"postcss": "^8.5.6",
"shiki": "^4.0.2",
"tailwindcss": "^4.1.17",
"zone.js": "~0.15.0"
"zone.js": "~0.15.0",
"@placeos/ts-client": "github:PlaceOS/ts-client#b539b2b2aae36d40d739977ecee6589bb4d903c8"
},
"devDependencies": {
"@analogjs/vite-plugin-angular": "2.6.4",
Expand All @@ -52,7 +53,7 @@
"@nx/web": "23.1.1",
"@nx/workspace": "23.1.1",
"@placeos/cloud-uploads": "^1.1.3",
"@placeos/ts-client": "^6.7.0",
"@placeos/ts-client": "github:PlaceOS/ts-client#b539b2b2aae36d40d739977ecee6589bb4d903c8",
"@playwright/test": "^1.36.0",
"@schematics/angular": "22.0.0",
"@sentry/browser": "^10.25.0",
Expand Down
71 changes: 67 additions & 4 deletions public/assets/locale/en-AU.json
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,11 @@
"DATE_FROM_YEARS_AGO_1": "{{ years }} year ago",
"DATE_FROM_YEARS_AGO_N": "{{ years }} years ago",
"CRON_CUSTOM": "Custom",
"CONFIG": "Configuration"
"CONFIG": "Configuration",
"ORGANISATION": "Organisation",
"ORGANISATIONS": "Organisations",
"PARTNER": "Partner",
"PARTNERS": "Partners"
},
"SYSTEMS": {
"SINGULAR": "System",
Expand Down Expand Up @@ -701,7 +705,7 @@
"ROLE_NONE": "None",
"FIELD_GROUPS": "User Groups",
"FIELD_DEPARTMENT": "Department",
"AUTHORITY_ID": "Authority",
"AUTHORITY_ID": "Domain",
"NO_GROUPS": "No user groups",
"GROUPS_EMPTY": "No groups associated with this user",
"GROUPS_BULK": "Bulk add groups",
Expand Down Expand Up @@ -760,7 +764,7 @@
"TAB_USERS": "Users",
"TAB_ZONES": "Zones",
"NAME_REQUIRED": "A group name is required",
"AUTHORITY_ID": "Authority",
"AUTHORITY_ID": "Domain",
"AUTHORITY_SELECT": "Select domain",
"PARENT_ID": "Parent Group",
"PARENT_SEARCH": "Search for parent group...",
Expand Down Expand Up @@ -1283,7 +1287,8 @@
"AI_USAGE_JOBS": "Requests",
"AI_USAGE_LOAD_FAILED": "AI usage could not be loaded.",
"AI_USAGE_MADE": "Images made",
"TAB_SIGNAGE_AI": "Signage AI"
"TAB_SIGNAGE_AI": "Signage AI",
"TAB_ORGANISATIONS": "Organisations"
},
"CASCADE": {
"RESOLVING": "Working out what would be removed...",
Expand Down Expand Up @@ -1328,5 +1333,63 @@
"RECEIPT_COPY": "Copy list",
"RECEIPT_COPIED": "Copied {{ count }} rows to the clipboard.",
"RECEIPT_COPIED_1": "Copied {{ count }} row to the clipboard."
},
"ORGANISATIONS": {
"SINGULAR": "Organisation",
"PLURAL": "Organisations",
"SWITCH": "Switch organisation",
"SEARCH": "Search organisations",
"ALL": "All organisations",
"NO_MATCHING": "No matching organisations",
"UNOWNED": "No organisation (cluster only)",
"HEADER": "Organisations",
"PARTNERS_HEADER": "Partners",
"ADD": "Add organisation",
"EDIT": "Edit organisation",
"NEW": "New organisation",
"REMOVE": "Remove organisation",
"REMOVE_MSG": "Remove the organisation {{ name }}? This fails while any domain or estate still belongs to it.",
"SAVING": "Saving organisation...",
"SAVE_SUCCESS": "Organisation saved",
"SAVE_ERROR": "Failed to save organisation. Error: {{ error }}",
"REMOVE_SUCCESS": "Organisation removed",
"REMOVE_ERROR": "Failed to remove organisation. Error: {{ error }}",
"NAME_REQUIRED": "Organisation name is required",
"FIELD_PARTNER": "Partner",
"SELF_MANAGED": "Self managed (no partner)",
"FIELD_PAYER": "Invoiced to",
"PAYER_PARTNER": "Partner",
"PAYER_ORGANISATION": "Organisation",
"FIELD_PARTNER_STAFF": "Partner staff organisation",
"PARTNER_STAFF_HINT": "Admins of this organisation reach every organisation under the partner",
"FIELD_DOMAINS": "Domains",
"CLAIM": "Claim unowned zones",
"CLAIM_TITLE": "Claim unowned zones for {{ name }}",
"CLAIM_DESC": "Root zones that no organisation owns. The zones chosen, their children, and the systems and modules inside them become this organisation's.",
"CLAIM_EMPTY": "Every root zone already has an owner",
"CLAIM_SUCCESS": "Claimed {{ zones }} zones, {{ systems }} systems and {{ modules }} modules",
"CLAIM_ERROR": "Failed to claim zones. Error: {{ error }}",
"CLAIM_ACTION": "Claim",
"PARTNER_ADD": "Add partner",
"PARTNER_EDIT": "Edit partner",
"PARTNER_NEW": "New partner",
"PARTNER_REMOVE": "Remove partner",
"PARTNER_REMOVE_MSG": "Remove the partner {{ name }}? This fails while any organisation still belongs to it.",
"PARTNER_SAVING": "Saving partner...",
"PARTNER_SAVE_SUCCESS": "Partner saved",
"PARTNER_SAVE_ERROR": "Failed to save partner. Error: {{ error }}",
"PARTNER_REMOVE_SUCCESS": "Partner removed",
"PARTNER_REMOVE_ERROR": "Failed to remove partner. Error: {{ error }}",
"PARTNER_NAME_REQUIRED": "Partner name is required",
"MANAGEMENT": "Management partner",
"FIELD_MANAGEMENT": "Management",
"EMPTY": "No organisations in reach",
"PARTNERS_EMPTY": "No partners in reach",
"ENFORCING": "Enforcing",
"LOG_ONLY": "Log only",
"REACH": "Your reach",
"REACH_CLUSTER": "Cluster: every organisation",
"REACH_PARTNER": "Partner: every organisation under {{ name }}",
"REACH_ORGANISATION": "Organisation: {{ name }}"
}
}
67 changes: 65 additions & 2 deletions public/assets/locale/en-GB.json
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,11 @@
"DATE_FROM_IN_MONTHS": "In {{ months }} month(s)",
"DATE_FROM_MONTHS_AGO": "{{ months }} month(s) ago",
"DATE_FROM_IN_YEAS": "In {{ years }} year(s)",
"DATE_FROM_YEARS_AGO": "{{ years }} year(s) ago"
"DATE_FROM_YEARS_AGO": "{{ years }} year(s) ago",
"ORGANISATION": "Organisation",
"ORGANISATIONS": "Organisations",
"PARTNER": "Partner",
"PARTNERS": "Partners"
},
"SYSTEMS": {
"SINGULAR": "System",
Expand Down Expand Up @@ -979,7 +983,8 @@
"UPLOADS_LIB_REMOVE_LOADING": "Removing upload...",
"UPLOADS_LIB_FIELD_TYPE": "File Type",
"UPLOADS_LIB_FIELD_SIZE": "Size",
"UPLOADS_LIB_LIST_EMPTY": "No uploads for the selected domain"
"UPLOADS_LIB_LIST_EMPTY": "No uploads for the selected domain",
"TAB_ORGANISATIONS": "Organisations"
},
"CASCADE": {
"RESOLVING": "Working out what would be removed...",
Expand Down Expand Up @@ -1030,5 +1035,63 @@
"ALL_GROUPS": "All groups",
"SEARCH_GROUPS": "Search groups",
"NO_MATCHING_GROUPS": "No matching groups"
},
"ORGANISATIONS": {
"SINGULAR": "Organisation",
"PLURAL": "Organisations",
"SWITCH": "Switch organisation",
"SEARCH": "Search organisations",
"ALL": "All organisations",
"NO_MATCHING": "No matching organisations",
"UNOWNED": "No organisation (cluster only)",
"HEADER": "Organisations",
"PARTNERS_HEADER": "Partners",
"ADD": "Add organisation",
"EDIT": "Edit organisation",
"NEW": "New organisation",
"REMOVE": "Remove organisation",
"REMOVE_MSG": "Remove the organisation {{ name }}? This fails while any domain or estate still belongs to it.",
"SAVING": "Saving organisation...",
"SAVE_SUCCESS": "Organisation saved",
"SAVE_ERROR": "Failed to save organisation. Error: {{ error }}",
"REMOVE_SUCCESS": "Organisation removed",
"REMOVE_ERROR": "Failed to remove organisation. Error: {{ error }}",
"NAME_REQUIRED": "Organisation name is required",
"FIELD_PARTNER": "Partner",
"SELF_MANAGED": "Self managed (no partner)",
"FIELD_PAYER": "Invoiced to",
"PAYER_PARTNER": "Partner",
"PAYER_ORGANISATION": "Organisation",
"FIELD_PARTNER_STAFF": "Partner staff organisation",
"PARTNER_STAFF_HINT": "Admins of this organisation reach every organisation under the partner",
"FIELD_DOMAINS": "Domains",
"CLAIM": "Claim unowned zones",
"CLAIM_TITLE": "Claim unowned zones for {{ name }}",
"CLAIM_DESC": "Root zones that no organisation owns. The zones chosen, their children, and the systems and modules inside them become this organisation's.",
"CLAIM_EMPTY": "Every root zone already has an owner",
"CLAIM_SUCCESS": "Claimed {{ zones }} zones, {{ systems }} systems and {{ modules }} modules",
"CLAIM_ERROR": "Failed to claim zones. Error: {{ error }}",
"CLAIM_ACTION": "Claim",
"PARTNER_ADD": "Add partner",
"PARTNER_EDIT": "Edit partner",
"PARTNER_NEW": "New partner",
"PARTNER_REMOVE": "Remove partner",
"PARTNER_REMOVE_MSG": "Remove the partner {{ name }}? This fails while any organisation still belongs to it.",
"PARTNER_SAVING": "Saving partner...",
"PARTNER_SAVE_SUCCESS": "Partner saved",
"PARTNER_SAVE_ERROR": "Failed to save partner. Error: {{ error }}",
"PARTNER_REMOVE_SUCCESS": "Partner removed",
"PARTNER_REMOVE_ERROR": "Failed to remove partner. Error: {{ error }}",
"PARTNER_NAME_REQUIRED": "Partner name is required",
"MANAGEMENT": "Management partner",
"FIELD_MANAGEMENT": "Management",
"EMPTY": "No organisations in reach",
"PARTNERS_EMPTY": "No partners in reach",
"ENFORCING": "Enforcing",
"LOG_ONLY": "Log only",
"REACH": "Your reach",
"REACH_CLUSTER": "Cluster: every organisation",
"REACH_PARTNER": "Partner: every organisation under {{ name }}",
"REACH_ORGANISATION": "Organisation: {{ name }}"
}
}
67 changes: 65 additions & 2 deletions public/assets/locale/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,11 @@
"DATE_FROM_IN_MONTHS": "In {{ months }} month(s)",
"DATE_FROM_MONTHS_AGO": "{{ months }} month(s) ago",
"DATE_FROM_IN_YEAS": "In {{ years }} year(s)",
"DATE_FROM_YEARS_AGO": "{{ years }} year(s) ago"
"DATE_FROM_YEARS_AGO": "{{ years }} year(s) ago",
"ORGANISATION": "Organisation",
"ORGANISATIONS": "Organisations",
"PARTNER": "Partner",
"PARTNERS": "Partners"
},
"SYSTEMS": {
"SINGULAR": "System",
Expand Down Expand Up @@ -976,7 +980,8 @@
"UPLOADS_LIB_REMOVE_LOADING": "Removing upload...",
"UPLOADS_LIB_FIELD_TYPE": "File Type",
"UPLOADS_LIB_FIELD_SIZE": "Size",
"UPLOADS_LIB_LIST_EMPTY": "No uploads for the selected domain"
"UPLOADS_LIB_LIST_EMPTY": "No uploads for the selected domain",
"TAB_ORGANISATIONS": "Organisations"
},
"CASCADE": {
"RESOLVING": "Working out what would be removed...",
Expand Down Expand Up @@ -1027,5 +1032,63 @@
"ALL_GROUPS": "All groups",
"SEARCH_GROUPS": "Search groups",
"NO_MATCHING_GROUPS": "No matching groups"
},
"ORGANISATIONS": {
"SINGULAR": "Organisation",
"PLURAL": "Organisations",
"SWITCH": "Switch organisation",
"SEARCH": "Search organisations",
"ALL": "All organisations",
"NO_MATCHING": "No matching organisations",
"UNOWNED": "No organisation (cluster only)",
"HEADER": "Organisations",
"PARTNERS_HEADER": "Partners",
"ADD": "Add organisation",
"EDIT": "Edit organisation",
"NEW": "New organisation",
"REMOVE": "Remove organisation",
"REMOVE_MSG": "Remove the organisation {{ name }}? This fails while any domain or estate still belongs to it.",
"SAVING": "Saving organisation...",
"SAVE_SUCCESS": "Organisation saved",
"SAVE_ERROR": "Failed to save organisation. Error: {{ error }}",
"REMOVE_SUCCESS": "Organisation removed",
"REMOVE_ERROR": "Failed to remove organisation. Error: {{ error }}",
"NAME_REQUIRED": "Organisation name is required",
"FIELD_PARTNER": "Partner",
"SELF_MANAGED": "Self managed (no partner)",
"FIELD_PAYER": "Invoiced to",
"PAYER_PARTNER": "Partner",
"PAYER_ORGANISATION": "Organisation",
"FIELD_PARTNER_STAFF": "Partner staff organisation",
"PARTNER_STAFF_HINT": "Admins of this organisation reach every organisation under the partner",
"FIELD_DOMAINS": "Domains",
"CLAIM": "Claim unowned zones",
"CLAIM_TITLE": "Claim unowned zones for {{ name }}",
"CLAIM_DESC": "Root zones that no organisation owns. The zones chosen, their children, and the systems and modules inside them become this organisation's.",
"CLAIM_EMPTY": "Every root zone already has an owner",
"CLAIM_SUCCESS": "Claimed {{ zones }} zones, {{ systems }} systems and {{ modules }} modules",
"CLAIM_ERROR": "Failed to claim zones. Error: {{ error }}",
"CLAIM_ACTION": "Claim",
"PARTNER_ADD": "Add partner",
"PARTNER_EDIT": "Edit partner",
"PARTNER_NEW": "New partner",
"PARTNER_REMOVE": "Remove partner",
"PARTNER_REMOVE_MSG": "Remove the partner {{ name }}? This fails while any organisation still belongs to it.",
"PARTNER_SAVING": "Saving partner...",
"PARTNER_SAVE_SUCCESS": "Partner saved",
"PARTNER_SAVE_ERROR": "Failed to save partner. Error: {{ error }}",
"PARTNER_REMOVE_SUCCESS": "Partner removed",
"PARTNER_REMOVE_ERROR": "Failed to remove partner. Error: {{ error }}",
"PARTNER_NAME_REQUIRED": "Partner name is required",
"MANAGEMENT": "Management partner",
"FIELD_MANAGEMENT": "Management",
"EMPTY": "No organisations in reach",
"PARTNERS_EMPTY": "No partners in reach",
"ENFORCING": "Enforcing",
"LOG_ONLY": "Log only",
"REACH": "Your reach",
"REACH_CLUSTER": "Cluster: every organisation",
"REACH_PARTNER": "Partner: every organisation under {{ name }}",
"REACH_ORGANISATION": "Organisation: {{ name }}"
}
}
20 changes: 19 additions & 1 deletion src/app/admin/admin.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ import { AsyncHandler } from '../common/async-handler.class';
import { PlaceDebugService } from '../common/debug.service';
import { ActiveItemService } from '../common/item.service';
import { i18n } from '../common/locale.service';
import {
canAccessClusterSection,
isClusterReach,
isPartnerReach,
} from '../common/organisation-access';
import { SettingsService } from '../common/settings.service';
import { DebugOutputComponent } from '../ui/debug-output.component';
import { IconComponent } from '../ui/icon.component';
Expand Down Expand Up @@ -104,6 +109,11 @@ export class PlaceComponent extends AsyncHandler implements OnInit {
public updateTabList() {
this.tab_list.set(
[
{
id: 'organisations',
name: i18n('ADMIN.TAB_ORGANISATIONS'),
icon: { value: 'corporate_fare' },
},
{
id: 'about',
name: i18n('ADMIN.TAB_ABOUT'),
Expand Down Expand Up @@ -184,7 +194,15 @@ export class PlaceComponent extends AsyncHandler implements OnInit {
name: i18n('ADMIN.TAB_BUILD_JOBS'),
icon: { value: 'laps' },
},
].concat(this.extensions),
]
.filter(
(tab) =>
canAccessClusterSection(tab.id) &&
(tab.id !== 'organisations' ||
isClusterReach() ||
isPartnerReach()),
)
.concat(this.extensions),
);
}

Expand Down
7 changes: 7 additions & 0 deletions src/app/admin/admin.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ export const ROUTES: Routes = [
(m) => m.PlaceDetailsComponent,
),
},
{
path: 'organisations',
loadComponent: () =>
import('./organisations.component').then(
(m) => m.AdminOrganisationsComponent,
),
},
{
path: 'database',
loadComponent: () =>
Expand Down
Loading
Loading