diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ecc93e9d..97a1fb30 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,13 +25,13 @@ jobs: if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Enable corepack run: corepack enable - name: Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'yarn' diff --git a/package.json b/package.json index dc89f3c0..446ae462 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "adam-admin", - "packageManager": "yarn@4.1.0", + "packageManager": "yarn@4.1.1", "license": "Apache-2.0", "version": "0.0.1", "scripts": { @@ -21,60 +21,60 @@ "cy:open": "CYPRESS_CACHE_FOLDER='node_modules/.cache/Cypress' yarn cypress open -C cypress/config/cypress.config.ts" }, "dependencies": { - "@anzusystems/common-admin": "1.47.0-alpha18", + "@anzusystems/common-admin": "1.47.0-alpha49", "@mdi/font": "7.4.47", "@vuelidate/core": "^2.0.3", "@vuelidate/validators": "^2.0.4", - "@vueuse/core": "10.7.2", - "@vueuse/integrations": "10.7.2", - "axios": "^1.6.7", + "@vueuse/core": "10.9.0", + "@vueuse/integrations": "10.9.0", + "axios": "^1.6.8", "cropperjs": "^1.6.1", "jwt-decode": "^4.0.0", "pinia": "^2.1.7", "rusha": "^0.8.14", - "socket.io-client": "^4.7.4", + "socket.io-client": "^4.7.5", "sortablejs": "^1.15.2", - "universal-cookie": "^7.0.2", + "universal-cookie": "^7.1.4", "uuid": "^9.0.1", - "vue": "3.4.17", - "vue-i18n": "^9.9.1", - "vue-router": "^4.2.5", - "vuetify": "^3.5.3" + "vue": "3.4.21", + "vue-i18n": "^9.12.0", + "vue-router": "^4.3.0", + "vuetify": "^3.5.15" }, "devDependencies": { "@cypress/grep": "^4.0.1", - "@intlify/unplugin-vue-i18n": "^2.0.0", - "@rushstack/eslint-patch": "^1.7.2", - "@stylistic/eslint-plugin": "^1.6.1", - "@tsconfig/node18": "^18.2.2", - "@types/node": "^20.11.17", + "@intlify/unplugin-vue-i18n": "^4.0.0", + "@rushstack/eslint-patch": "^1.10.2", + "@stylistic/eslint-plugin": "^1.7.0", + "@tsconfig/node18": "^18.2.4", + "@types/node": "^20.12.7", "@types/rusha": "^0.8.3", - "@types/sortablejs": "^1.15.7", + "@types/sortablejs": "^1.15.8", "@types/uuid": "^9.0.8", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/parser": "^7.6.0", "@vitejs/plugin-vue": "^5.0.4", "@vue/eslint-config-prettier": "^9.0.0", - "@vue/eslint-config-typescript": "^12.0.0", + "@vue/eslint-config-typescript": "^13.0.0", "@vue/language-server": "^1.8.27", "@vue/language-service": "^1.8.27", "@vue/tsconfig": "^0.5.1", - "cypress": "^13.7.0", + "cypress": "^13.7.3", "cypress-downloadfile": "1.2.3", - "cypress-mochawesome-reporter": "^3.8.1", - "eslint": "8.56.0", + "cypress-mochawesome-reporter": "^3.8.2", + "eslint": "8.57.0", "eslint-plugin-cypress": "^2.15.1", - "eslint-plugin-vue": "^9.21.1", + "eslint-plugin-vue": "^9.24.1", "npm-run-all": "^4.1.5", - "postcss": "^8.4.35", + "postcss": "^8.4.38", "postcss-html": "^1.6.0", "prettier": "^3.2.5", - "sass": "^1.70.0", - "stylelint": "^16.2.1", + "sass": "^1.75.0", + "stylelint": "^16.3.1", "stylelint-config-recommended-vue": "^1.5.0", - "stylelint-config-standard-scss": "^13.0.0", - "typescript": "~5.3.3", - "vite": "^5.1.1", - "vite-plugin-vuetify": "^2.0.1", - "vue-tsc": "1.8.27" + "stylelint-config-standard-scss": "^13.1.0", + "typescript": "~5.4.5", + "vite": "^5.2.8", + "vite-plugin-vuetify": "^2.0.3", + "vue-tsc": "2.0.7" } } diff --git a/src/components/system/sidebar/SidebarMain.vue b/src/components/system/sidebar/SidebarMain.vue index fc57ea43..aaa28fc9 100644 --- a/src/components/system/sidebar/SidebarMain.vue +++ b/src/components/system/sidebar/SidebarMain.vue @@ -65,6 +65,14 @@ const { t } = useI18n() data-cy="asset-licence-settings" /> + + + + + + + {{ t('sidebar.settings.assetLicenceGroups') }} + + + { + return { + id: 0, + name: '', + extSystem: null, + licences: [], + createdAt: dateTimeNow(), + modifiedAt: dateTimeNow(), + createdBy: 0, + modifiedBy: 0, + _resourceName: ENTITY, + _system: SYSTEM_CORE_DAM, + } + } + + return { + createDefault, + } +} diff --git a/src/model/coreDam/factory/UserFactory.ts b/src/model/coreDam/factory/UserFactory.ts index 56d20859..674421c3 100644 --- a/src/model/coreDam/factory/UserFactory.ts +++ b/src/model/coreDam/factory/UserFactory.ts @@ -21,6 +21,7 @@ export function useUserFactory() { permissionGroups: [], permissions: {}, resolvedPermissions: {}, + licenceGroups: [], assetLicences: [], enabled: true, createdAt: dateTimeNow(), @@ -43,6 +44,7 @@ export function useUserFactory() { adminToExtSystems: user.adminToExtSystems, userToExtSystems: [], assetLicences: user.assetLicences, + licenceGroups: user.licenceGroups, allowedAssetExternalProviders: user.allowedAssetExternalProviders, allowedDistributionServices: user.allowedDistributionServices, } diff --git a/src/model/coreDam/filter/AssetLicenceGroupFilter.ts b/src/model/coreDam/filter/AssetLicenceGroupFilter.ts new file mode 100644 index 00000000..bcb5422d --- /dev/null +++ b/src/model/coreDam/filter/AssetLicenceGroupFilter.ts @@ -0,0 +1,16 @@ +import { makeFilterHelper } from '@anzusystems/common-admin' +import { reactive } from 'vue' +import { SYSTEM_CORE_DAM } from '@/model/systems' +import { ENTITY } from '@/services/api/coreDam/assetLicenceGroupApi' + +const makeFilter = makeFilterHelper(SYSTEM_CORE_DAM, ENTITY) + +const filter = reactive({ + id: { + ...makeFilter({ name: 'id' }), + }, +}) + +export function useAssetLicenceGroupListFilter() { + return filter +} diff --git a/src/router/index.ts b/src/router/index.ts index 1deb5e8d..567037b7 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -19,6 +19,7 @@ import { videoShowRoutes } from '@/router/routes/coreDam/videoShow' import { jobRoutes } from '@/router/routes/coreDam/job' import HomepageView from '@/views/system/HomepageView.vue' import { ANotFoundView } from '@anzusystems/common-admin' +import { assetLicenceGroupRoutes } from '@/router/routes/coreDam/assetLicenceGroup' const vueRouter = createRouter({ history: createWebHistory(), @@ -38,6 +39,7 @@ const vueRouter = createRouter({ ...userRoutes, ...extSystemRoutes, ...assetLicenceRoutes, + ...assetLicenceGroupRoutes, ...permissionGroupRoutes, ...anzuUserRoutes, ...authorRoutes, diff --git a/src/router/routes.ts b/src/router/routes.ts index 486e6f80..dae49147 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -46,6 +46,11 @@ const routes = { DETAIL: 'assetLicence_detail', EDIT: 'assetLicence_edit', }, + ASSET_LICENCE_GROUP: { + LIST: 'assetLicenceGroup_list', + DETAIL: 'assetLicenceGroup_detail', + EDIT: 'assetLicenceGroup_edit', + }, AUTHOR: { LIST: 'author_list', DETAIL: 'author_detail', diff --git a/src/router/routes/coreDam/assetLicenceGroup.ts b/src/router/routes/coreDam/assetLicenceGroup.ts new file mode 100644 index 00000000..8226b65c --- /dev/null +++ b/src/router/routes/coreDam/assetLicenceGroup.ts @@ -0,0 +1,51 @@ +import { ROUTE } from '@/router/routes' +import { ACL } from '@/types/Permission' +import type { RouteRecordRaw } from 'vue-router' +import { AEmptyRouterView } from '@anzusystems/common-admin' + +export const assetLicenceGroupRoutes: RouteRecordRaw[] = [ + { + path: '/asset-licence-group', + component: AEmptyRouterView, + meta: { + requiresAuth: true, + requiredPermissions: [], + layout: 'AppLayoutDrawer', + breadcrumbT: 'breadcrumb.coreDam.assetLicenceGroup.list', + }, + children: [ + { + path: '', + name: ROUTE.DAM.ASSET_LICENCE_GROUP.LIST, + component: () => import('@/views/coreDam/assetLicenceGroup/AssetLicenceGroupListView.vue'), + meta: { + requiresAuth: true, + requiredPermissions: [ACL.DAM_ASSET_LICENCE_GROUP_VIEW], + layout: 'AppLayoutDrawer', + }, + }, + { + path: ':id(\\d+)/edit', + name: ROUTE.DAM.ASSET_LICENCE_GROUP.EDIT, + component: () => import('@/views/coreDam/assetLicenceGroup/AssetLicenceGroupEditView.vue'), + meta: { + requiresAuth: true, + requiredPermissions: [ACL.DAM_ASSET_LICENCE_GROUP_VIEW, ACL.DAM_ASSET_LICENCE_GROUP_UPDATE], + layout: 'AppLayoutDrawer', + breadcrumbT: 'breadcrumb.coreDam.assetLicenceGroup.edit', + }, + }, + { + path: ':id(\\d+)', + name: ROUTE.DAM.ASSET_LICENCE_GROUP.DETAIL, + component: () => import('@/views/coreDam/assetLicenceGroup/AssetLicenceGroupDetailView.vue'), + meta: { + requiresAuth: true, + requiredPermissions: [ACL.DAM_ASSET_LICENCE_GROUP_VIEW], + layout: 'AppLayoutDrawer', + breadcrumbT: 'breadcrumb.coreDam.assetLicenceGroup.detail', + }, + }, + ], + }, +] diff --git a/src/services/api/coreDam/assetLicenceGroupApi.ts b/src/services/api/coreDam/assetLicenceGroupApi.ts new file mode 100644 index 00000000..eb6d9b2f --- /dev/null +++ b/src/services/api/coreDam/assetLicenceGroupApi.ts @@ -0,0 +1,21 @@ +import { damClient } from '@/services/api/clients/damClient' +import { SYSTEM_CORE_DAM } from '@/model/systems' +import { + apiCreateOne, + apiFetchOne, + apiUpdateOne, + type DamAssetLicenceGroup, + type IntegerId, +} from '@anzusystems/common-admin' + +const END_POINT = '/adm/v1/asset-licence-group' +export const ENTITY = 'assetLicenceGroup' + +export const createAssetLicenceGroup = (data: DamAssetLicenceGroup) => + apiCreateOne(damClient, data, END_POINT, {}, SYSTEM_CORE_DAM, ENTITY) + +export const updateAssetLicenceGroup = (id: IntegerId, data: DamAssetLicenceGroup) => + apiUpdateOne(damClient, data, END_POINT + '/:id', { id }, SYSTEM_CORE_DAM, ENTITY) + +export const fetchAssetLicenceGroup = (id: IntegerId) => + apiFetchOne(damClient, END_POINT + '/:id', { id }, SYSTEM_CORE_DAM, ENTITY) diff --git a/src/stores/coreDam/assetLicenceGroupStore.ts b/src/stores/coreDam/assetLicenceGroupStore.ts new file mode 100644 index 00000000..c517d90f --- /dev/null +++ b/src/stores/coreDam/assetLicenceGroupStore.ts @@ -0,0 +1,23 @@ +import { acceptHMRUpdate, defineStore } from 'pinia' +import { useAssetLicenceGroupFactory } from '@/model/coreDam/factory/AssetLicenceGroupFactory' +import { ref } from 'vue' +import type { DamAssetLicenceGroup } from '@anzusystems/common-admin' + +export const useAssetLicenceGroupOneStore = defineStore('assetLicenceGroupOneStore', () => { + const { createDefault } = useAssetLicenceGroupFactory() + + const assetLicenceGroup = ref(createDefault()) + + function reset() { + assetLicenceGroup.value = createDefault() + } + + return { + assetLicenceGroup, + reset + } +}) + +if (import.meta.hot) { + import.meta.hot.accept(acceptHMRUpdate(useAssetLicenceGroupOneStore, import.meta.hot)) +} diff --git a/src/stores/coreDam/userStore.ts b/src/stores/coreDam/userStore.ts index 6d89fdb0..4cfe0646 100644 --- a/src/stores/coreDam/userStore.ts +++ b/src/stores/coreDam/userStore.ts @@ -1,29 +1,33 @@ -import type { DamUser, DamUserUpdateDto } from '@anzusystems/common-admin' +import type { DamAssetLicenceGroup, DamUser, DamUserUpdateDto } from '@anzusystems/common-admin' import { useUserFactory } from '@/model/coreDam/factory/UserFactory' import { acceptHMRUpdate, defineStore } from 'pinia' +import { ref } from 'vue' -const { createDefault, createDefaultForUpdate } = useUserFactory() +export const useUserOneStore = defineStore('damUserOneStore', () => { + const { createDefault, createDefaultForUpdate } = useUserFactory() -interface State { - user: DamUser - userUpdate: DamUserUpdateDto -} + const user = ref(createDefault()) + const userUpdate = ref(createDefaultForUpdate(createDefault())) + const userAssetLicenceGroups = ref([]) + + function setUser(userNew: DamUser) { + user.value = userNew + userUpdate.value = createDefaultForUpdate(userNew) + } + + function reset() { + user.value = createDefault() + userUpdate.value = createDefaultForUpdate(user.value) + userAssetLicenceGroups.value = [] + } -export const useUserOneStore = defineStore('damUserOneStore', { - state: (): State => ({ - user: createDefault(), - userUpdate: createDefaultForUpdate(createDefault()), - }), - actions: { - setUser(user: DamUser) { - this.user = user - this.userUpdate = createDefaultForUpdate(user) - }, - reset() { - this.user = createDefault() - this.userUpdate = createDefaultForUpdate(this.user) - }, - }, + return { + user, + userUpdate, + userAssetLicenceGroups, + setUser, + reset, + } }) if (import.meta.hot) { diff --git a/src/types/Permission.ts b/src/types/Permission.ts index 3a49e069..1b57a48d 100644 --- a/src/types/Permission.ts +++ b/src/types/Permission.ts @@ -34,6 +34,10 @@ export const ACL = { DAM_ASSET_LICENCE_UPDATE: 'dam_assetLicence_update', DAM_ASSET_LICENCE_VIEW: 'dam_assetLicence_view', DAM_ASSET_LICENCE_LIST: 'dam_assetLicence_list', + DAM_ASSET_LICENCE_GROUP_CREATE: 'dam_assetLicenceGroup_create', + DAM_ASSET_LICENCE_GROUP_UPDATE: 'dam_assetLicenceGroup_update', + DAM_ASSET_LICENCE_GROUP_VIEW: 'dam_assetLicenceGroup_view', + DAM_ASSET_LICENCE_GROUP_LIST: 'dam_assetLicenceGroup_list', DAM_USER_VIEW: 'dam_user_view', DAM_USER_CREATE: 'dam_user_create', DAM_USER_UPDATE: 'dam_user_update', @@ -81,6 +85,7 @@ export const ACL = { DAM_PERMISSION_GROUP_UI: 'dam_permissionGroup_ui', DAM_EXT_SYSTEM_UI: 'dam_extSystem_ui', DAM_ASSET_LICENCE_UI: 'dam_assetLicence_ui', + DAM_ASSET_LICENCE_GROUP_UI: 'dam_assetLicenceGroup_ui', DAM_AUTHOR_UI: 'dam_author_ui', DAM_KEYWORD_UI: 'dam_keyword_ui', DAM_DISTRIBUTION_CATEGORY_UI: 'dam_distributionCategory_ui', diff --git a/src/views/coreDam/asset/components/ImagePreview.vue b/src/views/coreDam/asset/components/ImagePreview.vue index d43574e1..52880b32 100644 --- a/src/views/coreDam/asset/components/ImagePreview.vue +++ b/src/views/coreDam/asset/components/ImagePreview.vue @@ -13,7 +13,7 @@ import { computed, ref, watch } from 'vue' import placeholder16x9 from '@/assets/image/placeholder16x9.jpg' import { fetchImageFile } from '@/services/api/coreDam/imageApi' import { useI18n } from 'vue-i18n' -import { useCurrentAssetLicence, useCurrentExtSystem } from '@/composables/system/currentExtSystem' +import { useCurrentAssetLicence } from '@/composables/system/currentExtSystem' const props = withDefaults( defineProps<{ @@ -47,7 +47,6 @@ const fetchImage = async (id: DocId) => { } const { currentAssetLicenceId } = useCurrentAssetLicence() -const { currentExtSystemId } = useCurrentExtSystem() const imagePreviewModel = computed({ get() { @@ -179,13 +178,7 @@ watch( {{ t('system.imagePreview.actions.unassign') }} diff --git a/src/views/coreDam/assetLicenceGroup/AssetLicenceGroupDetailView.vue b/src/views/coreDam/assetLicenceGroup/AssetLicenceGroupDetailView.vue new file mode 100644 index 00000000..d5bad703 --- /dev/null +++ b/src/views/coreDam/assetLicenceGroup/AssetLicenceGroupDetailView.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/views/coreDam/assetLicenceGroup/AssetLicenceGroupEditView.vue b/src/views/coreDam/assetLicenceGroup/AssetLicenceGroupEditView.vue new file mode 100644 index 00000000..c7a46e8a --- /dev/null +++ b/src/views/coreDam/assetLicenceGroup/AssetLicenceGroupEditView.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/views/coreDam/assetLicenceGroup/AssetLicenceGroupListView.vue b/src/views/coreDam/assetLicenceGroup/AssetLicenceGroupListView.vue new file mode 100644 index 00000000..8f819ade --- /dev/null +++ b/src/views/coreDam/assetLicenceGroup/AssetLicenceGroupListView.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupCreateButton.vue b/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupCreateButton.vue new file mode 100644 index 00000000..c82657fd --- /dev/null +++ b/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupCreateButton.vue @@ -0,0 +1,104 @@ + + + diff --git a/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupDatatable.vue b/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupDatatable.vue new file mode 100644 index 00000000..c1fdd49c --- /dev/null +++ b/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupDatatable.vue @@ -0,0 +1,142 @@ + + + diff --git a/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupDetail.vue b/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupDetail.vue new file mode 100644 index 00000000..8d7c86e3 --- /dev/null +++ b/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupDetail.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupEditForm.vue b/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupEditForm.vue new file mode 100644 index 00000000..c62b90fb --- /dev/null +++ b/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupEditForm.vue @@ -0,0 +1,66 @@ + + + diff --git a/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupFilter.vue b/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupFilter.vue new file mode 100644 index 00000000..93eb7b91 --- /dev/null +++ b/src/views/coreDam/assetLicenceGroup/components/AssetLicenceGroupFilter.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/views/coreDam/assetLicenceGroup/composables/assetLicenceGroupActions.ts b/src/views/coreDam/assetLicenceGroup/composables/assetLicenceGroupActions.ts new file mode 100644 index 00000000..5f5ffdbd --- /dev/null +++ b/src/views/coreDam/assetLicenceGroup/composables/assetLicenceGroupActions.ts @@ -0,0 +1,132 @@ +import { ref } from 'vue' +import type { DamAssetLicenceGroup, FilterBag, Pagination } from '@anzusystems/common-admin' +import { fetchDamAssetLicenceGroupList, useAlerts } from '@anzusystems/common-admin' +import { useAssetLicenceGroupOneStore } from '@/stores/coreDam/assetLicenceGroupStore' +import { storeToRefs } from 'pinia' +import { fetchAssetLicenceGroup, updateAssetLicenceGroup } from '@/services/api/coreDam/assetLicenceGroupApi' +import useVuelidate from '@vuelidate/core' +import { useRouter } from 'vue-router' +import { ROUTE } from '@/router/routes' +import { useCachedAssetLicences } from '@/views/coreDam/assetLicence/composables/cachedAssetLicences' +import { useCachedExtSystems } from '@/views/coreDam/extSystem/composables/cachedExtSystems' +import { damClient } from '@/services/api/clients/damClient' + +const { showValidationError, showRecordWas, showErrorsDefault } = useAlerts() + +const datatableHiddenColumns = ref>(['id']) +const listLoading = ref(false) +const detailLoading = ref(false) +const saveButtonLoading = ref(false) +const saveAndCloseButtonLoading = ref(false) + +export const useAssetLicenceGroupListActions = () => { + const listItems = ref([]) + const { addToCachedAssetLicences, fetchCachedAssetLicences } = useCachedAssetLicences() + const { addToCachedExtSystems, fetchCachedExtSystems } = useCachedExtSystems() + + const fetchList = async (pagination: Pagination, filterBag: FilterBag) => { + listLoading.value = true + try { + const res = await fetchDamAssetLicenceGroupList(damClient, pagination, filterBag) + res.forEach((item) => { + addToCachedAssetLicences(item.licences) + addToCachedExtSystems(item.extSystem) + }) + listItems.value = res + fetchCachedAssetLicences() + fetchCachedExtSystems() + } catch (error) { + showErrorsDefault(error) + } finally { + listLoading.value = false + } + } + + return { + datatableHiddenColumns, + listLoading, + listItems, + fetchList, + } +} + +export const useAssetLicenceGroupDetailActions = () => { + const assetLicenceGroupOneStore = useAssetLicenceGroupOneStore() + const { assetLicenceGroup } = storeToRefs(assetLicenceGroupOneStore) + const { addToCachedAssetLicences, fetchCachedAssetLicences } = useCachedAssetLicences() + const { addToCachedExtSystems, fetchCachedExtSystems } = useCachedExtSystems() + + const fetchData = async (id: number) => { + detailLoading.value = true + try { + const res= await fetchAssetLicenceGroup(id) + addToCachedAssetLicences(res.licences) + addToCachedExtSystems(res.extSystem) + assetLicenceGroup.value = res + fetchCachedAssetLicences() + fetchCachedExtSystems() + } catch (error) { + showErrorsDefault(error) + } finally { + detailLoading.value = false + } + } + + return { + assetLicenceGroup, + detailLoading, + fetchData, + resetStore: assetLicenceGroupOneStore.reset, + } +} + +export const useAssetLicenceGroupEditActions = () => { + const v$ = useVuelidate() + const router = useRouter() + const assetLicenceGroupOneStore = useAssetLicenceGroupOneStore() + const { assetLicenceGroup } = storeToRefs(assetLicenceGroupOneStore) + + const fetchData = async (id: number) => { + detailLoading.value = true + try { + assetLicenceGroup.value = await fetchAssetLicenceGroup(id) + } catch (error) { + showErrorsDefault(error) + } finally { + detailLoading.value = false + } + } + + const onUpdate = async (close = false) => { + try { + close ? (saveAndCloseButtonLoading.value = true) : (saveButtonLoading.value = true) + v$.value.$touch() + if (v$.value.$invalid) { + showValidationError() + saveButtonLoading.value = false + saveAndCloseButtonLoading.value = false + return + } + await updateAssetLicenceGroup(assetLicenceGroupOneStore.assetLicenceGroup.id, assetLicenceGroup.value) + showRecordWas('updated') + if (!close) return + router.push({ name: ROUTE.DAM.ASSET_LICENCE.LIST }) + } catch (error) { + showErrorsDefault(error) + } finally { + saveButtonLoading.value = false + saveAndCloseButtonLoading.value = false + } + } + + return { + detailLoading, + saveButtonLoading, + saveAndCloseButtonLoading, + assetLicenceGroup, + fetchData, + onUpdate, + resetStore: assetLicenceGroupOneStore.reset, + } +} + diff --git a/src/views/coreDam/assetLicenceGroup/composables/assetLicenceGroupValidation.ts b/src/views/coreDam/assetLicenceGroup/composables/assetLicenceGroupValidation.ts new file mode 100644 index 00000000..1bdc3605 --- /dev/null +++ b/src/views/coreDam/assetLicenceGroup/composables/assetLicenceGroupValidation.ts @@ -0,0 +1,30 @@ +import type { Ref } from 'vue' +import { computed } from 'vue' +import useVuelidate from '@vuelidate/core' +import { type DamAssetLicenceGroup, useValidate } from '@anzusystems/common-admin' + +export function useAssetLicenceGroupValidation(assetLicenceGroup: Ref) { + const { required, minLength, minValue } = useValidate() + + const rules = computed(() => ({ + assetLicenceGroup: { + name: { + required, + minLength: minLength(3), + }, + extSystem: { + required, + minValue: minValue(1), + }, + licences: { + required, + minLength: minLength(1), + }, + }, + })) + const v$ = useVuelidate(rules, { assetLicenceGroup }) + + return { + v$, + } +} diff --git a/src/views/coreDam/user/components/UserDetail.vue b/src/views/coreDam/user/components/UserDetail.vue index 3950fdbb..05ebefdb 100644 --- a/src/views/coreDam/user/components/UserDetail.vue +++ b/src/views/coreDam/user/components/UserDetail.vue @@ -1,5 +1,5 @@ @@ -16,6 +17,19 @@ const { t } = useI18n()