diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 26360ebcd..b37b09b55 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,7 +8,7 @@ on: - "**.csproj" env: - DOTNET_VERSION: "7.0.102" + DOTNET_VERSION: "7.0.401" jobs: build: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index aeb4f1b28..d9deafe45 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: "Tagged Release" on: push: - branches: [ rel-7.3.3 ] + branches: [ rel-7.4.0 ] jobs: tagged-release: @@ -14,4 +14,4 @@ jobs: with: repo_token: "${{ secrets.GITHUB_TOKEN }}" prerelease: false - automatic_release_tag: "7.3.3" + automatic_release_tag: "7.4.0" diff --git a/apps/vue/.env.development b/apps/vue/.env.development index 221f51e7a..323254092 100644 --- a/apps/vue/.env.development +++ b/apps/vue/.env.development @@ -6,7 +6,7 @@ VITE_PUBLIC_PATH=/ # Cross-domain proxy, you can configure multiple # Please note that no line breaks -VITE_PROXY=[["/connect","http://127.0.0.1:44385"],["/api","http://127.0.0.1:30000"],["/signalr-hubs","ws://127.0.0.1:30000"]] +VITE_PROXY=[["/connect","http://127.0.0.1:30000"],["/api","http://127.0.0.1:30000"],["/signalr-hubs","ws://127.0.0.1:30000"]] # VITE_PROXY=[["/api","https://vvbin.cn/test"]] # Delete console @@ -25,6 +25,6 @@ VITE_GLOB_API_URL_PREFIX= VITE_GLOB_MULTITENANCY_KEY='__tenant' # STS Connect -VITE_GLOB_AUTHORITY='http://127.0.0.1:44385' +VITE_GLOB_AUTHORITY='http://127.0.0.1:30000' VITE_GLOB_CLIENT_ID='vue-admin-client' VITE_GLOB_CLIENT_SECRET='1q2w3e*' diff --git a/apps/vue/src/api/feature-management/definitions/features/index.ts b/apps/vue/src/api/feature-management/definitions/features/index.ts new file mode 100644 index 000000000..01bd0f6a4 --- /dev/null +++ b/apps/vue/src/api/feature-management/definitions/features/index.ts @@ -0,0 +1,40 @@ +import { defHttp } from '/@/utils/http/axios'; +import { + FeatureDefinitionDto, + FeatureDefinitionCreateDto, + FeatureDefinitionUpdateDto, + FeatureDefinitionGetListInput, +} from './model'; + +export const CreateAsyncByInput = (input: FeatureDefinitionCreateDto) => { + return defHttp.post({ + url: '/api/feature-management/definitions', + data: input, + }); +}; + +export const DeleteAsyncByName = (name: string) => { + return defHttp.delete({ + url: `/api/feature-management/definitions/${name}`, + }); +}; + +export const GetAsyncByName = (name: string) => { + return defHttp.get({ + url: `/api/feature-management/definitions/${name}`, + }); +}; + +export const GetListAsyncByInput = (input: FeatureDefinitionGetListInput) => { + return defHttp.get>({ + url: '/api/feature-management/definitions', + params: input, + }); +}; + +export const UpdateAsyncByNameAndInput = (name: string, input: FeatureDefinitionUpdateDto) => { + return defHttp.put({ + url: `/api/feature-management/definitions/${name}`, + data: input, + }); +}; diff --git a/apps/vue/src/api/feature-management/definitions/features/model/index.ts b/apps/vue/src/api/feature-management/definitions/features/model/index.ts new file mode 100644 index 000000000..117532ded --- /dev/null +++ b/apps/vue/src/api/feature-management/definitions/features/model/index.ts @@ -0,0 +1,36 @@ +interface FeatureDefinitionCreateOrUpdateDto extends IHasExtraProperties { + displayName: string; + parentName?: string; + description?: string; + defaultValue?: string; + valueType: string; + isVisibleToClients: boolean; + isAvailableToHost: boolean; + allowedProviders: string[]; +} + +export interface FeatureDefinitionCreateDto extends FeatureDefinitionCreateOrUpdateDto { + name: string; + groupName: string; +} + +export interface FeatureDefinitionDto extends IHasExtraProperties { + name: string; + groupName: string; + displayName: string; + parentName?: string; + description?: string; + defaultValue?: string; + valueType: string; + isStatic: boolean; + isVisibleToClients: boolean; + isAvailableToHost: boolean; + allowedProviders: string[]; +} + +export interface FeatureDefinitionGetListInput { + filter?: string; + groupName?: string; +} + +export type FeatureDefinitionUpdateDto = FeatureDefinitionCreateOrUpdateDto; diff --git a/apps/vue/src/api/feature-management/definitions/groups/index.ts b/apps/vue/src/api/feature-management/definitions/groups/index.ts new file mode 100644 index 000000000..e3b038dbc --- /dev/null +++ b/apps/vue/src/api/feature-management/definitions/groups/index.ts @@ -0,0 +1,40 @@ +import { defHttp } from '/@/utils/http/axios'; +import { + FeatureGroupDefinitionDto, + FeatureGroupDefinitionCreateDto, + FeatureGroupDefinitionUpdateDto, + FeatureGroupDefinitionGetListInput, +} from './model'; + +export const CreateAsyncByInput = (input: FeatureGroupDefinitionCreateDto) => { + return defHttp.post({ + url: '/api/feature-management/definitions/groups', + data: input, + }); +}; + +export const DeleteAsyncByName = (name: string) => { + return defHttp.delete({ + url: `/api/feature-management/definitions/groups/${name}`, + }); +}; + +export const GetAsyncByName = (name: string) => { + return defHttp.get({ + url: `/api/feature-management/definitions/groups/${name}`, + }); +}; + +export const GetListAsyncByInput = (input: FeatureGroupDefinitionGetListInput) => { + return defHttp.get>({ + url: '/api/feature-management/definitions/groups', + params: input, + }); +}; + +export const UpdateAsyncByNameAndInput = (name: string, input: FeatureGroupDefinitionUpdateDto) => { + return defHttp.put({ + url: `/api/feature-management/definitions/groups/${name}`, + data: input, + }); +}; diff --git a/apps/vue/src/api/feature-management/definitions/groups/model/index.ts b/apps/vue/src/api/feature-management/definitions/groups/model/index.ts new file mode 100644 index 000000000..031761e2d --- /dev/null +++ b/apps/vue/src/api/feature-management/definitions/groups/model/index.ts @@ -0,0 +1,19 @@ +interface FeatureGroupDefinitionCreateOrUpdateDto extends IHasExtraProperties { + displayName: string; +} + +export interface FeatureGroupDefinitionCreateDto extends FeatureGroupDefinitionCreateOrUpdateDto { + name: string; +} + +export interface FeatureGroupDefinitionDto extends IHasExtraProperties { + name: string; + displayName: string; + isStatic: boolean; +} + +export interface FeatureGroupDefinitionGetListInput { + filter?: string; +} + +export type FeatureGroupDefinitionUpdateDto = FeatureGroupDefinitionCreateOrUpdateDto; diff --git a/apps/vue/src/api/feature-management/features/index.ts b/apps/vue/src/api/feature-management/features/index.ts new file mode 100644 index 000000000..dabbc3178 --- /dev/null +++ b/apps/vue/src/api/feature-management/features/index.ts @@ -0,0 +1,20 @@ +import { defAbpHttp } from '/@/utils/http/abp'; +import { FeatureGroupResult, UpdateFeatures, FeatureUpdateByProvider, FeatureGetByProvider } from './model'; + +export const GetByProvider = (provider: FeatureGetByProvider) => { + return defAbpHttp.get({ + url: '/api/feature-management/features', + params: provider, + }); +}; + +export const UpdateByProvider = ( + provider: FeatureUpdateByProvider, + input: UpdateFeatures +) => { + return defAbpHttp.put({ + url: '/api/feature-management/features', + data: input, + params: provider, + }); +}; diff --git a/apps/vue/src/api/feature-management/features/model/index.ts b/apps/vue/src/api/feature-management/features/model/index.ts new file mode 100644 index 000000000..3e13e5840 --- /dev/null +++ b/apps/vue/src/api/feature-management/features/model/index.ts @@ -0,0 +1,44 @@ +export interface Provider { + name: string; + key: string; +} + +export interface Feature { + name: string; + displayName: string; + value: any; + provider: Provider; + description?: string; + valueType: ValueType; + depth: number; + parentName?: string; +} + +export interface FeatureGroup { + name: string; + displayName: string; + features: Feature[]; +} + +export class FeatureGroupResult { + groups!: FeatureGroup[]; +} + +export interface UpdateFeature { + name: string; + value: string; +} + +export interface UpdateFeatures { + features: UpdateFeature[]; +} + +export interface FeatureGetByProvider { + providerName: string; + providerKey: string | null; +} + +export interface FeatureUpdateByProvider { + providerName: string; + providerKey: string | null; +} diff --git a/apps/vue/src/api/feature/feature.ts b/apps/vue/src/api/feature/feature.ts deleted file mode 100644 index 0c0834614..000000000 --- a/apps/vue/src/api/feature/feature.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { defAbpHttp } from '/@/utils/http/abp'; -import { FeatureGroupResult, UpdateFeatures } from './model/featureModel'; - -/** 与 multi-tenancy中不同,此为管理tenant api */ -enum Api { - Get = '/api/feature-management/features', - Update = '/api/feature-management/features', -} - -export const get = (provider: { providerName: string; providerKey: string | null }) => { - return defAbpHttp.get({ - url: Api.Get, - params: provider, - }); -}; - -export const update = ( - provider: { providerName: string; providerKey: string | null }, - input: UpdateFeatures -) => { - return defAbpHttp.put({ - url: Api.Update, - data: input, - params: provider, - }); -}; diff --git a/apps/vue/src/api/feature/model/featureModel.ts b/apps/vue/src/api/feature/model/featureModel.ts deleted file mode 100644 index 721af6f02..000000000 --- a/apps/vue/src/api/feature/model/featureModel.ts +++ /dev/null @@ -1,34 +0,0 @@ -export interface Provider { - name: string; - key: string; -} - -export interface Feature { - name: string; - displayName: string; - value: any; - provider: Provider; - description?: string; - valueType: ValueType; - depth: number; - parentName?: string; -} - -export interface FeatureGroup { - name: string; - displayName: string; - features: Feature[]; -} - -export class FeatureGroupResult { - groups!: FeatureGroup[]; -} - -export interface UpdateFeature { - name: string; - value: string; -} - -export interface UpdateFeatures { - features: UpdateFeature[]; -} diff --git a/apps/vue/src/api/messages/notifications.ts b/apps/vue/src/api/messages/notifications.ts index 23224e65f..a2a78af03 100644 --- a/apps/vue/src/api/messages/notifications.ts +++ b/apps/vue/src/api/messages/notifications.ts @@ -10,7 +10,7 @@ import { format } from '/@/utils/strings'; enum Api { GetById = '/api/notifications/my-notifilers/{id}', GetList = '/api/notifications/my-notifilers', - GetAssignableNotifiers = '/api/notifications/notifilers/assignables', + GetAssignableNotifiers = '/api/notifications/assignables', Read = '/api/notifications/my-notifilers/{id}/read', MarkReadState = '/api/notifications/my-notifilers/mark-read-state', } diff --git a/apps/vue/src/api/oss-management/oss.ts b/apps/vue/src/api/oss-management/oss.ts index 15d6adefa..71e887a9d 100644 --- a/apps/vue/src/api/oss-management/oss.ts +++ b/apps/vue/src/api/oss-management/oss.ts @@ -202,9 +202,6 @@ export const deleteObject = (input: GetOssObjectRequest) => { url: Api.DeleteObject, params: input, }, - { - joinParamsToUrl: true, - }, ); }; diff --git a/apps/vue/src/api/permission-management/definitions/groups/index.ts b/apps/vue/src/api/permission-management/definitions/groups/index.ts new file mode 100644 index 000000000..f2065dc43 --- /dev/null +++ b/apps/vue/src/api/permission-management/definitions/groups/index.ts @@ -0,0 +1,40 @@ +import { defHttp } from '/@/utils/http/axios'; +import { + PermissionGroupDefinitionDto, + PermissionGroupDefinitionCreateDto, + PermissionGroupDefinitionUpdateDto, + PermissionGroupDefinitionGetListInput, +} from './model'; + +export const CreateAsyncByInput = (input: PermissionGroupDefinitionCreateDto) => { + return defHttp.post({ + url: '/api/permission-management/definitions/groups', + data: input, + }); +}; + +export const DeleteAsyncByName = (name: string) => { + return defHttp.delete({ + url: `/api/permission-management/definitions/groups/${name}`, + }); +}; + +export const GetAsyncByName = (name: string) => { + return defHttp.get({ + url: `/api/permission-management/definitions/groups/${name}`, + }); +}; + +export const GetListAsyncByInput = (input: PermissionGroupDefinitionGetListInput) => { + return defHttp.get>({ + url: '/api/permission-management/definitions/groups', + params: input, + }); +}; + +export const UpdateAsyncByNameAndInput = (name: string, input: PermissionGroupDefinitionUpdateDto) => { + return defHttp.put({ + url: `/api/permission-management/definitions/groups/${name}`, + data: input, + }); +}; diff --git a/apps/vue/src/api/permission-management/definitions/groups/model/index.ts b/apps/vue/src/api/permission-management/definitions/groups/model/index.ts new file mode 100644 index 000000000..58537fa6c --- /dev/null +++ b/apps/vue/src/api/permission-management/definitions/groups/model/index.ts @@ -0,0 +1,19 @@ +interface PermissionGroupDefinitionCreateOrUpdateDto extends IHasExtraProperties { + displayName: string; +} + +export interface PermissionGroupDefinitionCreateDto extends PermissionGroupDefinitionCreateOrUpdateDto { + name: string; +} + +export interface PermissionGroupDefinitionDto extends IHasExtraProperties { + name: string; + displayName: string; + isStatic: boolean; +} + +export interface PermissionGroupDefinitionGetListInput { + filter?: string; +} + +export type PermissionGroupDefinitionUpdateDto = PermissionGroupDefinitionCreateOrUpdateDto; \ No newline at end of file diff --git a/apps/vue/src/api/permission-management/definitions/permissions/index.ts b/apps/vue/src/api/permission-management/definitions/permissions/index.ts new file mode 100644 index 000000000..8dc321576 --- /dev/null +++ b/apps/vue/src/api/permission-management/definitions/permissions/index.ts @@ -0,0 +1,40 @@ +import { defHttp } from '/@/utils/http/axios'; +import { + PermissionDefinitionDto, + PermissionDefinitionCreateDto, + PermissionDefinitionUpdateDto, + PermissionDefinitionGetListInput, +} from './model'; + +export const CreateAsyncByInput = (input: PermissionDefinitionCreateDto) => { + return defHttp.post({ + url: '/api/permission-management/definitions', + data: input, + }); +}; + +export const DeleteAsyncByName = (name: string) => { + return defHttp.delete({ + url: `/api/permission-management/definitions/${name}`, + }); +}; + +export const GetAsyncByName = (name: string) => { + return defHttp.get({ + url: `/api/permission-management/definitions/${name}`, + }); +}; + +export const GetListAsyncByInput = (input: PermissionDefinitionGetListInput) => { + return defHttp.get>({ + url: '/api/permission-management/definitions', + params: input, + }); +}; + +export const UpdateAsyncByNameAndInput = (name: string, input: PermissionDefinitionUpdateDto) => { + return defHttp.put({ + url: `/api/permission-management/definitions/${name}`, + data: input, + }); +}; diff --git a/apps/vue/src/api/permission-management/definitions/permissions/model/index.ts b/apps/vue/src/api/permission-management/definitions/permissions/model/index.ts new file mode 100644 index 000000000..1c85dbc09 --- /dev/null +++ b/apps/vue/src/api/permission-management/definitions/permissions/model/index.ts @@ -0,0 +1,36 @@ +export enum MultiTenancySides { + Tenant = 0x1, + Host = 0x2, + Both = 0x3, +} + +interface PermissionDefinitionCreateOrUpdateDto extends IHasExtraProperties { + displayName: string; + parentName?: string; + isEnabled: boolean; + providers: string[]; + stateCheckers: string; +} + +export interface PermissionDefinitionCreateDto extends PermissionDefinitionCreateOrUpdateDto { + groupName: string; + name: string; +} + +export interface PermissionDefinitionDto extends IHasExtraProperties { + groupName: string; + name: string; + displayName: string; + parentName?: string; + isEnabled: boolean; + isStatic: boolean; + providers: string[]; + stateCheckers: string; +} + +export interface PermissionDefinitionGetListInput { + filter?: string; + groupName?: string; +} + +export type PermissionDefinitionUpdateDto = PermissionDefinitionCreateOrUpdateDto; diff --git a/apps/vue/src/api/permission-management/model/permissionModel.ts b/apps/vue/src/api/permission-management/model/permissionModel.ts deleted file mode 100644 index 2c993bcbc..000000000 --- a/apps/vue/src/api/permission-management/model/permissionModel.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { IPermission } from '../../model/baseModel'; - -export class PermissionProvider { - providerName!: string; - providerKey?: string; -} - -export interface IPermissionGrant { - allowedProviders: string[]; - grantedProviders: PermissionProvider[]; - displayName: string; - isGranted: boolean; - name: string; - parentName?: string; -} - -export class Permission implements IPermissionGrant { - allowedProviders: string[] = []; - grantedProviders: PermissionProvider[] = []; - displayName!: string; - isGranted!: boolean; - name!: string; - parentName?: string; -} - -export interface PermissionGroup { - displayName: string; - name: string; - permissions: Permission[]; -} - -export class UpdatePermission implements IPermission { - name!: string; - isGranted!: boolean; -} - -export class UpdatePermissions { - permissions!: UpdatePermission[]; -} - -export class PermissionResult { - entityDisplayName!: string; - groups: PermissionGroup[] = []; -} diff --git a/apps/vue/src/api/permission-management/permission.ts b/apps/vue/src/api/permission-management/permission.ts deleted file mode 100644 index bb8be92eb..000000000 --- a/apps/vue/src/api/permission-management/permission.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { defAbpHttp } from '/@/utils/http/abp'; -import { PermissionProvider, PermissionResult, UpdatePermissions } from './model/permissionModel'; - -enum Api { - Get = '/api/permission-management/permissions', - Update = '/api/permission-management/permissions', -} - -export const get = (provider: PermissionProvider) => { - return defAbpHttp.get({ - url: Api.Get, - params: provider, - }); -}; - -export const update = (provider: PermissionProvider, input: UpdatePermissions) => { - return defAbpHttp.put({ - url: Api.Update, - data: input, - params: provider, - }); -}; diff --git a/apps/vue/src/api/permission-management/permissions/index.ts b/apps/vue/src/api/permission-management/permissions/index.ts new file mode 100644 index 000000000..0c6437b81 --- /dev/null +++ b/apps/vue/src/api/permission-management/permissions/index.ts @@ -0,0 +1,17 @@ +import { defAbpHttp } from '/@/utils/http/abp'; +import { PermissionProvider, PermissionResult, UpdatePermissions } from './model'; + +export const get = (provider: PermissionProvider) => { + return defAbpHttp.get({ + url: '/api/permission-management/permissions', + params: provider, + }); +}; + +export const update = (provider: PermissionProvider, input: UpdatePermissions) => { + return defAbpHttp.put({ + url: '/api/permission-management/permissions', + data: input, + params: provider, + }); +}; diff --git a/apps/vue/src/api/permission-management/permissions/model/index.ts b/apps/vue/src/api/permission-management/permissions/model/index.ts new file mode 100644 index 000000000..b8a4d43c4 --- /dev/null +++ b/apps/vue/src/api/permission-management/permissions/model/index.ts @@ -0,0 +1,44 @@ +import { IPermission } from '/@/api/model/baseModel'; + +export class PermissionProvider { + providerName!: string; + providerKey?: string; +} + +export interface IPermissionGrant { + allowedProviders: string[]; + grantedProviders: PermissionProvider[]; + displayName: string; + isGranted: boolean; + name: string; + parentName?: string; +} + +export class Permission implements IPermissionGrant { + allowedProviders: string[] = []; + grantedProviders: PermissionProvider[] = []; + displayName!: string; + isGranted!: boolean; + name!: string; + parentName?: string; +} + +export interface PermissionGroup { + displayName: string; + name: string; + permissions: Permission[]; +} + +export class UpdatePermission implements IPermission { + name!: string; + isGranted!: boolean; +} + +export class UpdatePermissions { + permissions!: UpdatePermission[]; +} + +export class PermissionResult { + entityDisplayName!: string; + groups: PermissionGroup[] = []; +} diff --git a/apps/vue/src/api/settings-management/definitions/index.ts b/apps/vue/src/api/settings-management/definitions/index.ts new file mode 100644 index 000000000..a448ec73d --- /dev/null +++ b/apps/vue/src/api/settings-management/definitions/index.ts @@ -0,0 +1,41 @@ +import { defHttp } from '/@/utils/http/axios'; +import { + SettingDefinitionDto, + SettingDefinitionCreateDto, + SettingDefinitionUpdateDto, + SettingDefinitionGetListInput, + } from './model'; + + +export const GetAsyncByName = (name: string) => { + return defHttp.get({ + url: `/api/setting-management/settings/definitions/${name}`, + }); +}; + +export const GetListAsyncByInput = (input: SettingDefinitionGetListInput) => { + return defHttp.get>({ + url: `/api/setting-management/settings/definitions`, + params: input, + }); +} + +export const CreateAsyncByInput = (input: SettingDefinitionCreateDto) => { + return defHttp.post({ + url: `/api/setting-management/settings/definitions`, + data: input, + }); +}; + +export const UpdateAsyncByNameAndInput = (name: string, input: SettingDefinitionUpdateDto) => { + return defHttp.put({ + url: `/api/setting-management/settings/definitions/${name}`, + data: input, + }); +}; + +export const DeleteOrRestoreAsyncByName = (name: string) => { + return defHttp.delete({ + url: `/api/setting-management/settings/definitions/${name}`, + }); +}; diff --git a/apps/vue/src/api/settings-management/definitions/model/index.ts b/apps/vue/src/api/settings-management/definitions/model/index.ts new file mode 100644 index 000000000..99f89c0ec --- /dev/null +++ b/apps/vue/src/api/settings-management/definitions/model/index.ts @@ -0,0 +1,32 @@ +export interface SettingDefinitionDto extends ExtensibleObject { + name: string; + displayName: string; + description?: string; + defaultValue?: string; + isVisibleToClients: boolean; + providers: string[]; + isInherited: boolean; + isEncrypted: boolean; + isStatic: boolean; +} + +export interface SettingDefinitionGetListInput { + filter?: string; + providerName?: string; +} + +interface SettingDefinitionCreateOrUpdateDto extends IHasConcurrencyStamp, IHasExtraProperties { + displayName: string; + description?: string; + defaultValue?: string; + isInherited: boolean; + isEncrypted: boolean; + isVisibleToClients: boolean; + providers: string[]; +} + +export interface SettingDefinitionCreateDto extends SettingDefinitionCreateOrUpdateDto { + name: string; +} + +export type SettingDefinitionUpdateDto = SettingDefinitionCreateOrUpdateDto; diff --git a/apps/vue/src/api/settings-management/settings/index.ts b/apps/vue/src/api/settings-management/settings/index.ts new file mode 100644 index 000000000..a5e08b54c --- /dev/null +++ b/apps/vue/src/api/settings-management/settings/index.ts @@ -0,0 +1,60 @@ +import { defHttp } from '/@/utils/http/axios'; +import { SettingGroupResult, SettingsUpdate } from './model'; + +enum Api { + GetGlobalSettings = '/api/setting-management/settings/by-global', + SetGlobalSettings = '/api/setting-management/settings/change-global', + GetCurrentTenantSettings = '/api/setting-management/settings/by-current-tenant', + SetCurrentTenantSettings = '/api/setting-management/settings/change-current-tenant', + GetCurrentUserSettings = '/api/setting-management/settings/by-current-user', + SetCurrentUserSettings = '/api/setting-management/settings/change-current-user', + SendTestEmail = '/api/setting-management/settings/send-test-email' +} + +export const getGlobalSettings = () => { + return defHttp.get({ + url: Api.GetGlobalSettings, + }); +}; + +export const setGlobalSettings = (payload: SettingsUpdate) => { + return defHttp.put({ + data: payload, + url: Api.SetGlobalSettings, + }); +}; + +export const getCurrentTenantSettings = () => { + return defHttp.get({ + url: Api.GetCurrentTenantSettings, + }); +}; + +export const setCurrentTenantSettings = (payload: SettingsUpdate) => { + return defHttp.put({ + data: payload, + url: Api.SetCurrentTenantSettings, + }); +}; + +export const getCurrentUserSettings = () => { + return defHttp.get({ + url: Api.GetCurrentUserSettings, + }); +}; + +export const setCurrentUserSettings = (payload: SettingsUpdate) => { + return defHttp.put({ + data: payload, + url: Api.SetCurrentUserSettings, + }); +}; + +export const sendTestEmail = (emailAddress: string) => { + return defHttp.post({ + data: { + emailAddress: emailAddress + }, + url: Api.SendTestEmail, + }); +} diff --git a/apps/vue/src/api/settings/model/settingModel.ts b/apps/vue/src/api/settings-management/settings/model/index.ts similarity index 100% rename from apps/vue/src/api/settings/model/settingModel.ts rename to apps/vue/src/api/settings-management/settings/model/index.ts diff --git a/apps/vue/src/api/settings/settings.ts b/apps/vue/src/api/settings/settings.ts deleted file mode 100644 index 379365b9b..000000000 --- a/apps/vue/src/api/settings/settings.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { defHttp } from '/@/utils/http/axios'; -import { SettingGroupResult, SettingsUpdate } from './model/settingModel'; - -enum Api { - GetGlobalSettings = '/api/setting-management/settings/by-global', - SetGlobalSettings = '/api/setting-management/settings/change-global', - GetCurrentTenantSettings = '/api/setting-management/settings/by-current-tenant', - SetCurrentTenantSettings = '/api/setting-management/settings/change-current-tenant', - GetCurrentUserSettings = '/api/setting-management/settings/by-current-user', - SetCurrentUserSettings = '/api/setting-management/settings/change-current-user', - SendTestEmail = '/api/setting-management/settings/send-test-email' -} - -export const getGlobalSettings = () => { - return defHttp.get({ - url: Api.GetGlobalSettings, - }); -}; - -export const setGlobalSettings = (payload: SettingsUpdate) => { - return defHttp.put({ - data: payload, - url: Api.SetGlobalSettings, - }); -}; - -export const getCurrentTenantSettings = () => { - return defHttp.get({ - url: Api.GetCurrentTenantSettings, - }); -}; - -export const setCurrentTenantSettings = (payload: SettingsUpdate) => { - return defHttp.put({ - data: payload, - url: Api.SetCurrentTenantSettings, - }); -}; - -export const getCurrentUserSettings = () => { - return defHttp.get({ - url: Api.GetCurrentUserSettings, - }); -}; - -export const setCurrentUserSettings = (payload: SettingsUpdate) => { - return defHttp.put({ - data: payload, - url: Api.SetCurrentUserSettings, - }); -}; - -export const sendTestEmail = (emailAddress: string) => { - return defHttp.post({ - data: { - emailAddress: emailAddress - }, - url: Api.SendTestEmail, - }); -} diff --git a/apps/vue/src/api/text-templating/contents/index.ts b/apps/vue/src/api/text-templating/contents/index.ts index ebd2632fa..431d37a97 100644 --- a/apps/vue/src/api/text-templating/contents/index.ts +++ b/apps/vue/src/api/text-templating/contents/index.ts @@ -7,7 +7,7 @@ import { } from './model'; const remoteServiceName = 'AbpTextTemplating'; -const controllerName = 'TextTemplate'; +const controllerName = 'TextTemplateContent'; export const GetAsyncByInput = (input: TextTemplateContentGetInput) => { return defAbpHttp.request({ @@ -15,7 +15,9 @@ export const GetAsyncByInput = (input: TextTemplateContentGetInput) => { controller: controllerName, action: 'GetAsync', uniqueName: 'GetAsyncByInput', - params: input, + params: { + input: input, + }, }); }; diff --git a/apps/vue/src/api/text-templating/definitions/index.ts b/apps/vue/src/api/text-templating/definitions/index.ts index e50cb98df..e9134a9d7 100644 --- a/apps/vue/src/api/text-templating/definitions/index.ts +++ b/apps/vue/src/api/text-templating/definitions/index.ts @@ -44,7 +44,7 @@ export const GetByNameAsyncByName = (name: string) => { }; export const GetListAsyncByInput = (input: TextTemplateDefinitionGetListInput) => { - return defAbpHttp.request>({ + return defAbpHttp.request>({ service: remoteServiceName, controller: controllerName, action: 'GetListAsync', diff --git a/apps/vue/src/api/text-templating/definitions/model/index.ts b/apps/vue/src/api/text-templating/definitions/model/index.ts index 4f51c5ff8..0fe745d88 100644 --- a/apps/vue/src/api/text-templating/definitions/model/index.ts +++ b/apps/vue/src/api/text-templating/definitions/model/index.ts @@ -1,7 +1,6 @@ export interface TextTemplateDefinitionDto { name: string; displayName: string; - formatedDisplayName?: string; defaultCultureName?: string; isInlineLocalized: boolean; isLayout: boolean; @@ -27,6 +26,8 @@ export interface TextTemplateDefinitionCreateDto extends TextTemplateDefinitionC export interface TextTemplateDefinitionUpdateDto extends TextTemplateDefinitionCreateOrUpdateDto, IHasConcurrencyStamp { } -export interface TextTemplateDefinitionGetListInput extends PagedAndSortedResultRequestDto { +export interface TextTemplateDefinitionGetListInput { filter?: string; + isLayout?: boolean; + isStatic?: boolean; } \ No newline at end of file diff --git a/apps/vue/src/api/webhooks/definitions/groups/index.ts b/apps/vue/src/api/webhooks/definitions/groups/index.ts new file mode 100644 index 000000000..60f5fe1d8 --- /dev/null +++ b/apps/vue/src/api/webhooks/definitions/groups/index.ts @@ -0,0 +1,41 @@ +import { defHttp } from '/@/utils/http/axios'; +import { + WebhookGroupDefinitionDto, + WebhookGroupDefinitionCreateDto, + WebhookGroupDefinitionUpdateDto, + WebhookGroupDefinitionGetListInput, + } from './model'; + + +export const GetAsyncByName = (name: string) => { + return defHttp.get({ + url: `/api/webhooks/definitions/groups/${name}`, + }); +}; + +export const GetListAsyncByInput = (input: WebhookGroupDefinitionGetListInput) => { + return defHttp.get>({ + url: `/api/webhooks/definitions/groups`, + params: input, + }); +} + +export const CreateAsyncByInput = (input: WebhookGroupDefinitionCreateDto) => { + return defHttp.post({ + url: `/api/webhooks/definitions/groups`, + data: input, + }); +}; + +export const UpdateAsyncByNameAndInput = (name: string, input: WebhookGroupDefinitionUpdateDto) => { + return defHttp.put({ + url: `/api/webhooks/definitions/groups/${name}`, + data: input, + }); +}; + +export const DeleteAsyncByName = (name: string) => { + return defHttp.delete({ + url: `/api/webhooks/definitions/groups/${name}`, + }); +}; diff --git a/apps/vue/src/api/webhooks/definitions/groups/model/index.ts b/apps/vue/src/api/webhooks/definitions/groups/model/index.ts new file mode 100644 index 000000000..af6c24d15 --- /dev/null +++ b/apps/vue/src/api/webhooks/definitions/groups/model/index.ts @@ -0,0 +1,19 @@ +interface WebhookGroupDefinitionCreateOrUpdateDto extends IHasExtraProperties { + displayName: string; +} + +export interface WebhookGroupDefinitionCreateDto extends WebhookGroupDefinitionCreateOrUpdateDto { + name: string; +} + +export interface WebhookGroupDefinitionDto extends IHasExtraProperties { + name: string; + displayName: string; + isStatic: boolean; +} + +export interface WebhookGroupDefinitionGetListInput { + filter?: string; +} + +export type WebhookGroupDefinitionUpdateDto = WebhookGroupDefinitionCreateOrUpdateDto; diff --git a/apps/vue/src/api/webhooks/definitions/webhooks/index.ts b/apps/vue/src/api/webhooks/definitions/webhooks/index.ts new file mode 100644 index 000000000..d54a54543 --- /dev/null +++ b/apps/vue/src/api/webhooks/definitions/webhooks/index.ts @@ -0,0 +1,41 @@ +import { defHttp } from '/@/utils/http/axios'; +import { + WebhookDefinitionDto, + WebhookDefinitionCreateDto, + WebhookDefinitionUpdateDto, + WebhookDefinitionGetListInput, + } from './model'; + + +export const GetAsyncByName = (name: string) => { + return defHttp.get({ + url: `/api/webhooks/definitions/${name}`, + }); +}; + +export const GetListAsyncByInput = (input: WebhookDefinitionGetListInput) => { + return defHttp.get>({ + url: `/api/webhooks/definitions`, + params: input, + }); +} + +export const CreateAsyncByInput = (input: WebhookDefinitionCreateDto) => { + return defHttp.post({ + url: `/api/webhooks/definitions`, + data: input, + }); +}; + +export const UpdateAsyncByNameAndInput = (name: string, input: WebhookDefinitionUpdateDto) => { + return defHttp.put({ + url: `/api/webhooks/definitions/${name}`, + data: input, + }); +}; + +export const DeleteAsyncByName = (name: string) => { + return defHttp.delete({ + url: `/api/webhooks/definitions/${name}`, + }); +}; diff --git a/apps/vue/src/api/webhooks/definitions/webhooks/model/index.ts b/apps/vue/src/api/webhooks/definitions/webhooks/model/index.ts new file mode 100644 index 000000000..288b405d0 --- /dev/null +++ b/apps/vue/src/api/webhooks/definitions/webhooks/model/index.ts @@ -0,0 +1,28 @@ +interface WebhookDefinitionCreateOrUpdateDto extends IHasExtraProperties { + displayName: string; + description?: string; + isEnabled: boolean; + requiredFeatures: string[]; +} + +export interface WebhookDefinitionDto extends IHasExtraProperties { + groupName: string; + name: string; + displayName: string; + description?: string; + isEnabled: boolean; + isStatic: boolean; + requiredFeatures: string[]; +} + +export interface WebhookDefinitionCreateDto extends WebhookDefinitionCreateOrUpdateDto { + groupName: string; + name: string; +} + +export interface WebhookDefinitionGetListInput { + filter?: string; + groupName?: string; +} + +export type WebhookDefinitionUpdateDto = WebhookDefinitionCreateOrUpdateDto; \ No newline at end of file diff --git a/apps/vue/src/api/webhooks/model/sendAttemptsModel.ts b/apps/vue/src/api/webhooks/model/sendAttemptsModel.ts deleted file mode 100644 index 43c62d3e2..000000000 --- a/apps/vue/src/api/webhooks/model/sendAttemptsModel.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { HttpStatusCode } from '/@/enums/httpEnum'; - -export interface WebhookEvent { - tenantId?: string; - webhookName: string; - data: string; - creationTime: Date; -} - -export interface WebhookSendAttempt { - id: string; - tenantId?: string; - webhookEventId: string; - webhookSubscriptionId: string; - response: string; - responseStatusCode?: HttpStatusCode; - creationTime: Date; - lastModificationTime?: Date; - sendExactSameData: boolean; - requestHeaders: Record; - responseHeaders: Record; - webhookEvent: WebhookEvent; -} - -export interface WebhookSendAttemptGetListInput extends PagedAndSortedResultRequestDto { - filter?: string; - webhookEventId?: string; - subscriptionId?: string; - responseStatusCode?: HttpStatusCode; - beginCreationTime?: Date; - endCreationTime?: Date; -} diff --git a/apps/vue/src/api/webhooks/model/subscriptionsModel.ts b/apps/vue/src/api/webhooks/model/subscriptionsModel.ts deleted file mode 100644 index 52d81ee9f..000000000 --- a/apps/vue/src/api/webhooks/model/subscriptionsModel.ts +++ /dev/null @@ -1,45 +0,0 @@ -export interface WebhookSubscription extends CreationAuditedEntityDto, IHasConcurrencyStamp { - tenantId?: string; - webhookUri: string; - description?: string; - secret: string; - isActive: boolean; - webhooks: string[]; - headers: Dictionary; -} - -export interface WebhookSubscriptionCreateOrUpdate { - webhookUri: string; - description?: string; - secret: string; - isActive: boolean; - webhooks: string[]; - headers: Dictionary; -} - -export type CreateWebhookSubscription = WebhookSubscriptionCreateOrUpdate; - -export interface UpdateWebhookSubscription extends WebhookSubscriptionCreateOrUpdate , IHasConcurrencyStamp {}; - -export interface WebhookAvailable { - name: string; - displayName: string; - description: string; -} - -export interface WebhookAvailableGroup { - name: string; - displayName: string; - webhooks: WebhookAvailable[]; -} - -export interface WebhookSubscriptionGetListInput extends PagedAndSortedResultRequestDto { - filter?: string; - tenantId?: string; - webhookUri?: string; - secret?: string; - isActive?: boolean; - webhooks?: string; - beginCreationTime?: Date; - endCreationTime?: Date; -} diff --git a/apps/vue/src/api/webhooks/send-attempts.ts b/apps/vue/src/api/webhooks/send-attempts.ts deleted file mode 100644 index 72d2a837c..000000000 --- a/apps/vue/src/api/webhooks/send-attempts.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { defAbpHttp } from '/@/utils/http/abp'; -import { WebhookSendAttempt, WebhookSendAttemptGetListInput } from './model/sendAttemptsModel'; - -const remoteServiceName = 'WebhooksManagement'; -const controllerName = 'WebhookSendRecord'; - -export const getById = (id: string) => { - return defAbpHttp.request({ - service: remoteServiceName, - controller: controllerName, - action: 'GetAsync', - params: { - id: id, - }, - }); -}; - -export const deleteById = (id: string) => { - return defAbpHttp.request({ - service: remoteServiceName, - controller: controllerName, - action: 'DeleteAsync', - params: { - id: id, - }, - }); -} - -export const deleteMany = (keys: string[]) => { - return defAbpHttp.request({ - service: remoteServiceName, - controller: controllerName, - action: 'DeleteManyAsync', - uniqueName: 'DeleteManyAsyncByInput', - data: { - recordIds: keys, - }, - }); -} - -export const getList = (input: WebhookSendAttemptGetListInput) => { - return defAbpHttp.request>({ - service: remoteServiceName, - controller: controllerName, - action: 'GetListAsync', - params: { - input: input, - }, - }); -}; - -export const resend = (id: string) => { - return defAbpHttp.request({ - service: remoteServiceName, - controller: controllerName, - action: 'ResendAsync', - params: { - id: id, - }, - }); -} - -export const resendMany = (keys: string[]) => { - return defAbpHttp.request({ - service: remoteServiceName, - controller: controllerName, - action: 'ResendManyAsync', - uniqueName: 'ResendManyAsyncByInput', - data: { - recordIds: keys, - }, - }); -} diff --git a/apps/vue/src/api/webhooks/send-attempts/index.ts b/apps/vue/src/api/webhooks/send-attempts/index.ts new file mode 100644 index 000000000..fcdc98f99 --- /dev/null +++ b/apps/vue/src/api/webhooks/send-attempts/index.ts @@ -0,0 +1,46 @@ +import { defAbpHttp } from '/@/utils/http/abp'; +import { + WebhookSendAttempt, + WebhookSendAttemptGetListInput, + WebhookSendRecordDeleteManyInput, + WebhookSendRecordResendManyInput, +} from './model'; + +export const GetAsyncById = (id: string) => { + return defAbpHttp.get({ + url: `/api/webhooks/send-attempts/${id}`, + }); +}; + +export const DeleteAsyncById = (id: string) => { + return defAbpHttp.delete({ + url: `/api/webhooks/send-attempts/${id}`, + }); +}; + +export const DeleteManyAsyncByInput = (input: WebhookSendRecordDeleteManyInput) => { + return defAbpHttp.delete({ + url: `/api/webhooks/send-attempts/delete-many`, + data: input, + }); +}; + +export const GetListAsyncByInput = (input: WebhookSendAttemptGetListInput) => { + return defAbpHttp.get>({ + url: `/api/webhooks/send-attempts`, + params: input, + }); +}; + +export const ResendAsyncById = (id: string) => { + return defAbpHttp.post({ + url: `/api/webhooks/send-attempts/${id}/resend`, + }); +}; + +export const ResendManyAsyncByInput = (input: WebhookSendRecordResendManyInput) => { + return defAbpHttp.post({ + url: `/api/webhooks/send-attempts/resend-many`, + data: input, + }); +}; diff --git a/apps/vue/src/api/webhooks/send-attempts/model/index.ts b/apps/vue/src/api/webhooks/send-attempts/model/index.ts new file mode 100644 index 000000000..2cdebd406 --- /dev/null +++ b/apps/vue/src/api/webhooks/send-attempts/model/index.ts @@ -0,0 +1,40 @@ +import { HttpStatusCode } from '/@/enums/httpEnum'; + +export interface WebhookEvent { + tenantId?: string; + webhookName: string; + data: string; + creationTime: Date; +} + +export interface WebhookSendAttempt { + id: string; + tenantId?: string; + webhookEventId: string; + webhookSubscriptionId: string; + response: string; + responseStatusCode?: HttpStatusCode; + creationTime: Date; + lastModificationTime?: Date; + sendExactSameData: boolean; + requestHeaders: Record; + responseHeaders: Record; + webhookEvent: WebhookEvent; +} + +export interface WebhookSendAttemptGetListInput extends PagedAndSortedResultRequestDto { + filter?: string; + webhookEventId?: string; + subscriptionId?: string; + responseStatusCode?: HttpStatusCode; + beginCreationTime?: Date; + endCreationTime?: Date; +} + +export interface WebhookSendRecordDeleteManyInput { + recordIds: string[]; +} + +export interface WebhookSendRecordResendManyInput { + recordIds: string[]; +} diff --git a/apps/vue/src/api/webhooks/subscriptions.ts b/apps/vue/src/api/webhooks/subscriptions.ts deleted file mode 100644 index 64a31a03e..000000000 --- a/apps/vue/src/api/webhooks/subscriptions.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { defAbpHttp } from '/@/utils/http/abp'; -import { - WebhookSubscription, - WebhookAvailableGroup, - CreateWebhookSubscription, - UpdateWebhookSubscription, - WebhookSubscriptionGetListInput, -} from './model/subscriptionsModel'; - -const remoteServiceName = 'WebhooksManagement'; -const controllerName = 'WebhookSubscription'; - -export const create = (input: CreateWebhookSubscription) => { - return defAbpHttp.request({ - service: remoteServiceName, - controller: controllerName, - action: 'CreateAsync', - data: input, - }); -}; - -export const update = (id: string, input: UpdateWebhookSubscription) => { - return defAbpHttp.request({ - service: remoteServiceName, - controller: controllerName, - action: 'UpdateAsync', - data: input, - params: { - id: id, - }, - }); -}; - -export const getById = (id: string) => { - return defAbpHttp.request({ - service: remoteServiceName, - controller: controllerName, - action: 'GetAsync', - params: { - id: id, - }, - }); -}; - -export const deleteById = (id: string) => { - return defAbpHttp.request({ - service: remoteServiceName, - controller: controllerName, - action: 'DeleteAsync', - params: { - id: id, - }, - }); -}; - -export const deleteMany = (keys: string[]) => { - return defAbpHttp.request({ - service: remoteServiceName, - controller: controllerName, - action: 'DeleteManyAsync', - uniqueName: 'DeleteManyAsyncByInput', - data: { - recordIds: keys, - }, - }); -}; - -export const getList = (input: WebhookSubscriptionGetListInput) => { - return defAbpHttp.request>({ - service: remoteServiceName, - controller: controllerName, - action: 'GetListAsync', - params: { - input: input, - }, - }); -}; - -export const getAllAvailableWebhooks = () => { - return defAbpHttp.request>({ - service: remoteServiceName, - controller: controllerName, - action: 'GetAllAvailableWebhooksAsync', - }); -}; diff --git a/apps/vue/src/api/webhooks/subscriptions/index.ts b/apps/vue/src/api/webhooks/subscriptions/index.ts new file mode 100644 index 000000000..e0793e602 --- /dev/null +++ b/apps/vue/src/api/webhooks/subscriptions/index.ts @@ -0,0 +1,55 @@ +import { defAbpHttp } from '/@/utils/http/abp'; +import { + WebhookSubscription, + WebhookAvailableGroup, + CreateWebhookSubscription, + UpdateWebhookSubscription, + WebhookSubscriptionGetListInput, + WebhookSubscriptionDeleteManyInput, +} from './model'; + +export const CreateAsyncByInput = (input: CreateWebhookSubscription) => { + return defAbpHttp.post({ + url: `/api/webhooks/subscriptions`, + data: input, + }); +}; + +export const UpdateAsyncByIdAndInput = (id: string, input: UpdateWebhookSubscription) => { + return defAbpHttp.put({ + url: `/api/webhooks/subscriptions/${id}`, + data: input, + }); +}; + +export const GetAsyncById = (id: string) => { + return defAbpHttp.get({ + url: `/api/webhooks/subscriptions/${id}`, + }); +}; + +export const DeleteAsyncById = (id: string) => { + return defAbpHttp.delete({ + url: `/api/webhooks/subscriptions/${id}`, + }); +}; + +export const DeleteManyAsyncByInput = (input: WebhookSubscriptionDeleteManyInput) => { + return defAbpHttp.delete({ + url: `/api/webhooks/subscriptions/delete-many`, + data: input, + }); +}; + +export const GetListAsyncByInput = (input: WebhookSubscriptionGetListInput) => { + return defAbpHttp.get>({ + url: `/api/webhooks/subscriptions`, + params: input, + }); +}; + +export const GetAllAvailableWebhooksAsync = () => { + return defAbpHttp.get>({ + url: `/api/webhooks/subscriptions/availables`, + }); +}; diff --git a/apps/vue/src/api/webhooks/subscriptions/model/index.ts b/apps/vue/src/api/webhooks/subscriptions/model/index.ts new file mode 100644 index 000000000..15ef8d5fb --- /dev/null +++ b/apps/vue/src/api/webhooks/subscriptions/model/index.ts @@ -0,0 +1,49 @@ +export interface WebhookSubscription extends CreationAuditedEntityDto, IHasConcurrencyStamp { + tenantId?: string; + webhookUri: string; + description?: string; + secret: string; + isActive: boolean; + webhooks: string[]; + headers: Dictionary; +} + +export interface WebhookSubscriptionCreateOrUpdate { + webhookUri: string; + description?: string; + secret: string; + isActive: boolean; + webhooks: string[]; + headers: Dictionary; +} + +export type CreateWebhookSubscription = WebhookSubscriptionCreateOrUpdate; + +export interface UpdateWebhookSubscription extends WebhookSubscriptionCreateOrUpdate , IHasConcurrencyStamp {}; + +export interface WebhookAvailable { + name: string; + displayName: string; + description: string; +} + +export interface WebhookAvailableGroup { + name: string; + displayName: string; + webhooks: WebhookAvailable[]; +} + +export interface WebhookSubscriptionGetListInput extends PagedAndSortedResultRequestDto { + filter?: string; + tenantId?: string; + webhookUri?: string; + secret?: string; + isActive?: boolean; + webhooks?: string; + beginCreationTime?: Date; + endCreationTime?: Date; +} + +export interface WebhookSubscriptionDeleteManyInput { + recordIds: string[]; +} diff --git a/apps/vue/src/components/Abp/ExtraPropertyDictionary/ExtraPropertyDictionary.vue b/apps/vue/src/components/Abp/ExtraPropertyDictionary/ExtraPropertyDictionary.vue new file mode 100644 index 000000000..060bcf918 --- /dev/null +++ b/apps/vue/src/components/Abp/ExtraPropertyDictionary/ExtraPropertyDictionary.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/apps/vue/src/components/Abp/ExtraPropertyDictionary/index.ts b/apps/vue/src/components/Abp/ExtraPropertyDictionary/index.ts new file mode 100644 index 000000000..5d0b25b39 --- /dev/null +++ b/apps/vue/src/components/Abp/ExtraPropertyDictionary/index.ts @@ -0,0 +1,3 @@ +import ExtraPropertyDictionary from './ExtraPropertyDictionary.vue'; + +export { ExtraPropertyDictionary }; diff --git a/apps/vue/src/components/Abp/FeatureModal/hooks/useFeatures.ts b/apps/vue/src/components/Abp/FeatureModal/hooks/useFeatures.ts new file mode 100644 index 000000000..e159f7929 --- /dev/null +++ b/apps/vue/src/components/Abp/FeatureModal/hooks/useFeatures.ts @@ -0,0 +1,145 @@ +import type { Ref } from 'vue'; + +import { watch, ref, unref } from 'vue'; +import { message } from 'ant-design-vue'; +import { useLocalization } from '/@/hooks/abp/useLocalization'; +import { useValidation } from '/@/hooks/abp/useValidation'; +import { FeatureGroup } from '/@/api/feature-management/features/model'; +import { GetByProvider, UpdateByProvider } from '/@/api/feature-management/features'; +import { ReturnInnerMethods } from '/@/components/Modal'; + +interface UseFeature { + providerName: Ref; + providerKey: Ref; + formRel: Ref; + modalMethods: ReturnInnerMethods; +} + +export function useFeatures({ providerName, providerKey, formRel, modalMethods }: UseFeature) { + const { L } = useLocalization('AbpFeatureManagement'); + const { ruleCreator } = useValidation(); + const featureGroup = ref<{ groups: FeatureGroup[] }>({ + groups: [], + }); + const featureGroupKey = ref(0); + + watch( + () => unref(providerKey), + (key) => { + if (key !== undefined) { + const form = unref(formRel); + form.resetFields(); + onGroupChange(0); + GetByProvider({ + providerName: unref(providerName), + providerKey: key, + }).then((res) => { + featureGroup.value.groups = mapFeatures(res.groups); + }); + } + }, + ); + + function getFeatures(groups: FeatureGroup[]) { + const features: { name: string; value: string }[] = []; + groups.forEach((g) => { + g.features.forEach((f) => { + if (f.value !== null) { + features.push({ + name: f.name, + value: String(f.value), + }); + } + }); + }); + return features; + } + + function mapFeatures(groups: FeatureGroup[]) { + groups.forEach((g) => { + g.features.forEach((f) => { + switch (f.valueType?.validator.name) { + case 'BOOLEAN': + f.value = String(f.value).toLocaleLowerCase() === 'true'; + break; + case 'NUMERIC': + f.value = Number(f.value); + break; + } + }); + }); + return groups; + } + + function validator(field: string, validator: Validator) { + const featureRules: { [key: string]: any }[] = new Array<{ [key: string]: any }>(); + if (validator.properties) { + switch (validator.name) { + case 'NUMERIC': + featureRules.push( + ...ruleCreator.fieldMustBeetWeen({ + name: field, + start: Number(validator.properties.MinValue), + end: Number(validator.properties.MaxValue), + trigger: 'change', + }), + ); + break; + case 'STRING': + if ( + validator.properties.AllowNull && + validator.properties.AllowNull.toLowerCase() === 'true' + ) { + featureRules.push( + ...ruleCreator.fieldRequired({ + name: field, + trigger: 'blur', + }), + ); + } + featureRules.push( + ...ruleCreator.fieldMustBeStringWithMinimumLengthAndMaximumLength({ + name: field, + minimum: Number(validator.properties.MinValue), + maximum: Number(validator.properties.MaxValue), + trigger: 'blur', + }), + ); + break; + default: + break; + } + } + return featureRules; + } + + function onGroupChange(activeKey) { + featureGroupKey.value = activeKey; + } + + function handleSubmit() { + const form = unref(formRel); + form.validate().then(() => { + UpdateByProvider( + { + providerName: unref(providerName), + providerKey: unref(providerKey), + }, + { + features: getFeatures(unref(featureGroup).groups), + }, + ).then(() => { + modalMethods.closeModal(); + message.success(L('Successful')); + }); + }); + } + + return { + featureGroup, + featureGroupKey, + validator, + handleSubmit, + onGroupChange, + }; +} diff --git a/apps/vue/src/views/feature/index.ts b/apps/vue/src/components/Abp/FeatureModal/index.ts similarity index 100% rename from apps/vue/src/views/feature/index.ts rename to apps/vue/src/components/Abp/FeatureModal/index.ts diff --git a/apps/vue/src/components/Abp/FeatureModal/src/FeatureModal.vue b/apps/vue/src/components/Abp/FeatureModal/src/FeatureModal.vue new file mode 100644 index 000000000..3d1c3b6a1 --- /dev/null +++ b/apps/vue/src/components/Abp/FeatureModal/src/FeatureModal.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/apps/vue/src/components/Abp/LocalizableInput/LocalizableInput.vue b/apps/vue/src/components/Abp/LocalizableInput/LocalizableInput.vue new file mode 100644 index 000000000..2761ad6d0 --- /dev/null +++ b/apps/vue/src/components/Abp/LocalizableInput/LocalizableInput.vue @@ -0,0 +1,171 @@ + + + + + \ No newline at end of file diff --git a/apps/vue/src/components/Abp/LocalizableInput/index.ts b/apps/vue/src/components/Abp/LocalizableInput/index.ts new file mode 100644 index 000000000..20e36d69d --- /dev/null +++ b/apps/vue/src/components/Abp/LocalizableInput/index.ts @@ -0,0 +1,3 @@ +import LocalizableInput from './LocalizableInput.vue'; + +export { LocalizableInput }; diff --git a/apps/vue/src/components/Abp/LocalizableInput/props.ts b/apps/vue/src/components/Abp/LocalizableInput/props.ts new file mode 100644 index 000000000..e147f5c79 --- /dev/null +++ b/apps/vue/src/components/Abp/LocalizableInput/props.ts @@ -0,0 +1,9 @@ +export interface Props { + resources: string[], + value: string, +} + +export interface Resource { + name: string, + value: string, +} diff --git a/apps/vue/src/components/Abp/SimpleStateChecking/SimpleStateChecking.vue b/apps/vue/src/components/Abp/SimpleStateChecking/SimpleStateChecking.vue new file mode 100644 index 000000000..bae57c7d8 --- /dev/null +++ b/apps/vue/src/components/Abp/SimpleStateChecking/SimpleStateChecking.vue @@ -0,0 +1,305 @@ + + + + + \ No newline at end of file diff --git a/apps/vue/src/components/Abp/SimpleStateChecking/index.ts b/apps/vue/src/components/Abp/SimpleStateChecking/index.ts new file mode 100644 index 000000000..53fcdbb14 --- /dev/null +++ b/apps/vue/src/components/Abp/SimpleStateChecking/index.ts @@ -0,0 +1,6 @@ +import SimpleStateChecking from './SimpleStateChecking.vue'; +import { SimplaCheckStateBase } from './typing'; +import { PermissionState } from './src/permissions'; + +export { SimplaCheckStateBase, PermissionState }; +export { SimpleStateChecking }; \ No newline at end of file diff --git a/apps/vue/src/components/Abp/SimpleStateChecking/src/features/RequireFeaturesSimpleStateChecker.vue b/apps/vue/src/components/Abp/SimpleStateChecking/src/features/RequireFeaturesSimpleStateChecker.vue new file mode 100644 index 000000000..58145116d --- /dev/null +++ b/apps/vue/src/components/Abp/SimpleStateChecking/src/features/RequireFeaturesSimpleStateChecker.vue @@ -0,0 +1,151 @@ + + + + + \ No newline at end of file diff --git a/apps/vue/src/components/Abp/SimpleStateChecking/src/features/index.ts b/apps/vue/src/components/Abp/SimpleStateChecking/src/features/index.ts new file mode 100644 index 000000000..b38e00c32 --- /dev/null +++ b/apps/vue/src/components/Abp/SimpleStateChecking/src/features/index.ts @@ -0,0 +1,3 @@ +import RequireFeaturesSimpleStateChecker from './RequireFeaturesSimpleStateChecker.vue'; + +export { RequireFeaturesSimpleStateChecker }; \ No newline at end of file diff --git a/apps/vue/src/components/Abp/SimpleStateChecking/src/globalFeatures/RequireGlobalFeaturesSimpleStateChecker.vue b/apps/vue/src/components/Abp/SimpleStateChecking/src/globalFeatures/RequireGlobalFeaturesSimpleStateChecker.vue new file mode 100644 index 000000000..b79dc8610 --- /dev/null +++ b/apps/vue/src/components/Abp/SimpleStateChecking/src/globalFeatures/RequireGlobalFeaturesSimpleStateChecker.vue @@ -0,0 +1,90 @@ +