value >= 32
+ validate: (value) => value >= 32,
},
itemGap: {
type: [Number, String],
default: 24,
- validate: value => value > 0
+ validate: (value) => value > 0,
+ },
+ itemClass: {
+ type: Function,
+ default: null,
},
fixedWidth: {
type: Boolean,
- default: false
- }
+ default: false,
+ },
},
setup(props) {
const displayedUsers = computed(() => {
@@ -81,9 +86,9 @@ export default {
// References
displayedUsers,
listLength,
- listWidth
+ listWidth,
};
- }
+ },
};
diff --git a/src/components/specific/users/user-avatar/UserAvatar.vue b/src/components/specific/users/user-avatar/UserAvatar.vue
index 4af0881e1..bdc8ad92b 100644
--- a/src/components/specific/users/user-avatar/UserAvatar.vue
+++ b/src/components/specific/users/user-avatar/UserAvatar.vue
@@ -5,7 +5,7 @@
:style="{
width: `${size}px`,
height: `${size}px`,
- fontSize: `${initialsSize ? initialsSize : +size * 0.382}px`
+ fontSize: `${initialsSize ? initialsSize : +size * 0.382}px`,
}"
>
@@ -27,37 +27,36 @@ export default {
props: {
user: {
type: Object,
- required: true
+ required: true,
},
size: {
type: [Number, String],
default: 32,
- validate: value => value >= 32
+ validate: (value) => value >= 32,
},
initialsSize: {
- type: [Number, String]
+ type: [Number, String],
},
color: {
type: String,
default: "primary",
- validate: value =>
- ["primary", "secondary", "silver-light"].includes(value)
- }
+ validate: (value) => ["primary", "secondary", "silver-light"].includes(value),
+ },
},
setup(props) {
/* eslint-disable */
- const initials = computed(
- () => (
- `${props.user.firstname && props.user.firstname[0] || ""}`
- + `${props.user.lastname && props.user.lastname[0] || ""}`
- ).toUpperCase()
+ const initials = computed(() =>
+ (
+ `${(props.user.firstname && props.user.firstname[0]) || ""}` +
+ `${(props.user.lastname && props.user.lastname[0]) || ""}`
+ ).toUpperCase(),
);
/* eslint-enable */
return {
- initials
+ initials,
};
- }
+ },
};
diff --git a/src/components/specific/visa/visa-main/VisaMain.vue b/src/components/specific/visa/visa-main/VisaMain.vue
index 35caaca93..9f44b5fbc 100644
--- a/src/components/specific/visa/visa-main/VisaMain.vue
+++ b/src/components/specific/visa/visa-main/VisaMain.vue
@@ -32,20 +32,20 @@ import VisaSummary from "../visa-summary/VisaSummary.vue";
export default {
components: {
VisaAdd,
- VisaSummary
+ VisaSummary,
},
props: {
project: {
type: Object,
- required: true
+ required: true,
},
document: {
type: Object,
- required: true
+ required: true,
},
visa: {
type: Object,
- required: false
+ required: false,
},
},
emits: ["create-visa", "fetch-visas", "close", "preview-visa", "reach-file"],
@@ -56,14 +56,14 @@ export default {
const currentView = ref(currentVisa.value.document ? "visaSummary" : "visaAdd");
- const createVisa = async visa => {
+ const createVisa = async (visa) => {
currentVisa.value = await fetchVisa(props.project, visa);
currentView.value = "visaSummary";
- emit('fetch-visas');
- emit('create-visa');
+ emit("fetch-visas");
+ emit("create-visa");
};
- const reachVisa = visa => {
+ const reachVisa = (visa) => {
currentVisa.value = visa;
currentView.value = "visaSummary";
};
@@ -80,9 +80,9 @@ export default {
// methods
createVisa,
reachVisa,
- closeVisa
+ closeVisa,
};
- }
+ },
};
diff --git a/src/components/specific/visa/visa-summary/VisaSummary.vue b/src/components/specific/visa/visa-summary/VisaSummary.vue
index b43e9ff30..668c75fd0 100644
--- a/src/components/specific/visa/visa-summary/VisaSummary.vue
+++ b/src/components/specific/visa/visa-summary/VisaSummary.vue
@@ -201,6 +201,7 @@
:isAuthor="isAuthor"
:userList="formatedVisa.validations"
:isClosed="isClosed"
+ :visaDeadline="formatedVisa.deadline"
@reset-validation="onResetValidation"
@delete-validation="onDeleteValidation"
/>
@@ -270,9 +271,7 @@ export default {
updateVisa,
} = useVisa();
- const {
- fileStructureHandler: handler,
- } = useFiles();
+ const { fileStructureHandler: handler } = useFiles();
const isClosed = ref(false);
const isEditing = ref(false);
@@ -311,7 +310,7 @@ export default {
isSelf: isSelf(validation.validator),
hasAccess: visa.validations_in_error.length
? !visa.validations_in_error.some(
- (validationInErrorId) => validationInErrorId === validation.id
+ (validationInErrorId) => validationInErrorId === validation.id,
)
: true,
}))
@@ -330,10 +329,10 @@ export default {
return {
...user,
isSelected: visa.validations.some(
- ({ validator }) => validator && validator.id === user.id
+ ({ validator }) => validator && validator.id === user.id,
),
validation: visa.validations.find(
- ({ validator }) => validator && validator.id === user.id
+ ({ validator }) => validator && validator.id === user.id,
),
};
});
@@ -345,12 +344,13 @@ export default {
}
if (!isAuthor.value) {
validationUserId.value = props.visa.validations.find(({ validator }) =>
- isSelf(validator)
+ isSelf(validator),
).id;
}
isClosed.value = props.visa.status === VISA_STATUS.CLOSE;
userProjectList.value = await fetchDocumentUsers(props.visa);
- formatedVisa.value = formatVisa(props.visa);
+ const visa = await fetchVisa(props.project, props.visa);
+ formatedVisa.value = formatVisa(visa);
});
const reloadVisa = async () => {
@@ -371,7 +371,7 @@ export default {
const userValidationStatus = computed(() => {
if (!isAuthor.value) {
const status = formatedVisa.value.validations.find(
- ({ id: validationId }) => validationId === validationUserId.value
+ ({ id: validationId }) => validationId === validationUserId.value,
).status;
return {
@@ -390,7 +390,7 @@ export default {
props.project,
props.visa.document,
props.visa,
- validationUserId.value
+ validationUserId.value,
);
await reloadVisa();
}
@@ -404,7 +404,7 @@ export default {
props.project,
props.visa.document,
props.visa,
- validationUserId.value
+ validationUserId.value,
);
await reloadVisa();
}
@@ -415,7 +415,7 @@ export default {
props.project,
props.visa.document,
props.visa,
- (validationId = validationId || validationUserId.value)
+ (validationId = validationId || validationUserId.value),
);
await reloadVisa();
};
@@ -491,7 +491,7 @@ export default {
} else if (isToDel) {
await onDeleteValidation(validationId);
}
- })
+ }),
);
await reloadVisa();
});
diff --git a/src/components/specific/visa/visa-summary/visa-summary-validator/VisaSummaryValidator.scss b/src/components/specific/visa/visa-summary/visa-summary-validator/VisaSummaryValidator.scss
index d66fb0148..68eeff8f0 100644
--- a/src/components/specific/visa/visa-summary/visa-summary-validator/VisaSummaryValidator.scss
+++ b/src/components/specific/visa/visa-summary/visa-summary-validator/VisaSummaryValidator.scss
@@ -35,12 +35,15 @@
align-items: center;
span {
- margin: auto var(--spacing-unit) auto 0;
+ margin: auto calc(var(--spacing-unit) / 2) auto 0;
}
&__P {
display: flex;
color: var(--color-primary);
+ &.delayed {
+ color: var(--color-warning);
+ }
}
&__A {
display: flex;
diff --git a/src/components/specific/visa/visa-summary/visa-summary-validator/VisaSummaryValidator.vue b/src/components/specific/visa/visa-summary/visa-summary-validator/VisaSummaryValidator.vue
index 9d5bee1b6..782692e5d 100644
--- a/src/components/specific/visa/visa-summary/visa-summary-validator/VisaSummaryValidator.vue
+++ b/src/components/specific/visa/visa-summary/visa-summary-validator/VisaSummaryValidator.vue
@@ -24,11 +24,7 @@
-
+
-
+
{{ $t(`Visa.summary.validatorList.${validationStatus(user)}`) }}
-
+
@@ -92,34 +89,43 @@ import VisaSummaryValidatorActions from "./visa-summary-validator-actions/VisaSu
export default {
components: {
UserAvatar,
- VisaSummaryValidatorActions
+ VisaSummaryValidatorActions,
},
props: {
userList: {
type: Object,
- required: true
+ required: true,
},
isAuthor: {
type: Boolean,
- required: true
+ required: true,
},
isClosed: {
type: Boolean,
- required: true
- }
+ required: true,
+ },
+ visaDeadline: {
+ type: Date,
+ required: false,
+ },
},
emits: ["reset-validation", "delete-validation"],
- setup() {
+ setup(props) {
const currentPeopleId = ref(null);
const isWarningHover = ref(false);
- const hasVoted = user => user.status !== VALIDATION_STATUS.PENDING;
+ const hasVoted = (user) => user.status !== VALIDATION_STATUS.PENDING;
- const validationStatus = user => {
+ const validationStatus = (user) => {
const { hasCommented, status } = user;
-
if (hasCommented && status === VALIDATION_STATUS.PENDING) {
return "commented";
+ } else if (
+ props.visaDeadline &&
+ new Date() > new Date(props.visaDeadline) &&
+ status === VALIDATION_STATUS.PENDING
+ ) {
+ return "delayed";
} else if (user.status === VALIDATION_STATUS.PENDING) {
return "pending";
} else if (user.status === VALIDATION_STATUS.ACCEPT) {
@@ -129,7 +135,7 @@ export default {
}
};
- const iconStatus = user => {
+ const iconStatus = (user) => {
const { hasCommented, status } = user;
if (hasCommented && status === VALIDATION_STATUS.PENDING) {
@@ -143,7 +149,7 @@ export default {
}
};
- const hoveringValidator = peopleId => {
+ const hoveringValidator = (peopleId) => {
if (peopleId) {
isWarningHover.value = true;
currentPeopleId.value = peopleId;
@@ -162,9 +168,9 @@ export default {
hoveringValidator,
validationStatus,
iconStatus,
- hasVoted
+ hasVoted,
};
- }
+ },
};
diff --git a/src/i18n/lang/de.json b/src/i18n/lang/de.json
index 617a3d07e..84543980e 100644
--- a/src/i18n/lang/de.json
+++ b/src/i18n/lang/de.json
@@ -673,6 +673,7 @@
"deletedUser": "Gelöschter Nutzer",
"validatorList": {
"accept": "Bestätigt",
+ "delayed": "Verzögert",
"deny": "Abgelehnt",
"commented": "Kommentiert",
"pending": "Ausstehend",
@@ -971,4 +972,4 @@
"title": "Löschen der {visasCount} Freigaben",
"message": "Sie sind dabei, die Freigaben für die folgenden Dateien zu löschen:"
}
-}
\ No newline at end of file
+}
diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json
index 80030c740..63d5ac73e 100644
--- a/src/i18n/lang/en.json
+++ b/src/i18n/lang/en.json
@@ -673,6 +673,7 @@
"deletedUser": "User removed",
"validatorList": {
"accept": "Validated",
+ "delayed": "Delayed",
"deny": "Refused",
"commented": "Commented",
"pending": "Awaiting",
@@ -689,6 +690,15 @@
"selectionValidator": {
"warning": "This user cannot access the file."
},
+ "VisaValidatorCell": {
+ "title": "Visa details",
+ "noGroup": "No group",
+ "accept": "Accepted",
+ "delayed": "Delayed",
+ "deny": "Denied",
+ "pending": "Pending",
+ "multipleGroups": "{count} groups"
+ },
"noVisa": "A VISA has not yet been created",
"accept": "Accept",
"close": "Close",
@@ -971,4 +981,4 @@
"title": "Delete {visasCount} visas",
"message": "You are about to delete the visas on the following files:"
}
-}
\ No newline at end of file
+}
diff --git a/src/i18n/lang/es.json b/src/i18n/lang/es.json
index 5cde8624f..901f8a72b 100644
--- a/src/i18n/lang/es.json
+++ b/src/i18n/lang/es.json
@@ -673,6 +673,7 @@
"deletedUser": "Usuario eliminado",
"validatorList": {
"accept": "Confirmado",
+ "delayed": "Retrasado",
"deny": "Rechazado",
"commented": "Comentado",
"pending": "En espera",
@@ -971,4 +972,4 @@
"title": "Eliminación de {visasCount} visas",
"message": "Está a punto de eliminar las visas de los siguientes archivos:"
}
-}
\ No newline at end of file
+}
diff --git a/src/i18n/lang/fr.json b/src/i18n/lang/fr.json
index 716f09af2..42dc966f4 100644
--- a/src/i18n/lang/fr.json
+++ b/src/i18n/lang/fr.json
@@ -790,6 +790,7 @@
"deletedUser": " Utilisateur supprimé",
"validatorList": {
"accept": "Validé",
+ "delayed": "En retard",
"deny": "Refusé",
"commented": "Commenté",
"pending": "En attente",
@@ -797,6 +798,15 @@
"refresh": "Réinitialiser la validation"
}
},
+ "VisaValidatorCell": {
+ "title": "Détails des validants",
+ "noGroup": "Sans groupe",
+ "accept": "Validé",
+ "delayed": "En retard",
+ "deny": "Refusé",
+ "pending": "En attente",
+ "multipleGroups": "{count} groupes"
+ },
"comments": {
"commentary": "Commentaire",
"commentInputPlaceholder": "Poster un commentaire",
diff --git a/src/i18n/lang/it.json b/src/i18n/lang/it.json
index ed4a4bf2f..75f8dd244 100644
--- a/src/i18n/lang/it.json
+++ b/src/i18n/lang/it.json
@@ -594,6 +594,7 @@
"deletedUser": "Utente eliminato",
"validatorList": {
"accept": "Convalidato",
+ "delegate": "Delegato",
"deny": "Respinto",
"commented": "Commentato",
"pending": "In attesa",
diff --git a/src/i18n/lang/nl.json b/src/i18n/lang/nl.json
index 12d2addbf..51e86322c 100644
--- a/src/i18n/lang/nl.json
+++ b/src/i18n/lang/nl.json
@@ -591,6 +591,7 @@
"deletedUser": "Gebruiker verwijderd",
"validatorList": {
"accept": "Gevalideerd",
+ "delayed": "Uitgesteld",
"deny": "Geweigerd",
"commented": "Becommentarieerd",
"pending": "In afwachting van",
diff --git a/src/i18n/lang/no.json b/src/i18n/lang/no.json
index cb02a2161..d7e4b21d8 100644
--- a/src/i18n/lang/no.json
+++ b/src/i18n/lang/no.json
@@ -591,6 +591,7 @@
"deletedUser": "Brukeren er fjernet",
"validatorList": {
"accept": "Verifisert",
+ "delayed": "Forsinket",
"deny": "Avslått",
"commented": "Kommentert",
"pending": "Avventer",
diff --git a/src/utils/visas.js b/src/utils/visas.js
index a1f1d68ad..ecded69f5 100644
--- a/src/utils/visas.js
+++ b/src/utils/visas.js
@@ -1,12 +1,14 @@
import { fullName } from "./users.js";
import { VISA_STATUS, VALIDATION_STATUS } from "../config/visa.js";
+const safeFullName = (user) => (user ? fullName(user) : "");
+
export const enhanceVisa = (visa, user, t, handler) => {
const validationType = () => {
if (visa.status === VISA_STATUS.CLOSE) {
return t("Visa.view.visaClosed");
}
- if (fullName(user) === fullName(visa.creator)) {
+ if (user && visa.creator && safeFullName(user) === safeFullName(visa.creator)) {
return t("Visa.view.myRequests");
} else {
return t("Visa.view.visaPending");
@@ -37,7 +39,10 @@ export const enhanceVisa = (visa, user, t, handler) => {
return emailValidators;
};
- const document = handler.get({ id: visa.document.head_id ?? visa.document.id, nature: "Document" });
+ const document = handler.get({
+ id: visa.document.head_id ?? visa.document.id,
+ nature: "Document",
+ });
return {
...visa,