@webiny/tenant-manager 0.0.0-unstable.7be00a75a9 → 0.0.0-unstable.9f53ea597d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/admin/DisableTenant/DisableTenantRepository.d.ts +3 -1
- package/admin/DisableTenant/DisableTenantRepository.js +17 -2
- package/admin/DisableTenant/DisableTenantRepository.js.map +1 -1
- package/admin/DisableTenant/useDisableTenant.js +0 -9
- package/admin/DisableTenant/useDisableTenant.js.map +1 -1
- package/admin/EnableTenant/EnableTenantRepository.d.ts +3 -1
- package/admin/EnableTenant/EnableTenantRepository.js +17 -2
- package/admin/EnableTenant/EnableTenantRepository.js.map +1 -1
- package/admin/Extension.js +3 -0
- package/admin/Extension.js.map +1 -1
- package/admin/InstallTenant/InstallTenantGateway.d.ts +11 -0
- package/admin/InstallTenant/InstallTenantGateway.js +42 -0
- package/admin/InstallTenant/InstallTenantGateway.js.map +1 -0
- package/admin/InstallTenant/InstallTenantRepository.d.ts +12 -0
- package/admin/InstallTenant/InstallTenantRepository.js +34 -0
- package/admin/InstallTenant/InstallTenantRepository.js.map +1 -0
- package/admin/InstallTenant/InstallTenantUseCase.d.ts +10 -0
- package/admin/InstallTenant/InstallTenantUseCase.js +18 -0
- package/admin/InstallTenant/InstallTenantUseCase.js.map +1 -0
- package/admin/InstallTenant/abstractions.d.ts +21 -0
- package/admin/InstallTenant/abstractions.js +7 -0
- package/admin/InstallTenant/abstractions.js.map +1 -0
- package/admin/InstallTenant/feature.d.ts +3 -0
- package/admin/InstallTenant/feature.js +21 -0
- package/admin/InstallTenant/feature.js.map +1 -0
- package/admin/InstallTenant/index.d.ts +2 -0
- package/admin/InstallTenant/index.js +2 -0
- package/admin/InstallTenant/useInstallTenant.d.ts +4 -0
- package/admin/InstallTenant/useInstallTenant.js +24 -0
- package/admin/InstallTenant/useInstallTenant.js.map +1 -0
- package/admin/TenantEntryList/EnableTenant/useEnableTenant.js +0 -9
- package/admin/TenantEntryList/EnableTenant/useEnableTenant.js.map +1 -1
- package/admin/TenantEntryList/FolderNameCell.d.ts +1 -1
- package/admin/TenantEntryList/FolderNameCell.js +3 -3
- package/admin/TenantEntryList/FolderNameCell.js.map +1 -1
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js +15 -26
- package/admin/TenantEntryList/InstallTenantButton/useInstallTenant.js.map +1 -1
- package/admin/TenantEntryList/ManageTenant.js +0 -1
- package/admin/TenantEntryList/ManageTenant.js.map +1 -1
- package/admin/TenantEntryList/TenantNameCell.js +11 -4
- package/admin/TenantEntryList/TenantNameCell.js.map +1 -1
- package/admin/TenantEntryList.js +1 -1
- package/admin/TenantEntryList.js.map +1 -1
- package/api/features/AddCmsPermissions/AddCmsPermissions.d.ts +1 -1
- package/api/features/CreateAndInstallTenant/CreateAndInstallTenantUseCase.js +6 -6
- package/package.json +16 -18
- package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.d.ts +0 -16
- package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.js +0 -18
- package/admin/TenantEntryList/InstallTenantButton/installTenant.gql.js.map +0 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { DisableTenantRepository as RepositoryAbstraction, DisableTenantGateway } from "./abstractions.js";
|
|
2
|
+
import { ContentEntriesCacheProvider } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
2
3
|
declare class DisableTenantRepositoryImpl implements RepositoryAbstraction.Interface {
|
|
3
4
|
private gateway;
|
|
4
|
-
|
|
5
|
+
private cacheProvider;
|
|
6
|
+
constructor(gateway: DisableTenantGateway.Interface, cacheProvider: ContentEntriesCacheProvider.Interface);
|
|
5
7
|
execute(tenantId: string): Promise<void>;
|
|
6
8
|
}
|
|
7
9
|
export declare const DisableTenantRepository: typeof DisableTenantRepositoryImpl & {
|
|
@@ -1,16 +1,31 @@
|
|
|
1
1
|
import { DisableTenantGateway, DisableTenantRepository } from "./abstractions.js";
|
|
2
|
+
import { ContentEntriesCacheProvider } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
3
|
+
import { TENANT_MODEL_ID } from "../../shared/constants.js";
|
|
2
4
|
class DisableTenantRepositoryImpl {
|
|
3
|
-
constructor(gateway){
|
|
5
|
+
constructor(gateway, cacheProvider){
|
|
4
6
|
this.gateway = gateway;
|
|
7
|
+
this.cacheProvider = cacheProvider;
|
|
5
8
|
}
|
|
6
9
|
async execute(tenantId) {
|
|
7
10
|
await this.gateway.disableTenant(tenantId);
|
|
11
|
+
const cache = this.cacheProvider.get(TENANT_MODEL_ID);
|
|
12
|
+
cache.updateItems((item)=>{
|
|
13
|
+
if (item.entryId === tenantId) return {
|
|
14
|
+
...item,
|
|
15
|
+
values: {
|
|
16
|
+
...item.values,
|
|
17
|
+
status: "disabled"
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
return item;
|
|
21
|
+
});
|
|
8
22
|
}
|
|
9
23
|
}
|
|
10
24
|
const DisableTenantRepository_DisableTenantRepository = DisableTenantRepository.createImplementation({
|
|
11
25
|
implementation: DisableTenantRepositoryImpl,
|
|
12
26
|
dependencies: [
|
|
13
|
-
DisableTenantGateway
|
|
27
|
+
DisableTenantGateway,
|
|
28
|
+
ContentEntriesCacheProvider
|
|
14
29
|
]
|
|
15
30
|
});
|
|
16
31
|
export { DisableTenantRepository_DisableTenantRepository as DisableTenantRepository };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/DisableTenant/DisableTenantRepository.js","sources":["../../../src/admin/DisableTenant/DisableTenantRepository.ts"],"sourcesContent":["import {\n DisableTenantRepository as RepositoryAbstraction,\n DisableTenantGateway\n} from \"./abstractions.js\";\n\nclass DisableTenantRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(private gateway: DisableTenantGateway.Interface) {}\n\n async execute(tenantId: string): Promise<void> {\n await this.gateway.disableTenant(tenantId);\n }\n}\n\nexport const DisableTenantRepository = RepositoryAbstraction.createImplementation({\n implementation: DisableTenantRepositoryImpl,\n dependencies: [DisableTenantGateway]\n});\n"],"names":["DisableTenantRepositoryImpl","gateway","tenantId","DisableTenantRepository","RepositoryAbstraction","DisableTenantGateway"],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin/DisableTenant/DisableTenantRepository.js","sources":["../../../src/admin/DisableTenant/DisableTenantRepository.ts"],"sourcesContent":["import {\n DisableTenantRepository as RepositoryAbstraction,\n DisableTenantGateway\n} from \"./abstractions.js\";\nimport { ContentEntriesCacheProvider } from \"@webiny/app-headless-cms/features/contentEntry/abstractions.js\";\nimport { TENANT_MODEL_ID } from \"~/shared/constants.js\";\n\nclass DisableTenantRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private gateway: DisableTenantGateway.Interface,\n private cacheProvider: ContentEntriesCacheProvider.Interface\n ) {}\n\n async execute(tenantId: string): Promise<void> {\n await this.gateway.disableTenant(tenantId);\n\n const cache = this.cacheProvider.get(TENANT_MODEL_ID);\n cache.updateItems(item => {\n if (item.entryId === tenantId) {\n return { ...item, values: { ...item.values, status: \"disabled\" } };\n }\n return item;\n });\n }\n}\n\nexport const DisableTenantRepository = RepositoryAbstraction.createImplementation({\n implementation: DisableTenantRepositoryImpl,\n dependencies: [DisableTenantGateway, ContentEntriesCacheProvider]\n});\n"],"names":["DisableTenantRepositoryImpl","gateway","cacheProvider","tenantId","cache","TENANT_MODEL_ID","item","DisableTenantRepository","RepositoryAbstraction","DisableTenantGateway","ContentEntriesCacheProvider"],"mappings":";;;AAOA,MAAMA;IACF,YACYC,OAAuC,EACvCC,aAAoD,CAC9D;aAFUD,OAAO,GAAPA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,QAAQC,QAAgB,EAAiB;QAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAACA;QAEjC,MAAMC,QAAQ,IAAI,CAAC,aAAa,CAAC,GAAG,CAACC;QACrCD,MAAM,WAAW,CAACE,CAAAA;YACd,IAAIA,KAAK,OAAO,KAAKH,UACjB,OAAO;gBAAE,GAAGG,IAAI;gBAAE,QAAQ;oBAAE,GAAGA,KAAK,MAAM;oBAAE,QAAQ;gBAAW;YAAE;YAErE,OAAOA;QACX;IACJ;AACJ;AAEO,MAAMC,kDAA0BC,wBAAAA,oBAA0C,CAAC;IAC9E,gBAAgBR;IAChB,cAAc;QAACS;QAAsBC;KAA4B;AACrE"}
|
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
import { useCallback } from "react";
|
|
2
2
|
import { useFeature } from "@webiny/app-admin";
|
|
3
3
|
import { DisableTenantFeature } from "./feature.js";
|
|
4
|
-
import { useRecords } from "@webiny/app-aco";
|
|
5
4
|
const useDisableTenant = (tenant)=>{
|
|
6
5
|
const { useCase } = useFeature(DisableTenantFeature);
|
|
7
|
-
const { updateRecordInCache } = useRecords();
|
|
8
6
|
const disableTenant = useCallback(async ()=>{
|
|
9
7
|
await useCase.execute(tenant.entryId);
|
|
10
|
-
updateRecordInCache({
|
|
11
|
-
...tenant,
|
|
12
|
-
values: {
|
|
13
|
-
...tenant.values,
|
|
14
|
-
status: "disabled"
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
8
|
}, [
|
|
18
9
|
useCase,
|
|
19
10
|
tenant
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/DisableTenant/useDisableTenant.js","sources":["../../../src/admin/DisableTenant/useDisableTenant.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useFeature } from \"@webiny/app-admin\";\nimport { DisableTenantFeature } from \"./feature.js\";\nimport
|
|
1
|
+
{"version":3,"file":"admin/DisableTenant/useDisableTenant.js","sources":["../../../src/admin/DisableTenant/useDisableTenant.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useFeature } from \"@webiny/app-admin\";\nimport { DisableTenantFeature } from \"./feature.js\";\nimport type { TenantEntry } from \"~/admin/types.js\";\n\nexport const useDisableTenant = (tenant: TenantEntry) => {\n const { useCase } = useFeature(DisableTenantFeature);\n\n const disableTenant = useCallback(async () => {\n await useCase.execute(tenant.entryId);\n }, [useCase, tenant]);\n\n return { disableTenant };\n};\n"],"names":["useDisableTenant","tenant","useCase","useFeature","DisableTenantFeature","disableTenant","useCallback"],"mappings":";;;AAKO,MAAMA,mBAAmB,CAACC;IAC7B,MAAM,EAAEC,OAAO,EAAE,GAAGC,WAAWC;IAE/B,MAAMC,gBAAgBC,YAAY;QAC9B,MAAMJ,QAAQ,OAAO,CAACD,OAAO,OAAO;IACxC,GAAG;QAACC;QAASD;KAAO;IAEpB,OAAO;QAAEI;IAAc;AAC3B"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { EnableTenantRepository as RepositoryAbstraction, EnableTenantGateway } from "./abstractions.js";
|
|
2
|
+
import { ContentEntriesCacheProvider } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
2
3
|
declare class EnableTenantRepositoryImpl implements RepositoryAbstraction.Interface {
|
|
3
4
|
private gateway;
|
|
4
|
-
|
|
5
|
+
private cacheProvider;
|
|
6
|
+
constructor(gateway: EnableTenantGateway.Interface, cacheProvider: ContentEntriesCacheProvider.Interface);
|
|
5
7
|
execute(tenantId: string): Promise<void>;
|
|
6
8
|
}
|
|
7
9
|
export declare const EnableTenantRepository: typeof EnableTenantRepositoryImpl & {
|
|
@@ -1,16 +1,31 @@
|
|
|
1
1
|
import { EnableTenantGateway, EnableTenantRepository } from "./abstractions.js";
|
|
2
|
+
import { ContentEntriesCacheProvider } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
3
|
+
import { TENANT_MODEL_ID } from "../../shared/constants.js";
|
|
2
4
|
class EnableTenantRepositoryImpl {
|
|
3
|
-
constructor(gateway){
|
|
5
|
+
constructor(gateway, cacheProvider){
|
|
4
6
|
this.gateway = gateway;
|
|
7
|
+
this.cacheProvider = cacheProvider;
|
|
5
8
|
}
|
|
6
9
|
async execute(tenantId) {
|
|
7
10
|
await this.gateway.enableTenant(tenantId);
|
|
11
|
+
const cache = this.cacheProvider.get(TENANT_MODEL_ID);
|
|
12
|
+
cache.updateItems((item)=>{
|
|
13
|
+
if (item.entryId === tenantId) return {
|
|
14
|
+
...item,
|
|
15
|
+
values: {
|
|
16
|
+
...item.values,
|
|
17
|
+
status: "enabled"
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
return item;
|
|
21
|
+
});
|
|
8
22
|
}
|
|
9
23
|
}
|
|
10
24
|
const EnableTenantRepository_EnableTenantRepository = EnableTenantRepository.createImplementation({
|
|
11
25
|
implementation: EnableTenantRepositoryImpl,
|
|
12
26
|
dependencies: [
|
|
13
|
-
EnableTenantGateway
|
|
27
|
+
EnableTenantGateway,
|
|
28
|
+
ContentEntriesCacheProvider
|
|
14
29
|
]
|
|
15
30
|
});
|
|
16
31
|
export { EnableTenantRepository_EnableTenantRepository as EnableTenantRepository };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/EnableTenant/EnableTenantRepository.js","sources":["../../../src/admin/EnableTenant/EnableTenantRepository.ts"],"sourcesContent":["import {\n EnableTenantRepository as RepositoryAbstraction,\n EnableTenantGateway\n} from \"./abstractions.js\";\n\nclass EnableTenantRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(private gateway: EnableTenantGateway.Interface) {}\n\n async execute(tenantId: string): Promise<void> {\n await this.gateway.enableTenant(tenantId);\n }\n}\n\nexport const EnableTenantRepository = RepositoryAbstraction.createImplementation({\n implementation: EnableTenantRepositoryImpl,\n dependencies: [EnableTenantGateway]\n});\n"],"names":["EnableTenantRepositoryImpl","gateway","tenantId","EnableTenantRepository","RepositoryAbstraction","EnableTenantGateway"],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin/EnableTenant/EnableTenantRepository.js","sources":["../../../src/admin/EnableTenant/EnableTenantRepository.ts"],"sourcesContent":["import {\n EnableTenantRepository as RepositoryAbstraction,\n EnableTenantGateway\n} from \"./abstractions.js\";\nimport { ContentEntriesCacheProvider } from \"@webiny/app-headless-cms/features/contentEntry/abstractions.js\";\nimport { TENANT_MODEL_ID } from \"~/shared/constants.js\";\n\nclass EnableTenantRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private gateway: EnableTenantGateway.Interface,\n private cacheProvider: ContentEntriesCacheProvider.Interface\n ) {}\n\n async execute(tenantId: string): Promise<void> {\n await this.gateway.enableTenant(tenantId);\n\n const cache = this.cacheProvider.get(TENANT_MODEL_ID);\n cache.updateItems(item => {\n if (item.entryId === tenantId) {\n return { ...item, values: { ...item.values, status: \"enabled\" } };\n }\n return item;\n });\n }\n}\n\nexport const EnableTenantRepository = RepositoryAbstraction.createImplementation({\n implementation: EnableTenantRepositoryImpl,\n dependencies: [EnableTenantGateway, ContentEntriesCacheProvider]\n});\n"],"names":["EnableTenantRepositoryImpl","gateway","cacheProvider","tenantId","cache","TENANT_MODEL_ID","item","EnableTenantRepository","RepositoryAbstraction","EnableTenantGateway","ContentEntriesCacheProvider"],"mappings":";;;AAOA,MAAMA;IACF,YACYC,OAAsC,EACtCC,aAAoD,CAC9D;aAFUD,OAAO,GAAPA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,QAAQC,QAAgB,EAAiB;QAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAACA;QAEhC,MAAMC,QAAQ,IAAI,CAAC,aAAa,CAAC,GAAG,CAACC;QACrCD,MAAM,WAAW,CAACE,CAAAA;YACd,IAAIA,KAAK,OAAO,KAAKH,UACjB,OAAO;gBAAE,GAAGG,IAAI;gBAAE,QAAQ;oBAAE,GAAGA,KAAK,MAAM;oBAAE,QAAQ;gBAAU;YAAE;YAEpE,OAAOA;QACX;IACJ;AACJ;AAEO,MAAMC,gDAAyBC,uBAAAA,oBAA0C,CAAC;IAC7E,gBAAgBR;IAChB,cAAc;QAACS;QAAqBC;KAA4B;AACpE"}
|
package/admin/Extension.js
CHANGED
|
@@ -12,6 +12,7 @@ import { IsRootTenant } from "./IsRootTenant.js";
|
|
|
12
12
|
import { TENANT_MODEL_ID } from "../shared/constants.js";
|
|
13
13
|
import { SecurityPermission } from "./SecurityPermission.js";
|
|
14
14
|
import { TmPermissionsFeature } from "./features/permissions/feature.js";
|
|
15
|
+
import { InstallTenantFeature } from "./InstallTenant/index.js";
|
|
15
16
|
const { Menu: Menu } = AdminConfig;
|
|
16
17
|
const Extension = ()=>{
|
|
17
18
|
const { getLink } = useRouter();
|
|
@@ -26,6 +27,8 @@ const Extension = ()=>{
|
|
|
26
27
|
feature: CurrentTenantFeature
|
|
27
28
|
}), /*#__PURE__*/ react.createElement(RegisterFeature, {
|
|
28
29
|
feature: TmPermissionsFeature
|
|
30
|
+
}), /*#__PURE__*/ react.createElement(RegisterFeature, {
|
|
31
|
+
feature: InstallTenantFeature
|
|
29
32
|
}), /*#__PURE__*/ react.createElement(CurrentTenantProvider, null), /*#__PURE__*/ react.createElement(TenantSelector, null), /*#__PURE__*/ react.createElement(TenantEntryList, null), /*#__PURE__*/ react.createElement(SecurityPermission, null), /*#__PURE__*/ react.createElement(AdminConfig, null, /*#__PURE__*/ react.createElement(IsRootTenant, null, /*#__PURE__*/ react.createElement(RegisterFeature, {
|
|
30
33
|
feature: DisableTenantFeature
|
|
31
34
|
}), /*#__PURE__*/ react.createElement(RegisterFeature, {
|
package/admin/Extension.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/Extension.js","sources":["../../src/admin/Extension.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig, HasPermission, RegisterFeature } from \"@webiny/app-admin\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport { Routes } from \"@webiny/app-headless-cms\";\nimport { ReactComponent as TenantIcon } from \"@webiny/icons/business.svg\";\n\nimport { TenantEntryList } from \"./TenantEntryList.js\";\nimport { CurrentTenantProvider } from \"./CurrentTenantProvider.js\";\nimport { CurrentTenantFeature } from \"./CurrentTenant/feature.js\";\nimport { DisableTenantFeature } from \"./DisableTenant/index.js\";\nimport { EnableTenantFeature } from \"./EnableTenant/index.js\";\nimport { TenantSelector } from \"./TenantSelector.js\";\nimport { IsRootTenant } from \"./IsRootTenant.js\";\nimport { TENANT_MODEL_ID } from \"~/shared/constants.js\";\nimport { SecurityPermission } from \"./SecurityPermission.js\";\nimport { TmPermissionsFeature } from \"./features/permissions/feature.js\";\n\nconst { Menu } = AdminConfig;\n\nexport const Extension = () => {\n const { getLink } = useRouter();\n\n const link = getLink(Routes.ContentEntries.List, { modelId: TENANT_MODEL_ID });\n\n const icon = <Menu.Link.Icon element={<TenantIcon />} label={\"Tenant\"} />;\n\n return (\n <>\n <RegisterFeature feature={CurrentTenantFeature} />\n <RegisterFeature feature={TmPermissionsFeature} />\n <CurrentTenantProvider />\n <TenantSelector />\n <TenantEntryList />\n <SecurityPermission />\n <AdminConfig>\n <IsRootTenant>\n <RegisterFeature feature={DisableTenantFeature} />\n <RegisterFeature feature={EnableTenantFeature} />\n <HasPermission name={\"tm.tenant\"}>\n <Menu\n name=\"tenantManager\"\n element={<Menu.Link text=\"Tenant Manager\" icon={icon} to={link} />}\n />\n </HasPermission>\n </IsRootTenant>\n </AdminConfig>\n </>\n );\n};\n"],"names":["Menu","AdminConfig","Extension","getLink","useRouter","link","Routes","TENANT_MODEL_ID","icon","TenantIcon","RegisterFeature","CurrentTenantFeature","TmPermissionsFeature","CurrentTenantProvider","TenantSelector","TenantEntryList","SecurityPermission","IsRootTenant","DisableTenantFeature","EnableTenantFeature","HasPermission"],"mappings":"
|
|
1
|
+
{"version":3,"file":"admin/Extension.js","sources":["../../src/admin/Extension.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig, HasPermission, RegisterFeature } from \"@webiny/app-admin\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport { Routes } from \"@webiny/app-headless-cms\";\nimport { ReactComponent as TenantIcon } from \"@webiny/icons/business.svg\";\n\nimport { TenantEntryList } from \"./TenantEntryList.js\";\nimport { CurrentTenantProvider } from \"./CurrentTenantProvider.js\";\nimport { CurrentTenantFeature } from \"./CurrentTenant/feature.js\";\nimport { DisableTenantFeature } from \"./DisableTenant/index.js\";\nimport { EnableTenantFeature } from \"./EnableTenant/index.js\";\nimport { TenantSelector } from \"./TenantSelector.js\";\nimport { IsRootTenant } from \"./IsRootTenant.js\";\nimport { TENANT_MODEL_ID } from \"~/shared/constants.js\";\nimport { SecurityPermission } from \"./SecurityPermission.js\";\nimport { TmPermissionsFeature } from \"./features/permissions/feature.js\";\nimport { InstallTenantFeature } from \"./InstallTenant/index.js\";\n\nconst { Menu } = AdminConfig;\n\nexport const Extension = () => {\n const { getLink } = useRouter();\n\n const link = getLink(Routes.ContentEntries.List, { modelId: TENANT_MODEL_ID });\n\n const icon = <Menu.Link.Icon element={<TenantIcon />} label={\"Tenant\"} />;\n\n return (\n <>\n <RegisterFeature feature={CurrentTenantFeature} />\n <RegisterFeature feature={TmPermissionsFeature} />\n <RegisterFeature feature={InstallTenantFeature} />\n <CurrentTenantProvider />\n <TenantSelector />\n <TenantEntryList />\n <SecurityPermission />\n <AdminConfig>\n <IsRootTenant>\n <RegisterFeature feature={DisableTenantFeature} />\n <RegisterFeature feature={EnableTenantFeature} />\n <HasPermission name={\"tm.tenant\"}>\n <Menu\n name=\"tenantManager\"\n element={<Menu.Link text=\"Tenant Manager\" icon={icon} to={link} />}\n />\n </HasPermission>\n </IsRootTenant>\n </AdminConfig>\n </>\n );\n};\n"],"names":["Menu","AdminConfig","Extension","getLink","useRouter","link","Routes","TENANT_MODEL_ID","icon","TenantIcon","RegisterFeature","CurrentTenantFeature","TmPermissionsFeature","InstallTenantFeature","CurrentTenantProvider","TenantSelector","TenantEntryList","SecurityPermission","IsRootTenant","DisableTenantFeature","EnableTenantFeature","HasPermission"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,EAAEA,MAAAA,IAAI,EAAE,GAAGC;AAEV,MAAMC,YAAY;IACrB,MAAM,EAAEC,OAAO,EAAE,GAAGC;IAEpB,MAAMC,OAAOF,QAAQG,OAAO,cAAc,CAAC,IAAI,EAAE;QAAE,SAASC;IAAgB;IAE5E,MAAMC,OAAO,WAAPA,GAAO,oBAACR,KAAK,IAAI,CAAC,IAAI;QAAC,uBAAS,oBAACS,gBAAUA;QAAK,OAAO;;IAE7D,OAAO,WAAP,GACI,wDACI,oBAACC,iBAAeA;QAAC,SAASC;sBAC1B,oBAACD,iBAAeA;QAAC,SAASE;sBAC1B,oBAACF,iBAAeA;QAAC,SAASG;sBAC1B,oBAACC,uBAAqBA,OAAAA,WAAAA,GACtB,oBAACC,gBAAcA,OAAAA,WAAAA,GACf,oBAACC,iBAAeA,OAAAA,WAAAA,GAChB,oBAACC,oBAAkBA,OAAAA,WAAAA,GACnB,oBAAChB,aAAWA,MAAAA,WAAAA,GACR,oBAACiB,cAAYA,MAAAA,WAAAA,GACT,oBAACR,iBAAeA;QAAC,SAASS;sBAC1B,oBAACT,iBAAeA;QAAC,SAASU;sBAC1B,oBAACC,eAAaA;QAAC,MAAM;qBACjB,oBAACrB,MAAIA;QACD,MAAK;QACL,uBAAS,oBAACA,KAAK,IAAI;YAAC,MAAK;YAAiB,MAAMQ;YAAM,IAAIH;;;AAOtF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MainGraphQLClient } from "@webiny/app/features/mainGraphQLClient/index.js";
|
|
2
|
+
import { InstallTenantGateway as GatewayAbstraction } from "./abstractions.js";
|
|
3
|
+
declare class InstallTenantGraphQLGateway implements GatewayAbstraction.Interface {
|
|
4
|
+
private client;
|
|
5
|
+
constructor(client: MainGraphQLClient.Interface);
|
|
6
|
+
installTenant(tenantId: string): Promise<boolean>;
|
|
7
|
+
}
|
|
8
|
+
export declare const InstallTenantGateway: typeof InstallTenantGraphQLGateway & {
|
|
9
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IInstallTenantGateway>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { MainGraphQLClient } from "@webiny/app/features/mainGraphQLClient/index.js";
|
|
2
|
+
import { InstallTenantGateway } from "./abstractions.js";
|
|
3
|
+
const INSTALL_TENANT = `
|
|
4
|
+
mutation InstallTenant($tenantId: ID!) {
|
|
5
|
+
tenantManager {
|
|
6
|
+
installTenant(tenantId: $tenantId) {
|
|
7
|
+
data
|
|
8
|
+
error {
|
|
9
|
+
code
|
|
10
|
+
message
|
|
11
|
+
data
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
`;
|
|
17
|
+
class InstallTenantGraphQLGateway {
|
|
18
|
+
constructor(client){
|
|
19
|
+
this.client = client;
|
|
20
|
+
}
|
|
21
|
+
async installTenant(tenantId) {
|
|
22
|
+
const response = await this.client.execute({
|
|
23
|
+
query: INSTALL_TENANT,
|
|
24
|
+
variables: {
|
|
25
|
+
tenantId
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
const envelope = response.tenantManager.installTenant;
|
|
29
|
+
if (envelope.error) throw new Error(envelope.error.message);
|
|
30
|
+
if (!envelope.data) throw new Error("Unable to install tenant");
|
|
31
|
+
return envelope.data;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const InstallTenantGateway_InstallTenantGateway = InstallTenantGateway.createImplementation({
|
|
35
|
+
implementation: InstallTenantGraphQLGateway,
|
|
36
|
+
dependencies: [
|
|
37
|
+
MainGraphQLClient
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
export { InstallTenantGateway_InstallTenantGateway as InstallTenantGateway };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=InstallTenantGateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/InstallTenant/InstallTenantGateway.js","sources":["../../../src/admin/InstallTenant/InstallTenantGateway.ts"],"sourcesContent":["import { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient/index.js\";\nimport { InstallTenantGateway as GatewayAbstraction } from \"./abstractions.js\";\n\nconst INSTALL_TENANT = /* GraphQL */ `\n mutation InstallTenant($tenantId: ID!) {\n tenantManager {\n installTenant(tenantId: $tenantId) {\n data\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\ntype InstallTenantResponse = {\n tenantManager: {\n installTenant:\n | {\n data: boolean;\n error: null;\n }\n | {\n data: null;\n error: {\n code: string;\n message: string;\n data: Record<string, any>;\n };\n };\n };\n};\n\nclass InstallTenantGraphQLGateway implements GatewayAbstraction.Interface {\n constructor(private client: MainGraphQLClient.Interface) {}\n\n async installTenant(tenantId: string): Promise<boolean> {\n const response = await this.client.execute<InstallTenantResponse>({\n query: INSTALL_TENANT,\n variables: { tenantId }\n });\n\n const envelope = response.tenantManager.installTenant;\n if (envelope.error) {\n throw new Error(envelope.error.message);\n }\n\n if (!envelope.data) {\n throw new Error(\"Unable to install tenant\");\n }\n\n return envelope.data;\n }\n}\n\nexport const InstallTenantGateway = GatewayAbstraction.createImplementation({\n implementation: InstallTenantGraphQLGateway,\n dependencies: [MainGraphQLClient]\n});\n"],"names":["INSTALL_TENANT","InstallTenantGraphQLGateway","client","tenantId","response","envelope","Error","InstallTenantGateway","GatewayAbstraction","MainGraphQLClient"],"mappings":";;AAGA,MAAMA,iBAA+B,CAAC;;;;;;;;;;;;;AAatC,CAAC;AAoBD,MAAMC;IACF,YAAoBC,MAAmC,CAAE;aAArCA,MAAM,GAANA;IAAsC;IAE1D,MAAM,cAAcC,QAAgB,EAAoB;QACpD,MAAMC,WAAW,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAwB;YAC9D,OAAOJ;YACP,WAAW;gBAAEG;YAAS;QAC1B;QAEA,MAAME,WAAWD,SAAS,aAAa,CAAC,aAAa;QACrD,IAAIC,SAAS,KAAK,EACd,MAAM,IAAIC,MAAMD,SAAS,KAAK,CAAC,OAAO;QAG1C,IAAI,CAACA,SAAS,IAAI,EACd,MAAM,IAAIC,MAAM;QAGpB,OAAOD,SAAS,IAAI;IACxB;AACJ;AAEO,MAAME,4CAAuBC,qBAAAA,oBAAuC,CAAC;IACxE,gBAAgBP;IAChB,cAAc;QAACQ;KAAkB;AACrC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { InstallTenantRepository as RepositoryAbstraction, InstallTenantGateway } from "./abstractions.js";
|
|
2
|
+
import { ContentEntriesCacheProvider } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
3
|
+
declare class InstallTenantRepositoryImpl implements RepositoryAbstraction.Interface {
|
|
4
|
+
private gateway;
|
|
5
|
+
private cacheProvider;
|
|
6
|
+
constructor(gateway: InstallTenantGateway.Interface, cacheProvider: ContentEntriesCacheProvider.Interface);
|
|
7
|
+
execute(tenantId: string): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare const InstallTenantRepository: typeof InstallTenantRepositoryImpl & {
|
|
10
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IInstallTenantRepository>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { InstallTenantGateway, InstallTenantRepository } from "./abstractions.js";
|
|
2
|
+
import { ContentEntriesCacheProvider } from "@webiny/app-headless-cms/features/contentEntry/abstractions.js";
|
|
3
|
+
import { TENANT_MODEL_ID } from "../../shared/constants.js";
|
|
4
|
+
class InstallTenantRepositoryImpl {
|
|
5
|
+
constructor(gateway, cacheProvider){
|
|
6
|
+
this.gateway = gateway;
|
|
7
|
+
this.cacheProvider = cacheProvider;
|
|
8
|
+
}
|
|
9
|
+
async execute(tenantId) {
|
|
10
|
+
await this.gateway.installTenant(tenantId);
|
|
11
|
+
const cache = this.cacheProvider.get(TENANT_MODEL_ID);
|
|
12
|
+
cache.updateItems((item)=>{
|
|
13
|
+
if (item.entryId === tenantId) return {
|
|
14
|
+
...item,
|
|
15
|
+
values: {
|
|
16
|
+
...item.values,
|
|
17
|
+
status: "enabled",
|
|
18
|
+
isInstalled: true
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
return item;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const InstallTenantRepository_InstallTenantRepository = InstallTenantRepository.createImplementation({
|
|
26
|
+
implementation: InstallTenantRepositoryImpl,
|
|
27
|
+
dependencies: [
|
|
28
|
+
InstallTenantGateway,
|
|
29
|
+
ContentEntriesCacheProvider
|
|
30
|
+
]
|
|
31
|
+
});
|
|
32
|
+
export { InstallTenantRepository_InstallTenantRepository as InstallTenantRepository };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=InstallTenantRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/InstallTenant/InstallTenantRepository.js","sources":["../../../src/admin/InstallTenant/InstallTenantRepository.ts"],"sourcesContent":["import {\n InstallTenantRepository as RepositoryAbstraction,\n InstallTenantGateway\n} from \"./abstractions.js\";\nimport { ContentEntriesCacheProvider } from \"@webiny/app-headless-cms/features/contentEntry/abstractions.js\";\nimport { TENANT_MODEL_ID } from \"~/shared/constants.js\";\n\nclass InstallTenantRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private gateway: InstallTenantGateway.Interface,\n private cacheProvider: ContentEntriesCacheProvider.Interface\n ) {}\n\n async execute(tenantId: string): Promise<void> {\n await this.gateway.installTenant(tenantId);\n\n const cache = this.cacheProvider.get(TENANT_MODEL_ID);\n cache.updateItems(item => {\n if (item.entryId === tenantId) {\n return {\n ...item,\n values: { ...item.values, status: \"enabled\", isInstalled: true }\n };\n }\n return item;\n });\n }\n}\n\nexport const InstallTenantRepository = RepositoryAbstraction.createImplementation({\n implementation: InstallTenantRepositoryImpl,\n dependencies: [InstallTenantGateway, ContentEntriesCacheProvider]\n});\n"],"names":["InstallTenantRepositoryImpl","gateway","cacheProvider","tenantId","cache","TENANT_MODEL_ID","item","InstallTenantRepository","RepositoryAbstraction","InstallTenantGateway","ContentEntriesCacheProvider"],"mappings":";;;AAOA,MAAMA;IACF,YACYC,OAAuC,EACvCC,aAAoD,CAC9D;aAFUD,OAAO,GAAPA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,QAAQC,QAAgB,EAAiB;QAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAACA;QAEjC,MAAMC,QAAQ,IAAI,CAAC,aAAa,CAAC,GAAG,CAACC;QACrCD,MAAM,WAAW,CAACE,CAAAA;YACd,IAAIA,KAAK,OAAO,KAAKH,UACjB,OAAO;gBACH,GAAGG,IAAI;gBACP,QAAQ;oBAAE,GAAGA,KAAK,MAAM;oBAAE,QAAQ;oBAAW,aAAa;gBAAK;YACnE;YAEJ,OAAOA;QACX;IACJ;AACJ;AAEO,MAAMC,kDAA0BC,wBAAAA,oBAA0C,CAAC;IAC9E,gBAAgBR;IAChB,cAAc;QAACS;QAAsBC;KAA4B;AACrE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { InstallTenantUseCase as UseCaseAbstraction, InstallTenantRepository } from "./abstractions.js";
|
|
2
|
+
declare class InstallTenantUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
3
|
+
private repository;
|
|
4
|
+
constructor(repository: InstallTenantRepository.Interface);
|
|
5
|
+
execute(tenantId: string): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare const InstallTenantUseCase: typeof InstallTenantUseCaseImpl & {
|
|
8
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IInstallTenantUseCase>;
|
|
9
|
+
};
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { InstallTenantRepository, InstallTenantUseCase } from "./abstractions.js";
|
|
2
|
+
class InstallTenantUseCaseImpl {
|
|
3
|
+
constructor(repository){
|
|
4
|
+
this.repository = repository;
|
|
5
|
+
}
|
|
6
|
+
async execute(tenantId) {
|
|
7
|
+
return this.repository.execute(tenantId);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const InstallTenantUseCase_InstallTenantUseCase = InstallTenantUseCase.createImplementation({
|
|
11
|
+
implementation: InstallTenantUseCaseImpl,
|
|
12
|
+
dependencies: [
|
|
13
|
+
InstallTenantRepository
|
|
14
|
+
]
|
|
15
|
+
});
|
|
16
|
+
export { InstallTenantUseCase_InstallTenantUseCase as InstallTenantUseCase };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=InstallTenantUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/InstallTenant/InstallTenantUseCase.js","sources":["../../../src/admin/InstallTenant/InstallTenantUseCase.ts"],"sourcesContent":["import {\n InstallTenantUseCase as UseCaseAbstraction,\n InstallTenantRepository\n} from \"./abstractions.js\";\n\nclass InstallTenantUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(private repository: InstallTenantRepository.Interface) {}\n\n async execute(tenantId: string): Promise<void> {\n return this.repository.execute(tenantId);\n }\n}\n\nexport const InstallTenantUseCase = UseCaseAbstraction.createImplementation({\n implementation: InstallTenantUseCaseImpl,\n dependencies: [InstallTenantRepository]\n});\n"],"names":["InstallTenantUseCaseImpl","repository","tenantId","InstallTenantUseCase","UseCaseAbstraction","InstallTenantRepository"],"mappings":";AAKA,MAAMA;IACF,YAAoBC,UAA6C,CAAE;aAA/CA,UAAU,GAAVA;IAAgD;IAEpE,MAAM,QAAQC,QAAgB,EAAiB;QAC3C,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAACA;IACnC;AACJ;AAEO,MAAMC,4CAAuBC,qBAAAA,oBAAuC,CAAC;IACxE,gBAAgBJ;IAChB,cAAc;QAACK;KAAwB;AAC3C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface IInstallTenantUseCase {
|
|
2
|
+
execute(tenantId: string): Promise<void>;
|
|
3
|
+
}
|
|
4
|
+
export declare const InstallTenantUseCase: import("@webiny/di").Abstraction<IInstallTenantUseCase>;
|
|
5
|
+
export declare namespace InstallTenantUseCase {
|
|
6
|
+
type Interface = IInstallTenantUseCase;
|
|
7
|
+
}
|
|
8
|
+
export interface IInstallTenantRepository {
|
|
9
|
+
execute(tenantId: string): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare const InstallTenantRepository: import("@webiny/di").Abstraction<IInstallTenantRepository>;
|
|
12
|
+
export declare namespace InstallTenantRepository {
|
|
13
|
+
type Interface = IInstallTenantRepository;
|
|
14
|
+
}
|
|
15
|
+
export interface IInstallTenantGateway {
|
|
16
|
+
installTenant(tenantId: string): Promise<boolean>;
|
|
17
|
+
}
|
|
18
|
+
export declare const InstallTenantGateway: import("@webiny/di").Abstraction<IInstallTenantGateway>;
|
|
19
|
+
export declare namespace InstallTenantGateway {
|
|
20
|
+
type Interface = IInstallTenantGateway;
|
|
21
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createAbstraction } from "@webiny/feature/admin";
|
|
2
|
+
const InstallTenantUseCase = createAbstraction("InstallTenantUseCase");
|
|
3
|
+
const InstallTenantRepository = createAbstraction("InstallTenantRepository");
|
|
4
|
+
const InstallTenantGateway = createAbstraction("InstallTenantGateway");
|
|
5
|
+
export { InstallTenantGateway, InstallTenantRepository, InstallTenantUseCase };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=abstractions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/InstallTenant/abstractions.js","sources":["../../../src/admin/InstallTenant/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\n\nexport interface IInstallTenantUseCase {\n execute(tenantId: string): Promise<void>;\n}\n\nexport const InstallTenantUseCase =\n createAbstraction<IInstallTenantUseCase>(\"InstallTenantUseCase\");\n\nexport namespace InstallTenantUseCase {\n export type Interface = IInstallTenantUseCase;\n}\n\nexport interface IInstallTenantRepository {\n execute(tenantId: string): Promise<void>;\n}\n\nexport const InstallTenantRepository =\n createAbstraction<IInstallTenantRepository>(\"InstallTenantRepository\");\n\nexport namespace InstallTenantRepository {\n export type Interface = IInstallTenantRepository;\n}\n\nexport interface IInstallTenantGateway {\n installTenant(tenantId: string): Promise<boolean>;\n}\n\nexport const InstallTenantGateway =\n createAbstraction<IInstallTenantGateway>(\"InstallTenantGateway\");\n\nexport namespace InstallTenantGateway {\n export type Interface = IInstallTenantGateway;\n}\n"],"names":["InstallTenantUseCase","createAbstraction","InstallTenantRepository","InstallTenantGateway"],"mappings":";AAMO,MAAMA,uBACTC,kBAAyC;AAUtC,MAAMC,0BACTD,kBAA4C;AAUzC,MAAME,uBACTF,kBAAyC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/admin";
|
|
2
|
+
import { InstallTenantUseCase } from "./abstractions.js";
|
|
3
|
+
import { InstallTenantUseCase as external_InstallTenantUseCase_js_InstallTenantUseCase } from "./InstallTenantUseCase.js";
|
|
4
|
+
import { InstallTenantRepository } from "./InstallTenantRepository.js";
|
|
5
|
+
import { InstallTenantGateway } from "./InstallTenantGateway.js";
|
|
6
|
+
const InstallTenantFeature = createFeature({
|
|
7
|
+
name: "InstallTenant",
|
|
8
|
+
register (container) {
|
|
9
|
+
container.register(external_InstallTenantUseCase_js_InstallTenantUseCase);
|
|
10
|
+
container.register(InstallTenantRepository).inSingletonScope();
|
|
11
|
+
container.register(InstallTenantGateway).inSingletonScope();
|
|
12
|
+
},
|
|
13
|
+
resolve (container) {
|
|
14
|
+
return {
|
|
15
|
+
useCase: container.resolve(InstallTenantUseCase)
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
export { InstallTenantFeature };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/InstallTenant/feature.js","sources":["../../../src/admin/InstallTenant/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { InstallTenantUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { InstallTenantUseCase } from \"./InstallTenantUseCase.js\";\nimport { InstallTenantRepository } from \"./InstallTenantRepository.js\";\nimport { InstallTenantGateway } from \"./InstallTenantGateway.js\";\n\nexport const InstallTenantFeature = createFeature({\n name: \"InstallTenant\",\n register(container) {\n container.register(InstallTenantUseCase);\n container.register(InstallTenantRepository).inSingletonScope();\n container.register(InstallTenantGateway).inSingletonScope();\n },\n resolve(container) {\n return {\n useCase: container.resolve(UseCaseAbstraction)\n };\n }\n});\n"],"names":["InstallTenantFeature","createFeature","container","InstallTenantUseCase","InstallTenantRepository","InstallTenantGateway","UseCaseAbstraction"],"mappings":";;;;;AAMO,MAAMA,uBAAuBC,cAAc;IAC9C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE,yBAAyB,gBAAgB;QAC5DF,UAAU,QAAQ,CAACG,sBAAsB,gBAAgB;IAC7D;IACA,SAAQH,SAAS;QACb,OAAO;YACH,SAASA,UAAU,OAAO,CAACI;QAC/B;IACJ;AACJ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { useCallback, useState } from "react";
|
|
2
|
+
import { useFeature } from "@webiny/app-admin";
|
|
3
|
+
import { InstallTenantFeature } from "./feature.js";
|
|
4
|
+
const useInstallTenant = ()=>{
|
|
5
|
+
const { useCase } = useFeature(InstallTenantFeature);
|
|
6
|
+
const [loading, setLoading] = useState(false);
|
|
7
|
+
const installTenant = useCallback(async (tenantId)=>{
|
|
8
|
+
setLoading(true);
|
|
9
|
+
try {
|
|
10
|
+
await useCase.execute(tenantId);
|
|
11
|
+
} finally{
|
|
12
|
+
setLoading(false);
|
|
13
|
+
}
|
|
14
|
+
}, [
|
|
15
|
+
useCase
|
|
16
|
+
]);
|
|
17
|
+
return {
|
|
18
|
+
installTenant,
|
|
19
|
+
loading
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export { useInstallTenant };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=useInstallTenant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/InstallTenant/useInstallTenant.js","sources":["../../../src/admin/InstallTenant/useInstallTenant.ts"],"sourcesContent":["import { useState, useCallback } from \"react\";\nimport { useFeature } from \"@webiny/app-admin\";\nimport { InstallTenantFeature } from \"./feature.js\";\n\nexport const useInstallTenant = () => {\n const { useCase } = useFeature(InstallTenantFeature);\n const [loading, setLoading] = useState(false);\n\n const installTenant = useCallback(\n async (tenantId: string) => {\n setLoading(true);\n\n try {\n await useCase.execute(tenantId);\n } finally {\n setLoading(false);\n }\n },\n [useCase]\n );\n\n return { installTenant, loading };\n};\n"],"names":["useInstallTenant","useCase","useFeature","InstallTenantFeature","loading","setLoading","useState","installTenant","useCallback","tenantId"],"mappings":";;;AAIO,MAAMA,mBAAmB;IAC5B,MAAM,EAAEC,OAAO,EAAE,GAAGC,WAAWC;IAC/B,MAAM,CAACC,SAASC,WAAW,GAAGC,SAAS;IAEvC,MAAMC,gBAAgBC,YAClB,OAAOC;QACHJ,WAAW;QAEX,IAAI;YACA,MAAMJ,QAAQ,OAAO,CAACQ;QAC1B,SAAU;YACNJ,WAAW;QACf;IACJ,GACA;QAACJ;KAAQ;IAGb,OAAO;QAAEM;QAAeH;IAAQ;AACpC"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { useCallback } from "react";
|
|
2
2
|
import { useToast } from "@webiny/admin-ui";
|
|
3
|
-
import { useRecords } from "@webiny/app-aco";
|
|
4
3
|
import { useEnableTenant } from "../../EnableTenant/index.js";
|
|
5
4
|
const useEnableTenant_useEnableTenant = (tenant)=>{
|
|
6
5
|
const toast = useToast();
|
|
7
|
-
const { updateRecordInCache } = useRecords();
|
|
8
6
|
const useCase = useEnableTenant();
|
|
9
7
|
const enableTenant = useCallback(async ()=>{
|
|
10
8
|
try {
|
|
@@ -20,13 +18,6 @@ const useEnableTenant_useEnableTenant = (tenant)=>{
|
|
|
20
18
|
toast.showSuccessToast({
|
|
21
19
|
title: "Tenant was enabled successfully!"
|
|
22
20
|
});
|
|
23
|
-
updateRecordInCache({
|
|
24
|
-
...tenant,
|
|
25
|
-
values: {
|
|
26
|
-
...tenant.values,
|
|
27
|
-
status: "enabled"
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
21
|
}, [
|
|
31
22
|
tenant
|
|
32
23
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/TenantEntryList/EnableTenant/useEnableTenant.js","sources":["../../../../src/admin/TenantEntryList/EnableTenant/useEnableTenant.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useToast } from \"@webiny/admin-ui\";\nimport {
|
|
1
|
+
{"version":3,"file":"admin/TenantEntryList/EnableTenant/useEnableTenant.js","sources":["../../../../src/admin/TenantEntryList/EnableTenant/useEnableTenant.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useToast } from \"@webiny/admin-ui\";\nimport { TenantEntry } from \"../../types.js\";\nimport { useEnableTenant as baseEnableTenant } from \"~/admin/EnableTenant/index.js\";\n\nexport const useEnableTenant = (tenant: TenantEntry) => {\n const toast = useToast();\n const useCase = baseEnableTenant();\n\n const enableTenant = useCallback(async () => {\n try {\n await useCase.enableTenant(tenant.entryId);\n } catch (error) {\n toast.showWarningToast({\n title: \"Could not enable tenant\",\n description: error.message,\n duration: Infinity\n });\n return;\n }\n\n toast.showSuccessToast({ title: \"Tenant was enabled successfully!\" });\n }, [tenant]);\n\n return { enableTenant, loading: useCase.loading };\n};\n"],"names":["useEnableTenant","tenant","toast","useToast","useCase","baseEnableTenant","enableTenant","useCallback","error","Infinity"],"mappings":";;;AAKO,MAAMA,kCAAkB,CAACC;IAC5B,MAAMC,QAAQC;IACd,MAAMC,UAAUC;IAEhB,MAAMC,eAAeC,YAAY;QAC7B,IAAI;YACA,MAAMH,QAAQ,YAAY,CAACH,OAAO,OAAO;QAC7C,EAAE,OAAOO,OAAO;YACZN,MAAM,gBAAgB,CAAC;gBACnB,OAAO;gBACP,aAAaM,MAAM,OAAO;gBAC1B,UAAUC;YACd;YACA;QACJ;QAEAP,MAAM,gBAAgB,CAAC;YAAE,OAAO;QAAmC;IACvE,GAAG;QAACD;KAAO;IAEX,OAAO;QAAEK;QAAc,SAASF,QAAQ,OAAO;IAAC;AACpD"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import react from "react";
|
|
2
|
-
import { useNavigateFolder } from "@webiny/app-aco";
|
|
3
2
|
import { Icon, Text } from "@webiny/admin-ui";
|
|
4
3
|
import { ReactComponent } from "@webiny/icons/folder.svg";
|
|
5
4
|
import { ReactComponent as folder_shared_svg_ReactComponent } from "@webiny/icons/folder_shared.svg";
|
|
5
|
+
import { useContentEntriesPresenter } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
6
6
|
const FolderNameCell = ({ folder })=>{
|
|
7
|
-
const
|
|
7
|
+
const presenter = useContentEntriesPresenter();
|
|
8
8
|
let icon = /*#__PURE__*/ react.createElement(ReactComponent, null);
|
|
9
9
|
if (folder.hasNonInheritedPermissions && folder.canManagePermissions) icon = /*#__PURE__*/ react.createElement(folder_shared_svg_ReactComponent, null);
|
|
10
10
|
return /*#__PURE__*/ react.createElement("div", {
|
|
11
11
|
className: "flex items-center gap-sm truncate cursor-pointer font-semibold hover:underline",
|
|
12
|
-
onClick: ()=>
|
|
12
|
+
onClick: ()=>presenter.folders.selectFolder(folder.id)
|
|
13
13
|
}, /*#__PURE__*/ react.createElement(Icon, {
|
|
14
14
|
size: "sm",
|
|
15
15
|
color: "neutral-strong",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/TenantEntryList/FolderNameCell.js","sources":["../../../src/admin/TenantEntryList/FolderNameCell.tsx"],"sourcesContent":["import React from \"react\";\nimport {
|
|
1
|
+
{"version":3,"file":"admin/TenantEntryList/FolderNameCell.js","sources":["../../../src/admin/TenantEntryList/FolderNameCell.tsx"],"sourcesContent":["import React from \"react\";\nimport type { FolderTableRow } from \"@webiny/app-aco\";\nimport { Icon, Text } from \"@webiny/admin-ui\";\nimport { ReactComponent as Folder } from \"@webiny/icons/folder.svg\";\nimport { ReactComponent as FolderShared } from \"@webiny/icons/folder_shared.svg\";\nimport { useContentEntriesPresenter } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\n\ninterface FolderNameCellProps {\n folder: FolderTableRow[\"data\"];\n}\n\nexport const FolderNameCell = ({ folder }: FolderNameCellProps) => {\n const presenter = useContentEntriesPresenter();\n\n let icon = <Folder />;\n if (folder.hasNonInheritedPermissions && folder.canManagePermissions) {\n icon = <FolderShared />;\n }\n\n return (\n <div\n className={\n \"flex items-center gap-sm truncate cursor-pointer font-semibold hover:underline\"\n }\n onClick={() => presenter.folders.selectFolder(folder.id)}\n >\n <Icon\n size={\"sm\"}\n color={\"neutral-strong\"}\n icon={icon}\n label={`Folder - ${folder.title}`}\n />\n <Text className={\"truncate min-w-0 shrink\"}>{folder.title}</Text>\n </div>\n );\n};\n"],"names":["FolderNameCell","folder","presenter","useContentEntriesPresenter","icon","Folder","FolderShared","Icon","Text"],"mappings":";;;;;AAWO,MAAMA,iBAAiB,CAAC,EAAEC,MAAM,EAAuB;IAC1D,MAAMC,YAAYC;IAElB,IAAIC,OAAO,WAAPA,GAAO,oBAACC,gBAAMA;IAClB,IAAIJ,OAAO,0BAA0B,IAAIA,OAAO,oBAAoB,EAChEG,OAAO,WAAPA,GAAO,oBAACE,kCAAYA;IAGxB,OAAO,WAAP,GACI,oBAAC;QACG,WACI;QAEJ,SAAS,IAAMJ,UAAU,OAAO,CAAC,YAAY,CAACD,OAAO,EAAE;qBAEvD,oBAACM,MAAIA;QACD,MAAM;QACN,OAAO;QACP,MAAMH;QACN,OAAO,CAAC,SAAS,EAAEH,OAAO,KAAK,EAAE;sBAErC,oBAACO,MAAIA;QAAC,WAAW;OAA4BP,OAAO,KAAK;AAGrE"}
|
|
@@ -1,42 +1,31 @@
|
|
|
1
1
|
import { useCallback } from "react";
|
|
2
|
-
import { useMutation } from "@apollo/react-hooks";
|
|
3
2
|
import { useToast } from "@webiny/admin-ui";
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
const useInstallTenant = (tenant)=>{
|
|
3
|
+
import { useInstallTenant } from "../../InstallTenant/index.js";
|
|
4
|
+
const useInstallTenant_useInstallTenant = (tenant)=>{
|
|
7
5
|
const toast = useToast();
|
|
8
|
-
const
|
|
9
|
-
const [runMutation, mutation] = useMutation(INSTALL_TENANT);
|
|
6
|
+
const hook = useInstallTenant();
|
|
10
7
|
const installTenant = useCallback(async ()=>{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
8
|
+
try {
|
|
9
|
+
await hook.installTenant(tenant.entryId);
|
|
10
|
+
} catch (error) {
|
|
11
|
+
toast.showWarningToast({
|
|
12
|
+
title: "Could not install tenant",
|
|
13
|
+
description: error.message,
|
|
14
|
+
duration: 1 / 0
|
|
15
|
+
});
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
21
18
|
toast.showSuccessToast({
|
|
22
19
|
title: "Tenant installed successfully!"
|
|
23
20
|
});
|
|
24
|
-
updateRecordInCache({
|
|
25
|
-
...tenant,
|
|
26
|
-
values: {
|
|
27
|
-
...tenant.values,
|
|
28
|
-
status: "enabled",
|
|
29
|
-
isInstalled: true
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
21
|
}, [
|
|
33
22
|
tenant
|
|
34
23
|
]);
|
|
35
24
|
return {
|
|
36
25
|
installTenant,
|
|
37
|
-
loading:
|
|
26
|
+
loading: hook.loading
|
|
38
27
|
};
|
|
39
28
|
};
|
|
40
|
-
export { useInstallTenant };
|
|
29
|
+
export { useInstallTenant_useInstallTenant as useInstallTenant };
|
|
41
30
|
|
|
42
31
|
//# sourceMappingURL=useInstallTenant.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/TenantEntryList/InstallTenantButton/useInstallTenant.js","sources":["../../../../src/admin/TenantEntryList/InstallTenantButton/useInstallTenant.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport {
|
|
1
|
+
{"version":3,"file":"admin/TenantEntryList/InstallTenantButton/useInstallTenant.js","sources":["../../../../src/admin/TenantEntryList/InstallTenantButton/useInstallTenant.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useToast } from \"@webiny/admin-ui\";\nimport { TenantEntry } from \"../../types.js\";\nimport { useInstallTenant as baseInstallTenant } from \"~/admin/InstallTenant/index.js\";\n\nexport const useInstallTenant = (tenant: TenantEntry) => {\n const toast = useToast();\n const hook = baseInstallTenant();\n\n const installTenant = useCallback(async () => {\n try {\n await hook.installTenant(tenant.entryId);\n } catch (error) {\n toast.showWarningToast({\n title: \"Could not install tenant\",\n description: error.message,\n duration: Infinity\n });\n return;\n }\n\n toast.showSuccessToast({ title: \"Tenant installed successfully!\" });\n }, [tenant]);\n\n return { installTenant, loading: hook.loading };\n};\n"],"names":["useInstallTenant","tenant","toast","useToast","hook","baseInstallTenant","installTenant","useCallback","error","Infinity"],"mappings":";;;AAKO,MAAMA,oCAAmB,CAACC;IAC7B,MAAMC,QAAQC;IACd,MAAMC,OAAOC;IAEb,MAAMC,gBAAgBC,YAAY;QAC9B,IAAI;YACA,MAAMH,KAAK,aAAa,CAACH,OAAO,OAAO;QAC3C,EAAE,OAAOO,OAAO;YACZN,MAAM,gBAAgB,CAAC;gBACnB,OAAO;gBACP,aAAaM,MAAM,OAAO;gBAC1B,UAAUC;YACd;YACA;QACJ;QAEAP,MAAM,gBAAgB,CAAC;YAAE,OAAO;QAAiC;IACrE,GAAG;QAACD;KAAO;IAEX,OAAO;QAAEK;QAAe,SAASF,KAAK,OAAO;IAAC;AAClD"}
|
|
@@ -4,7 +4,6 @@ import { useTenantContext } from "@webiny/app-admin";
|
|
|
4
4
|
const ManageTenant = ({ tenant })=>{
|
|
5
5
|
const { setTenant } = useTenantContext();
|
|
6
6
|
const switchToTenant = useCallback(()=>{
|
|
7
|
-
localStorage.removeItem("webiny_wb_page_latest_visited_folder");
|
|
8
7
|
setTenant(tenant.entryId);
|
|
9
8
|
}, [
|
|
10
9
|
tenant
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/TenantEntryList/ManageTenant.js","sources":["../../../src/admin/TenantEntryList/ManageTenant.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Button } from \"@webiny/admin-ui\";\nimport { useTenantContext } from \"@webiny/app-admin\";\nimport type { TenantEntry } from \"../types.js\";\n\ninterface ManageTenantProps {\n tenant: TenantEntry;\n}\n\nexport const ManageTenant = ({ tenant }: ManageTenantProps) => {\n const { setTenant } = useTenantContext();\n const switchToTenant = useCallback(() => {\n
|
|
1
|
+
{"version":3,"file":"admin/TenantEntryList/ManageTenant.js","sources":["../../../src/admin/TenantEntryList/ManageTenant.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Button } from \"@webiny/admin-ui\";\nimport { useTenantContext } from \"@webiny/app-admin\";\nimport type { TenantEntry } from \"../types.js\";\n\ninterface ManageTenantProps {\n tenant: TenantEntry;\n}\n\nexport const ManageTenant = ({ tenant }: ManageTenantProps) => {\n const { setTenant } = useTenantContext();\n const switchToTenant = useCallback(() => {\n setTenant(tenant.entryId);\n }, [tenant]);\n\n return <Button variant={\"secondary\"} onClick={switchToTenant} text={\"Manage\"} />;\n};\n"],"names":["ManageTenant","tenant","setTenant","useTenantContext","switchToTenant","useCallback","Button"],"mappings":";;;AASO,MAAMA,eAAe,CAAC,EAAEC,MAAM,EAAqB;IACtD,MAAM,EAAEC,SAAS,EAAE,GAAGC;IACtB,MAAMC,iBAAiBC,YAAY;QAC/BH,UAAUD,OAAO,OAAO;IAC5B,GAAG;QAACA;KAAO;IAEX,OAAO,WAAP,GAAO,oBAACK,QAAMA;QAAC,SAAS;QAAa,SAASF;QAAgB,MAAM;;AACxE"}
|
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
import react from "react";
|
|
2
2
|
import { Icon, Link, Text } from "@webiny/admin-ui";
|
|
3
3
|
import { ReactComponent } from "@webiny/icons/description.svg";
|
|
4
|
-
import { ContentEntryListConfig } from "@webiny/app-headless-cms";
|
|
4
|
+
import { ContentEntryListConfig, Routes } from "@webiny/app-headless-cms";
|
|
5
5
|
import { FolderNameCell } from "./FolderNameCell.js";
|
|
6
|
-
import {
|
|
6
|
+
import { useContentEntriesPresenter } from "@webiny/app-headless-cms/exports/admin/cms/entry/list.js";
|
|
7
|
+
import { useRouter } from "@webiny/app-admin";
|
|
7
8
|
const TenantName = ({ tenant })=>{
|
|
8
|
-
const
|
|
9
|
+
const presenter = useContentEntriesPresenter();
|
|
10
|
+
const { getLink } = useRouter();
|
|
11
|
+
const url = getLink(Routes.ContentEntries.List, {
|
|
12
|
+
modelId: presenter.vm.model.modelId,
|
|
13
|
+
folderId: presenter.folders.vm.currentFolderId ?? void 0,
|
|
14
|
+
id: tenant.id
|
|
15
|
+
});
|
|
9
16
|
return /*#__PURE__*/ react.createElement("div", {
|
|
10
17
|
className: "flex flex-col gap-y-[3px]"
|
|
11
18
|
}, /*#__PURE__*/ react.createElement(Link, {
|
|
12
|
-
to:
|
|
19
|
+
to: url,
|
|
13
20
|
variant: "secondary",
|
|
14
21
|
className: "truncate no-underline!"
|
|
15
22
|
}, /*#__PURE__*/ react.createElement("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/TenantEntryList/TenantNameCell.js","sources":["../../../src/admin/TenantEntryList/TenantNameCell.tsx"],"sourcesContent":["import React from \"react\";\nimport { Icon, Link, Text } from \"@webiny/admin-ui\";\nimport { ReactComponent as File } from \"@webiny/icons/description.svg\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms\";\nimport { FolderNameCell } from \"./FolderNameCell.js\";\nimport type { TenantEntry } from \"~/admin/types.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"admin/TenantEntryList/TenantNameCell.js","sources":["../../../src/admin/TenantEntryList/TenantNameCell.tsx"],"sourcesContent":["import React from \"react\";\nimport { Icon, Link, Text } from \"@webiny/admin-ui\";\nimport { ReactComponent as File } from \"@webiny/icons/description.svg\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms\";\nimport { FolderNameCell } from \"./FolderNameCell.js\";\nimport type { TenantEntry } from \"~/admin/types.js\";\nimport { useContentEntriesPresenter } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport { Routes } from \"@webiny/app-headless-cms\";\n\ninterface TenantNameProps {\n tenant: TenantEntry;\n}\n\nconst TenantName = ({ tenant }: TenantNameProps) => {\n const presenter = useContentEntriesPresenter();\n const { getLink } = useRouter();\n\n const url = getLink(Routes.ContentEntries.List, {\n modelId: presenter.vm.model.modelId,\n folderId: presenter.folders.vm.currentFolderId ?? undefined,\n id: tenant.id\n });\n\n return (\n <div className={\"flex flex-col gap-y-[3px]\"}>\n <Link to={url} variant={\"secondary\"} className={\"truncate no-underline!\"}>\n <div className={\"flex w-full items-center\"}>\n <Icon\n size={\"sm\"}\n color={\"neutral-strong\"}\n className={\"mr-xs\"}\n icon={<File />}\n label={`Tenant - ${tenant.values.name}`}\n />\n <Text as={\"div\"} className={\"truncate min-w-0 shrink\"}>\n {tenant.values.name}\n </Text>\n </div>\n </Link>\n <Text as={\"div\"} size={\"sm\"} className={\"text-neutral-dimmed\"}>\n ID: {tenant.entryId}\n </Text>\n </div>\n );\n};\n\nexport const TenantNameCell = () => {\n const { useTableRow, isFolderRow } = ContentEntryListConfig.Browser.Table.Column;\n const { row } = useTableRow<TenantEntry>();\n\n if (isFolderRow(row)) {\n return <FolderNameCell folder={row.data} />;\n }\n\n return <TenantName tenant={row.data} />;\n};\n"],"names":["TenantName","tenant","presenter","useContentEntriesPresenter","getLink","useRouter","url","Routes","undefined","Link","Icon","File","Text","TenantNameCell","useTableRow","isFolderRow","ContentEntryListConfig","row","FolderNameCell"],"mappings":";;;;;;;AAcA,MAAMA,aAAa,CAAC,EAAEC,MAAM,EAAmB;IAC3C,MAAMC,YAAYC;IAClB,MAAM,EAAEC,OAAO,EAAE,GAAGC;IAEpB,MAAMC,MAAMF,QAAQG,OAAO,cAAc,CAAC,IAAI,EAAE;QAC5C,SAASL,UAAU,EAAE,CAAC,KAAK,CAAC,OAAO;QACnC,UAAUA,UAAU,OAAO,CAAC,EAAE,CAAC,eAAe,IAAIM;QAClD,IAAIP,OAAO,EAAE;IACjB;IAEA,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACQ,MAAIA;QAAC,IAAIH;QAAK,SAAS;QAAa,WAAW;qBAC5C,oBAAC;QAAI,WAAW;qBACZ,oBAACI,MAAIA;QACD,MAAM;QACN,OAAO;QACP,WAAW;QACX,oBAAM,oBAACC,gBAAIA;QACX,OAAO,CAAC,SAAS,EAAEV,OAAO,MAAM,CAAC,IAAI,EAAE;sBAE3C,oBAACW,MAAIA;QAAC,IAAI;QAAO,WAAW;OACvBX,OAAO,MAAM,CAAC,IAAI,mBAI/B,oBAACW,MAAIA;QAAC,IAAI;QAAO,MAAM;QAAM,WAAW;OAAuB,QACtDX,OAAO,OAAO;AAInC;AAEO,MAAMY,iBAAiB;IAC1B,MAAM,EAAEC,WAAW,EAAEC,WAAW,EAAE,GAAGC,uBAAuB,OAAO,CAAC,KAAK,CAAC,MAAM;IAChF,MAAM,EAAEC,GAAG,EAAE,GAAGH;IAEhB,IAAIC,YAAYE,MACZ,OAAO,WAAP,GAAO,oBAACC,gBAAcA;QAAC,QAAQD,IAAI,IAAI;;IAG3C,OAAO,WAAP,GAAO,oBAACjB,YAAUA;QAAC,QAAQiB,IAAI,IAAI;;AACvC"}
|
package/admin/TenantEntryList.js
CHANGED
|
@@ -19,7 +19,7 @@ const WithDisableAction = ({ children })=>{
|
|
|
19
19
|
label: "Disable",
|
|
20
20
|
onAction: disableEntry,
|
|
21
21
|
"data-testid": "aco.actions.entry.delete",
|
|
22
|
-
|
|
22
|
+
variant: "destructive"
|
|
23
23
|
});
|
|
24
24
|
return /*#__PURE__*/ react.createElement(react.Fragment, null, children);
|
|
25
25
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/TenantEntryList.js","sources":["../../src/admin/TenantEntryList.tsx"],"sourcesContent":["import React from \"react\";\nimport { useModel } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { ReactComponent as DisableIcon } from \"@webiny/icons/power_off.svg\";\nimport { TenantCell } from \"./TenantEntryList/TenantCell.js\";\nimport { TENANT_MODEL_ID } from \"~/shared/constants.js\";\nimport type { TenantEntry } from \"~/admin/types.js\";\nimport { useDisableTenantDialog } from \"~/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.js\";\nimport { TenantNameCell } from \"~/admin/TenantEntryList/TenantNameCell.js\";\n\nconst { Browser } = ContentEntryListConfig;\nconst EntryAction = Browser.Entry.Action;\nconst { useTableRow } = Browser.Table.Column;\n\ninterface WithDisableActionProps {\n children: React.ReactNode;\n}\n\nconst WithDisableAction = ({ children }: WithDisableActionProps) => {\n // useTableRow() allows you to access the entire data of the current row.\n const { row } = useTableRow<TenantEntry>();\n const { disableEntry } = useDisableTenantDialog({ record: row.data });\n\n if (row.data.values.status === \"enabled\") {\n return (\n <EntryAction.OptionsMenuItem\n icon={<DisableIcon />}\n label={\"Disable\"}\n onAction={disableEntry}\n data-testid={\"aco.actions.entry.delete\"}\n
|
|
1
|
+
{"version":3,"file":"admin/TenantEntryList.js","sources":["../../src/admin/TenantEntryList.tsx"],"sourcesContent":["import React from \"react\";\nimport { useModel } from \"@webiny/app-headless-cms/exports/admin/cms.js\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms/exports/admin/cms/entry/list.js\";\nimport { ReactComponent as DisableIcon } from \"@webiny/icons/power_off.svg\";\nimport { TenantCell } from \"./TenantEntryList/TenantCell.js\";\nimport { TENANT_MODEL_ID } from \"~/shared/constants.js\";\nimport type { TenantEntry } from \"~/admin/types.js\";\nimport { useDisableTenantDialog } from \"~/admin/TenantEntryList/DisableTenant/useDisableTenantDialog.js\";\nimport { TenantNameCell } from \"~/admin/TenantEntryList/TenantNameCell.js\";\n\nconst { Browser } = ContentEntryListConfig;\nconst EntryAction = Browser.Entry.Action;\nconst { useTableRow } = Browser.Table.Column;\n\ninterface WithDisableActionProps {\n children: React.ReactNode;\n}\n\nconst WithDisableAction = ({ children }: WithDisableActionProps) => {\n // useTableRow() allows you to access the entire data of the current row.\n const { row } = useTableRow<TenantEntry>();\n const { disableEntry } = useDisableTenantDialog({ record: row.data });\n\n if (row.data.values.status === \"enabled\") {\n return (\n <EntryAction.OptionsMenuItem\n icon={<DisableIcon />}\n label={\"Disable\"}\n onAction={disableEntry}\n data-testid={\"aco.actions.entry.delete\"}\n variant={\"destructive\"}\n />\n );\n }\n\n return <>{children}</>;\n};\n\nconst DeleteActionDecorator = EntryAction.createDecorator(Original => {\n return function DeleteAction(props) {\n const { model } = useModel();\n\n if (model.modelId !== TENANT_MODEL_ID) {\n return <Original {...props} />;\n }\n\n if (props.name === \"delete\") {\n return (\n <Original\n {...props}\n element={<WithDisableAction>{props.element}</WithDisableAction>}\n />\n );\n }\n\n return <Original {...props} />;\n };\n});\n\nexport const TenantEntryList = () => {\n return (\n <>\n <DeleteActionDecorator />\n <ContentEntryListConfig>\n <Browser.Table.Column\n hideable={false}\n name={\"name\"}\n header={\"Name\"}\n modelIds={[TENANT_MODEL_ID]}\n cell={<TenantNameCell />}\n />\n <Browser.Table.Column\n name={\"tenant\"}\n header={\"Tenant\"}\n modelIds={[TENANT_MODEL_ID]}\n cell={<TenantCell />}\n before={\"actions\"}\n />\n </ContentEntryListConfig>\n </>\n );\n};\n"],"names":["Browser","ContentEntryListConfig","EntryAction","useTableRow","WithDisableAction","children","row","disableEntry","useDisableTenantDialog","DisableIcon","DeleteActionDecorator","Original","props","model","useModel","TENANT_MODEL_ID","TenantEntryList","TenantNameCell","TenantCell"],"mappings":";;;;;;;;AAUA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AACpB,MAAMC,cAAcF,QAAQ,KAAK,CAAC,MAAM;AACxC,MAAM,EAAEG,aAAAA,WAAW,EAAE,GAAGH,QAAQ,KAAK,CAAC,MAAM;AAM5C,MAAMI,oBAAoB,CAAC,EAAEC,QAAQ,EAA0B;IAE3D,MAAM,EAAEC,GAAG,EAAE,GAAGH;IAChB,MAAM,EAAEI,YAAY,EAAE,GAAGC,uBAAuB;QAAE,QAAQF,IAAI,IAAI;IAAC;IAEnE,IAAIA,AAA2B,cAA3BA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EACtB,OAAO,WAAP,GACI,oBAACJ,YAAY,eAAe;QACxB,oBAAM,oBAACO,gBAAWA;QAClB,OAAO;QACP,UAAUF;QACV,eAAa;QACb,SAAS;;IAKrB,OAAO,WAAP,GAAO,0CAAGF;AACd;AAEA,MAAMK,wBAAwBR,YAAY,eAAe,CAACS,CAAAA,WAC/C,SAAsBC,KAAK;QAC9B,MAAM,EAAEC,KAAK,EAAE,GAAGC;QAElB,IAAID,MAAM,OAAO,KAAKE,iBAClB,OAAO,WAAP,GAAO,oBAACJ,UAAaC;QAGzB,IAAIA,AAAe,aAAfA,MAAM,IAAI,EACV,OAAO,WAAP,GACI,oBAACD,UAAAA;YACI,GAAGC,KAAK;YACT,uBAAS,oBAACR,mBAAiBA,MAAEQ,MAAM,OAAO;;QAKtD,OAAO,WAAP,GAAO,oBAACD,UAAaC;IACzB;AAGG,MAAMI,kBAAkB,IACpB,WAAP,GACI,wDACI,oBAACN,uBAAqBA,OAAAA,WAAAA,GACtB,oBAACT,wBAAsBA,MAAAA,WAAAA,GACnB,oBAACD,QAAQ,KAAK,CAAC,MAAM;QACjB,UAAU;QACV,MAAM;QACN,QAAQ;QACR,UAAU;YAACe;SAAgB;QAC3B,oBAAM,oBAACE,gBAAcA;sBAEzB,oBAACjB,QAAQ,KAAK,CAAC,MAAM;QACjB,MAAM;QACN,QAAQ;QACR,UAAU;YAACe;SAAgB;QAC3B,oBAAM,oBAACG,YAAUA;QACjB,QAAQ"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PermissionTransformer } from "@webiny/api-core/features/security/authorization/AuthorizationContext/abstractions.js";
|
|
2
2
|
declare class AddCmsPermissions implements PermissionTransformer.Interface {
|
|
3
|
-
execute(permission: PermissionTransformer.Permission): PermissionTransformer.Permission | PermissionTransformer.Permission
|
|
3
|
+
execute(permission: PermissionTransformer.Permission): PermissionTransformer.Permission[] | PermissionTransformer.Permission;
|
|
4
4
|
}
|
|
5
5
|
declare const _default: typeof AddCmsPermissions & {
|
|
6
6
|
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/security/authorization/AuthorizationContext/abstractions.js").IPermissionTransformer>;
|
|
@@ -6,7 +6,7 @@ import { UpdateTenantUseCase } from "../UpdateTenant/abstractions.js";
|
|
|
6
6
|
import { CreateAndInstallTenantUseCase } from "./abstractions.js";
|
|
7
7
|
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/errors.js";
|
|
8
8
|
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
9
|
-
import * as
|
|
9
|
+
import * as __rspack_external__webiny_api_core_exports_api_tenancy_js_0fb78d16 from "@webiny/api-core/exports/api/tenancy.js";
|
|
10
10
|
class CreateAndInstallTenantUseCase_CreateAndInstallTenantUseCase {
|
|
11
11
|
constructor(identityContext, getTenantByIdUseCase, updateTenantUseCase, coreGetTenantById, coreCreateTenant, coreUpdateTenant, coreDeleteTenant, coreInstallTenant){
|
|
12
12
|
this.identityContext = identityContext;
|
|
@@ -69,11 +69,11 @@ const CreateAndInstallTenant_CreateAndInstallTenantUseCase = CreateAndInstallTen
|
|
|
69
69
|
IdentityContext,
|
|
70
70
|
GetTenantByIdUseCase,
|
|
71
71
|
UpdateTenantUseCase,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
__rspack_external__webiny_api_core_exports_api_tenancy_js_0fb78d16.GetTenantByIdUseCase,
|
|
73
|
+
__rspack_external__webiny_api_core_exports_api_tenancy_js_0fb78d16.CreateTenantUseCase,
|
|
74
|
+
__rspack_external__webiny_api_core_exports_api_tenancy_js_0fb78d16.UpdateTenantUseCase,
|
|
75
|
+
__rspack_external__webiny_api_core_exports_api_tenancy_js_0fb78d16.DeleteTenantUseCase,
|
|
76
|
+
__rspack_external__webiny_api_core_exports_api_tenancy_js_0fb78d16.InstallTenantUseCase
|
|
77
77
|
]
|
|
78
78
|
});
|
|
79
79
|
export default CreateAndInstallTenant_CreateAndInstallTenantUseCase;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/tenant-manager",
|
|
3
|
-
"version": "0.0.0-unstable.
|
|
3
|
+
"version": "0.0.0-unstable.9f53ea597d",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"exports": {
|
|
@@ -15,29 +15,27 @@
|
|
|
15
15
|
"author": "Webiny Ltd.",
|
|
16
16
|
"license": "Webiny Enterprise",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@
|
|
19
|
-
"@webiny/
|
|
20
|
-
"@webiny/api-
|
|
21
|
-
"@webiny/
|
|
22
|
-
"@webiny/app": "0.0.0-unstable.
|
|
23
|
-
"@webiny/app-
|
|
24
|
-
"@webiny/app-
|
|
25
|
-
"@webiny/
|
|
26
|
-
"@webiny/
|
|
27
|
-
"@webiny/
|
|
28
|
-
"@webiny/
|
|
29
|
-
"@webiny/project": "0.0.0-unstable.
|
|
30
|
-
"
|
|
31
|
-
"graphql-tag": "2.12.6",
|
|
32
|
-
"mobx": "6.15.3",
|
|
18
|
+
"@webiny/admin-ui": "0.0.0-unstable.9f53ea597d",
|
|
19
|
+
"@webiny/api-core": "0.0.0-unstable.9f53ea597d",
|
|
20
|
+
"@webiny/api-headless-cms": "0.0.0-unstable.9f53ea597d",
|
|
21
|
+
"@webiny/app": "0.0.0-unstable.9f53ea597d",
|
|
22
|
+
"@webiny/app-aco": "0.0.0-unstable.9f53ea597d",
|
|
23
|
+
"@webiny/app-admin": "0.0.0-unstable.9f53ea597d",
|
|
24
|
+
"@webiny/app-headless-cms": "0.0.0-unstable.9f53ea597d",
|
|
25
|
+
"@webiny/feature": "0.0.0-unstable.9f53ea597d",
|
|
26
|
+
"@webiny/handler-graphql": "0.0.0-unstable.9f53ea597d",
|
|
27
|
+
"@webiny/icons": "0.0.0-unstable.9f53ea597d",
|
|
28
|
+
"@webiny/project": "0.0.0-unstable.9f53ea597d",
|
|
29
|
+
"@webiny/project-aws": "0.0.0-unstable.9f53ea597d",
|
|
30
|
+
"mobx": "6.16.1",
|
|
33
31
|
"mobx-react-lite": "4.1.1",
|
|
34
32
|
"react": "18.3.1",
|
|
35
33
|
"react-dom": "18.3.1"
|
|
36
34
|
},
|
|
37
35
|
"devDependencies": {
|
|
38
|
-
"@webiny/build-tools": "0.0.0-unstable.
|
|
36
|
+
"@webiny/build-tools": "0.0.0-unstable.9f53ea597d",
|
|
39
37
|
"rimraf": "6.1.3",
|
|
40
|
-
"typescript": "
|
|
38
|
+
"typescript": "7.0.2"
|
|
41
39
|
},
|
|
42
40
|
"publishConfig": {
|
|
43
41
|
"access": "public"
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export declare const INSTALL_TENANT: import("graphql").DocumentNode;
|
|
2
|
-
export interface InstallTenantResponse {
|
|
3
|
-
tenantManager: {
|
|
4
|
-
installTenant: {
|
|
5
|
-
data: boolean;
|
|
6
|
-
error?: null;
|
|
7
|
-
} | {
|
|
8
|
-
data: null;
|
|
9
|
-
error: {
|
|
10
|
-
code: string;
|
|
11
|
-
message: string;
|
|
12
|
-
data: Record<string, any>;
|
|
13
|
-
};
|
|
14
|
-
};
|
|
15
|
-
};
|
|
16
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import graphql_tag from "graphql-tag";
|
|
2
|
-
const INSTALL_TENANT = graphql_tag`
|
|
3
|
-
mutation InstallTenant($tenantId: ID!) {
|
|
4
|
-
tenantManager {
|
|
5
|
-
installTenant(tenantId: $tenantId) {
|
|
6
|
-
data
|
|
7
|
-
error {
|
|
8
|
-
code
|
|
9
|
-
message
|
|
10
|
-
data
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
`;
|
|
16
|
-
export { INSTALL_TENANT };
|
|
17
|
-
|
|
18
|
-
//# sourceMappingURL=installTenant.gql.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin/TenantEntryList/InstallTenantButton/installTenant.gql.js","sources":["../../../../src/admin/TenantEntryList/InstallTenantButton/installTenant.gql.ts"],"sourcesContent":["import gql from \"graphql-tag\";\n\nexport const INSTALL_TENANT = gql`\n mutation InstallTenant($tenantId: ID!) {\n tenantManager {\n installTenant(tenantId: $tenantId) {\n data\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\nexport interface InstallTenantResponse {\n tenantManager: {\n installTenant:\n | {\n data: boolean;\n error?: null;\n }\n | {\n data: null;\n error: {\n code: string;\n message: string;\n data: Record<string, any>;\n };\n };\n };\n}\n"],"names":["INSTALL_TENANT","gql"],"mappings":";AAEO,MAAMA,iBAAiBC,WAAG,CAAC;;;;;;;;;;;;;AAalC,CAAC"}
|