diff --git a/apps/vue/src/api/saas/editions.ts b/apps/vue/src/api/saas/editions.ts new file mode 100644 index 000000000..8d4aae1b6 --- /dev/null +++ b/apps/vue/src/api/saas/editions.ts @@ -0,0 +1,50 @@ +import { defAbpHttp } from '/@/utils/http/abp'; +import { + Edition, + EditionCreate, + EditionUpdate, + EditionGetListInput, +} from './model/editionsModel'; +import { format } from '/@/utils/strings'; +import { PagedResultDto } from '../model/baseModel'; + +enum Api { + Create = '/api/saas/editions', + DeleteById = '/api/saas/editions/{id}', + GetById = '/api/saas/editions/{id}', + GetList = '/api/saas/editions', + Update = '/api/saas/editions/{id}', +} + +export const getById = (id: string) => { + return defAbpHttp.get({ + url: format(Api.GetById, { id: id }), + }); +}; + +export const getList = (input: EditionGetListInput) => { + return defAbpHttp.get>({ + url: Api.GetList, + params: input, + }); +}; + +export const create = (input: EditionCreate) => { + return defAbpHttp.post({ + url: Api.Create, + data: input, + }); +}; + +export const deleteById = (id: string) => { + return defAbpHttp.delete({ + url: format(Api.GetById, { id: id }), + }); +}; + +export const update = (id: string, input: EditionUpdate) => { + return defAbpHttp.put({ + url: format(Api.Update, { id: id }), + data: input, + }); +}; diff --git a/apps/vue/src/api/saas/model/editionsModel.ts b/apps/vue/src/api/saas/model/editionsModel.ts new file mode 100644 index 000000000..2001d7299 --- /dev/null +++ b/apps/vue/src/api/saas/model/editionsModel.ts @@ -0,0 +1,23 @@ +import { + IHasConcurrencyStamp, + AuditedEntityDto, + PagedAndSortedResultRequestDto, +} from '../../model/baseModel'; + +export interface Edition extends AuditedEntityDto { + id: string; + displayName: string; +} + +interface EditionCreateOrUpdate { + displayName: string; +} + +export type EditionCreate = EditionCreateOrUpdate; + +export interface EditionUpdate extends EditionCreateOrUpdate, IHasConcurrencyStamp { +} + +export interface EditionGetListInput extends PagedAndSortedResultRequestDto { + filter?: string; +} diff --git a/apps/vue/src/api/saas/model/tenantModel.ts b/apps/vue/src/api/saas/model/tenantModel.ts index 467c5df76..cf709a8d4 100644 --- a/apps/vue/src/api/saas/model/tenantModel.ts +++ b/apps/vue/src/api/saas/model/tenantModel.ts @@ -9,6 +9,11 @@ import { export interface Tenant extends AuditedEntityDto { id: string; name: string; + editionId?: string; + editionName?: string; + isActive: boolean; + enableTime?: Date; + disableTime?: Date; } export interface TenantConnectionString { @@ -20,10 +25,18 @@ export interface CreateTenant { name: string; adminEmailAddress: string; adminPassword: string; + editionId?: string; + isActive: boolean; + enableTime?: Date; + disableTime?: Date; } export interface UpdateTenant { name: string; + editionId?: string; + isActive: boolean; + enableTime?: Date; + disableTime?: Date; } export interface GetTenantPagedRequest extends PagedAndSortedResultRequestDto { diff --git a/apps/vue/src/api/saas/tenant.ts b/apps/vue/src/api/saas/tenant.ts index a32c88f21..74d3821bb 100644 --- a/apps/vue/src/api/saas/tenant.ts +++ b/apps/vue/src/api/saas/tenant.ts @@ -12,14 +12,14 @@ import { format } from '/@/utils/strings'; /** 与 multi-tenancy中不同,此为管理tenant api */ enum Api { - Create = '/api/tenant-management/tenants', - DeleteById = '/api/tenant-management/tenants/{id}', - GetById = '/api/tenant-management/tenants/{id}', - GetList = '/api/tenant-management/tenants', - Update = '/api/tenant-management/tenants/{id}', - GetConnectionStrings = '/api/tenant-management/tenants/{id}/connection-string', - SetConnectionString = '/api/tenant-management/tenants/{id}/connection-string', - DeleteConnectionString = '/api/tenant-management/tenants/{id}/connection-string/{name}', + Create = '/api/saas/tenants', + DeleteById = '/api/saas/tenants/{id}', + GetById = '/api/saas/tenants/{id}', + GetList = '/api/saas/tenants', + Update = '/api/saas/tenants/{id}', + GetConnectionStrings = '/api/saas/tenants/{id}/connection-string', + SetConnectionString = '/api/saas/tenants/{id}/connection-string', + DeleteConnectionString = '/api/saas/tenants/{id}/connection-string/{name}', } export const getById = (id: string) => { diff --git a/apps/vue/src/views/saas/editions/components/EditionModal.vue b/apps/vue/src/views/saas/editions/components/EditionModal.vue new file mode 100644 index 000000000..be56eb684 --- /dev/null +++ b/apps/vue/src/views/saas/editions/components/EditionModal.vue @@ -0,0 +1,70 @@ + + + diff --git a/apps/vue/src/views/saas/editions/components/EditionTable.vue b/apps/vue/src/views/saas/editions/components/EditionTable.vue new file mode 100644 index 000000000..7c7788df6 --- /dev/null +++ b/apps/vue/src/views/saas/editions/components/EditionTable.vue @@ -0,0 +1,108 @@ + + + diff --git a/apps/vue/src/views/saas/editions/datas/ModalData.ts b/apps/vue/src/views/saas/editions/datas/ModalData.ts new file mode 100644 index 000000000..01e119b45 --- /dev/null +++ b/apps/vue/src/views/saas/editions/datas/ModalData.ts @@ -0,0 +1,44 @@ +import { useLocalization } from '/@/hooks/abp/useLocalization'; +import { FormProps, FormSchema } from '/@/components/Form'; + +const { L } = useLocalization('AbpSaas'); + +export function getSearchFormSchemas(): Partial { + return { + labelWidth: 120, + schemas: [ + { + field: 'filter', + component: 'Input', + label: L('Search'), + colProps: { span: 24 }, + }, + ], + }; +} + +export function getModalFormSchemas(): FormSchema[] { + return [ + { + field: 'id', + component: 'Input', + label: 'id', + show: false, + dynamicDisabled: true, + }, + { + field: 'concurrencyStamp', + component: 'Input', + label: 'concurrencyStamp', + show: false, + dynamicDisabled: true, + }, + { + field: 'displayName', + component: 'Input', + label: L('DisplayName:EditionName'), + colProps: { span: 24 }, + required: true, + }, + ]; +} diff --git a/apps/vue/src/views/saas/editions/datas/TableData.ts b/apps/vue/src/views/saas/editions/datas/TableData.ts new file mode 100644 index 000000000..c0c570f8b --- /dev/null +++ b/apps/vue/src/views/saas/editions/datas/TableData.ts @@ -0,0 +1,22 @@ +import { useLocalization } from '/@/hooks/abp/useLocalization'; +import { BasicColumn } from '/@/components/Table'; + +const { L } = useLocalization('AbpSaas'); + +export function getDataColumns(): BasicColumn[] { + return [ + { + title: 'id', + dataIndex: 'id', + width: 1, + ifShow: false, + }, + { + title: L('DisplayName:EditionName'), + dataIndex: 'displayName', + align: 'left', + width: 'auto', + sorter: true, + }, + ]; +} \ No newline at end of file diff --git a/apps/vue/src/views/saas/editions/hooks/useFeatureModal.ts b/apps/vue/src/views/saas/editions/hooks/useFeatureModal.ts new file mode 100644 index 000000000..3f42c217d --- /dev/null +++ b/apps/vue/src/views/saas/editions/hooks/useFeatureModal.ts @@ -0,0 +1,14 @@ +import { useModal } from '/@/components/Modal'; + +export function useFeatureModal() { + const [registerModal, { openModal }] = useModal(); + + function handleManageFeature(record) { + openModal(true, { providerName: 'E', providerKey: record.id }); + } + + return { + registerModal, + handleManageFeature, + }; +} diff --git a/apps/vue/src/views/saas/editions/index.vue b/apps/vue/src/views/saas/editions/index.vue new file mode 100644 index 000000000..4de13f229 --- /dev/null +++ b/apps/vue/src/views/saas/editions/index.vue @@ -0,0 +1,13 @@ + + + diff --git a/apps/vue/src/views/saas/tenant/components/TenantConnectionModal.vue b/apps/vue/src/views/saas/tenant/components/TenantConnectionModal.vue index 12ac85576..7bcbf41c5 100644 --- a/apps/vue/src/views/saas/tenant/components/TenantConnectionModal.vue +++ b/apps/vue/src/views/saas/tenant/components/TenantConnectionModal.vue @@ -10,7 +10,7 @@