, sortParameter: string) => {
return list.sort((first: any, second: any) => {
@@ -59,4 +65,4 @@ const generateInternalId = (name: string) => {
return name.trim().toUpperCase().split(' ').join('_');
}
-export { copyToClipboard, customSort, generateInternalId, isValidPassword, showToast }
+export { copyToClipboard, customSort, generateInternalId, isValidEmail, isValidPassword, showToast }
diff --git a/src/views/AddFacilityConfig.vue b/src/views/AddFacilityConfig.vue
index 2566ae14..6ad430a0 100644
--- a/src/views/AddFacilityConfig.vue
+++ b/src/views/AddFacilityConfig.vue
@@ -156,7 +156,7 @@ import { isValidPassword, showToast } from "@/utils";
import { hasError } from "@/adapter";
import logger from "@/logger";
import { FacilityService } from "@/services/FacilityService";
-import { UserService } from "@/services/UserService";
+import { UserService } from "@/services/UserService"
import SelectProductStoreModal from '@/components/SelectProductStoreModal.vue';
import { DateTime } from "luxon";
@@ -209,7 +209,7 @@ export default defineComponent({
async ionViewWillEnter() {
await this.store.dispatch('facility/fetchCurrentFacility', { facilityId: this.facilityId })
await this.store.dispatch('util/fetchProductStores')
- this.username = this.current.facilityName
+ this.username = this.current.facilityId
},
methods: {
async saveFulfillmentSettings() {
@@ -243,44 +243,36 @@ export default defineComponent({
throw { message: translate('Failed to update some fulfillment settings.') }
}
},
- async createFacilityUser() {
- if (!this.username) {
- showToast(translate('Username is required.'))
- return
- }
+ async createFacilityLogin() {
+
+
try {
const payload = {
- "groupName": this.username,
- "facilityId": this.facilityId,
- "loginPassword": this.password,
- "partyTypeId": "PARTY_GROUP",
- "partyIdFrom": "COMPANY",
- "roleTypeIdFrom": "INTERNAL_ORGANIZATIO", // not a typo
- "roleTypeIdTo": "APPLICATION_USER",
- "partyRelationshipTypeId": "EMPLOYMENT"
- }
-
- const resp = await UserService.createFacilityUser(payload);
- if (!hasError(resp)) {
- const partyId = resp.data.partyId;
- await UserService.addPartyToFacility({
- "partyId": partyId,
- "facilityId": this.facilityId,
- "roleTypeId": "WAREHOUSE_MANAGER"
- })
- } else {
- throw { message: translate('Failed to create facility login credentials.') }
+ "facilityId" : this.facilityId,
+ "facilityName": this.current.facilityName,
+ "username": this.username,
+ "password": this.password,
}
- return Promise.resolve(resp.data)
+ await FacilityService.createFacilityLogin(payload);
+ return Promise.resolve()
} catch (error) {
return Promise.reject(error);
}
},
async saveStoreConfig() {
- if (this.createLoginCreds && !this.password) {
- showToast(translate('Please provide a password.'))
- return
+ if (this.createLoginCreds) {
+ if (!this.username) {
+ showToast(translate('Username is required.'))
+ return
+ } else if (await UserService.isUserLoginIdExists(this.username)) {
+ showToast(translate('Could not create login user: user with ID already exists.', { userLoginId: this.username }))
+ return;
+ }
+ if (!this.password) {
+ showToast(translate('Please provide a password.'))
+ return
+ }
}
try {
@@ -289,7 +281,7 @@ export default defineComponent({
}
if (this.createLoginCreds) {
- await this.createFacilityUser()
+ await this.createFacilityLogin()
}
if (this.selectedProductStores) {
diff --git a/src/views/FacilityDetails.vue b/src/views/FacilityDetails.vue
index 7c3725f5..6f107027 100644
--- a/src/views/FacilityDetails.vue
+++ b/src/views/FacilityDetails.vue
@@ -237,6 +237,34 @@
{{ translate("View order count history") }}
+
+
+
+ {{ `${facilityTypes[current.parentFacilityTypeId]?.description} logins` }}
+
+
+
+ {{ translate("Add") }}
+
+
+
+
+
+
+
+ {{ facilityLogin.groupName }}
+ {{ facilityLogin.partyId }}
+ {{ facilityLogin.userLoginId }}
+
+
+
+
+
+
+ {{ translate("Add") }}
+
+
+
@@ -483,6 +511,9 @@ import { showToast } from '@/utils';
import OperatingHoursPopover from '@/components/OperatingHoursPopover.vue'
import GeoPointPopover from '@/components/GeoPointPopover.vue'
import { UtilService } from '@/services/UtilService';
+import FacilityLoginActionPopover from '@/components/FacilityLoginActionPopover.vue'
+import CreateFacilityLoginModal from '@/components/CreateFacilityLoginModal.vue'
+import Image from '@/components/Image.vue';
import emitter from '@/event-bus'
export default defineComponent({
@@ -515,6 +546,7 @@ export default defineComponent({
IonTitle,
IonToggle,
IonToolbar,
+ Image
},
data() {
return {
@@ -557,7 +589,7 @@ export default defineComponent({
facilityTypeId: 'VIRTUAL_FACILITY',
facilityTypeId_op: 'notEqual'
})])
- await Promise.all([this.store.dispatch('facility/fetchFacilityLocations', { facilityId: this.facilityId }), this.store.dispatch('facility/getFacilityParties', { facilityId: this.facilityId }), this.store.dispatch('facility/fetchFacilityMappings', { facilityId: this.facilityId, facilityIdenTypeIds: Object.keys(this.externalMappingTypes)}), this.store.dispatch('facility/fetchShopifyFacilityMappings', { facilityId: this.facilityId }), this.store.dispatch('facility/getFacilityProductStores', { facilityId: this.facilityId }), this.store.dispatch('util/fetchProductStores'), this.store.dispatch('facility/fetchFacilityContactDetails', { facilityId: this.facilityId }), this.store.dispatch('util/fetchCalendars'), this.store.dispatch('facility/fetchFacilityCalendar', { facilityId: this.facilityId })])
+ await Promise.all([this.store.dispatch('facility/fetchFacilityLocations', { facilityId: this.facilityId }), this.store.dispatch('facility/getFacilityParties', { facilityId: this.facilityId }), this.store.dispatch('facility/fetchFacilityMappings', { facilityId: this.facilityId, facilityIdenTypeIds: Object.keys(this.externalMappingTypes)}), this.store.dispatch('facility/fetchShopifyFacilityMappings', { facilityId: this.facilityId }), this.store.dispatch('facility/getFacilityProductStores', { facilityId: this.facilityId }), this.store.dispatch('util/fetchProductStores'), this.store.dispatch('facility/fetchFacilityContactDetails', { facilityId: this.facilityId }), this.store.dispatch('util/fetchCalendars'), this.store.dispatch('facility/fetchFacilityCalendar', { facilityId: this.facilityId }), this.store.dispatch('facility/fetchFacilityLogins', { facilityId: this.facilityId })])
this.defaultDaysToShip = this.current.defaultDaysToShip
this.isLoading = false
this.parentFacilityTypeId = this.current.parentFacilityTypeId
@@ -1143,7 +1175,23 @@ export default defineComponent({
showToast(translate('Failed to update facility type.'))
logger.error('Failed to update facility type.', error)
}
- }
+ },
+ async openFacilityLoginActionPopover(ev: Event, facilityUser: any) {
+ const popover = await popoverController.create({
+ component: FacilityLoginActionPopover,
+ componentProps: { currentFacility: this.current, currentFacilityUser: facilityUser, parentFacilityTypeDesc: this.facilityTypes[this.current.parentFacilityTypeId]?.description },
+ event: ev,
+ showBackdrop: false
+ });
+ return popover.present()
+ },
+ async createFacilityLoginModal() {
+ const facilityLoginModal = await modalController.create({
+ component: CreateFacilityLoginModal,
+ componentProps: { currentFacility: this.current, parentFacilityTypeDesc: this.facilityTypes[this.current.parentFacilityTypeId]?.description }
+ })
+ facilityLoginModal.present()
+ },
},
setup() {
const store = useStore();