Merge remote-tracking branch 'origin/GH#2834' into GH#2834

pull/4677/head
Borja Sánchez 2 years ago
commit dbd590ec21
  1. 4
      assets/css/app.scss
  2. 22
      assets/css/scss/_catalog_course.scss
  3. 22
      assets/css/scss/_catalog_session.scss
  4. 112
      assets/css/scss/atoms/_dropdown.scss
  5. 45
      assets/css/scss/atoms/_form.scss
  6. 70
      assets/css/scss/atoms/_input_text.scss
  7. 46
      assets/css/scss/atoms/_toast.scss
  8. 3
      assets/css/scss/index.scss
  9. 54
      assets/vue/App.vue
  10. 9
      assets/vue/components/ccalendarevent/Form.vue
  11. 1
      assets/vue/components/page/Form.vue
  12. 109
      assets/vue/components/resource_links/ShowLinks.vue
  13. 7
      assets/vue/composables/datatableCreate.js
  14. 7
      assets/vue/composables/datatableList.js
  15. 8
      assets/vue/composables/datatableUpdate.js
  16. 11
      assets/vue/views/ccalendarevent/List.vue
  17. 10
      assets/vue/views/documents/List.vue
  18. 3
      assets/vue/views/documents/Update.vue
  19. 8
      assets/vue/views/page/Create.vue
  20. 15
      assets/vue/views/page/List.vue

@ -168,10 +168,6 @@
} }
} }
.mdi {
@apply align-middle inline-flex leading-none;
}
//@import 'primevue-md-light-indigo/theme.css'; //@import 'primevue-md-light-indigo/theme.css';
//@import '~primevue/resources/primevue.min.css'; //@import '~primevue/resources/primevue.min.css';
//@import '~primeflex/primeflex.css'; //@import '~primeflex/primeflex.css';

@ -16,28 +16,6 @@
position: absolute; position: absolute;
top: 50%; top: 50%;
} }
.p-input-icon-left > .p-inputtext {
padding-left: 2.5rem;
}
.p-inputtext {
font-size: 1rem;
color: #495057;
background: #ffffff;
padding: 0.75rem 0.75rem;
border: 1px solid #ced4da;
transition: background-color 0.2s, color 0.2s, border-color 0.2s, box-shadow 0.2s;
appearance: none;
border-radius: 6px;
}
.p-inputtext:enabled:hover {
border-color: #3B82F6;
}
.p-inputtext:enabled:focus {
outline: 0 none;
outline-offset: 0;
box-shadow: 0 0 0 0.2rem #BFDBFE;
border-color: #3B82F6;
}
::v-deep(.p-datatable.p-datatable-courses) { ::v-deep(.p-datatable.p-datatable-courses) {
.p-datatable-header { .p-datatable-header {
padding: 1rem; padding: 1rem;

@ -19,28 +19,6 @@
position: absolute; position: absolute;
top: 50%; top: 50%;
} }
.p-input-icon-left > .p-inputtext {
padding-left: 2.5rem;
}
.p-inputtext {
font-size: 1rem;
color: #495057;
background: #ffffff;
padding: 0.75rem 0.75rem;
border: 1px solid #ced4da;
transition: background-color 0.2s, color 0.2s, border-color 0.2s, box-shadow 0.2s;
appearance: none;
border-radius: 6px;
}
.p-inputtext:enabled:hover {
border-color: #3B82F6;
}
.p-inputtext:enabled:focus {
outline: 0 none;
outline-offset: 0;
box-shadow: 0 0 0 0.2rem #BFDBFE;
border-color: #3B82F6;
}
.orders-subtable { .orders-subtable {
padding: 1rem; padding: 1rem;
} }

@ -1,108 +1,90 @@
select.p-dropdown {
@apply p-4;
}
.p-dropdown { .p-dropdown {
@apply bg-white border border-solid border-support-3 p-3.5 rounded-lg transition gap-3 @apply border border-support-3 bg-white rounded-lg transition w-full duration-200
hover:border-primary; hover:border-primary hover:text-gray-90 hover:outline-0 hover:outline-none;
&.p-dropdown-clearable {
.p-dropdown-label { .p-dropdown-label {
@apply outline-none; //padding-right: nth($inputPadding, 2) + $primeIconFontSize;
}
.p-dropdown-trigger {
.p-dropdown-trigger-icon {
@apply text-gray-90;
}
}
&.p-inputwrapper-filled {
~ label {
@apply text-primary text-caption;
} }
} }
&.p-invalid { .p-dropdown-label {
@apply border-error text-error; @apply bg-transparent border-none
focus:outline-0 focus:outline-none;
~ label { &.p-placeholder {
@apply text-error; //color: $inputPlaceholderTextColor;
}
} }
} }
.p-float-label { .p-dropdown-trigger {
.p-dropdown { @apply bg-transparent rounded-r-lg w-12;
@apply w-full;
&.p-inputwrapper-focus {
@apply border-primary;
~ label {
@apply top-0 text-primary text-caption;
} }
.p-placeholder { .p-dropdown-clear-icon {
@apply text-body-1 text-gray-90;
}
} }
&.p-inputwrapper-filled { &.p-invalid.p-component {
~ label { @apply border-error text-error;
@apply top-0;
}
}
} }
} }
$color_1: #3f3f46;
.p-dropdown-panel { .p-dropdown-panel {
@apply bg-white text-gray-50 border-none rounded-lg drop-shadow-lg; @apply bg-white rounded-lg text-gray-90 shadow-lg;
.p-dropdown-header { .p-dropdown-header {
@apply p-2 border-none bg-gray-15 rounded-t-lg; //padding: $inputListHeaderPadding;
//border-bottom: $inputListHeaderBorder;
//color: $inputListHeaderTextColor;
//background: $inputOverlayHeaderBg;
//margin: $inputListHeaderMargin;
//border-top-right-radius: $borderRadius;
//border-top-left-radius: $borderRadius;
.p-dropdown-filter.p-inputtext { .p-dropdown-filter {
@apply py-2 px-3.5 -mr-10; //padding-right: nth($inputPadding, 2) + $primeIconFontSize;
//margin-right: -1 * (nth($inputPadding, 2) + $primeIconFontSize);
} }
.p-dropdown-filter-icon { .p-dropdown-filter-icon {
@apply right-4 text-gray-90; //right: nth($inputPadding, 2);
//color: $inputIconColor;
} }
} }
.p-dropdown-items { .p-dropdown-items {
@apply p-0; @apply py-1.5;
.p-dropdown-item { .p-dropdown-item {
@apply outline-none m-0 px-3 py-2 border-none text-gray-50 text-body-2; @apply px-4 py-2 transition text-body-2 outline-0 outline-none text-gray-90;
&:not(.p-highlight) { &.p-highlight {
&:not(.p-disabled) { @apply bg-support-3 text-support-4;
&.p-focus,
&:hover { &.p-focus {
@apply text-gray-90;
} }
} }
&:not(.p-highlight):not(.p-disabled) {
&.p-focus,
&:hover {
@apply bg-support-1;
} }
} }
.p-dropdown-item.p-highlight {
@apply text-primary;
} }
.p-dropdown-item-group { .p-dropdown-item-group {
margin: 0; //margin: $submenuHeaderMargin;
padding: 0.75rem 1rem; //padding: $submenuHeaderPadding;
color: $color_1; //color: $submenuHeaderTextColor;
background: #ffffff; //background: $submenuHeaderBg;
font-weight: 600; //font-weight: $submenuHeaderFontWeight;
} }
.p-dropdown-empty-message { .p-dropdown-empty-message {
padding: 0.75rem 1rem; //padding: $inputListItemPadding;
color: $color_1; //color: $inputListItemTextColor;
background: transparent; //background: $inputListItemBg;
} }
} }
} }

@ -14,7 +14,7 @@
[multiple], [multiple],
textarea, textarea,
select { select {
@apply text-body-1 text-gray-90 @apply text-body-1 text-gray-90 outline-0 outline-none
placeholder:text-gray-90 placeholder:text-gray-90
focus:outline-none focus:outline-offset-0 focus:ring-0 focus:ring-offset-0; focus:outline-none focus:outline-offset-0 focus:ring-0 focus:ring-offset-0;
} }
@ -26,12 +26,6 @@
@apply hidden; @apply hidden;
} }
} }
form {
small {
@apply text-caption;
}
}
} }
@layer components { @layer components {
@ -63,6 +57,11 @@
} }
} }
.field {
> small {
@apply text-caption;
}
}
.p-error { .p-error {
@apply text-error; @apply text-error;
@ -71,3 +70,35 @@
.p-disabled { .p-disabled {
@apply opacity-60; @apply opacity-60;
} }
.p-float-label {
label {
@apply left-4 text-support-3 bg-transparent transition-all duration-200;
}
input:focus,
input.p-filled,
textarea:focus,
textarea.p-filled,
.p-inputwrapper-focus,
.p-inputwrapper-filled {
~ label {
@apply bg-white px-1 text-primary top-0 left-2;
}
}
.p-invalid ~ label {
@apply text-error;
}
input:focus,
input.p-filled,
textarea:focus,
textarea.p-filled,
.p-inputwrapper-focus,
.p-inputwrapper-filled {
&.p-invalid ~ label {
@apply text-error;
}
}
}

@ -1,61 +1,55 @@
input.p-inputtext { .p-inputtext {
@apply bg-white border border-solid border-support-3 p-3.5 rounded-lg transition outline-none w-full @apply border border-support-3 px-4 py-3 text-body-1 bg-white rounded-lg text-gray-90 transition w-full duration-200
hover:border-primary focus:border-primary; placeholder:text-support-3
hover:border-primary hover:text-gray-90 hover:outline-0 hover:outline-none
&:focus, focus:border-primary focus:text-gray-90 hover:outline-0 hover:outline-none;
&.p-filled {
~ {
label {
@apply text-caption text-primary;
}
}
}
&.p-invalid.p-component { &.p-invalid.p-component {
@apply border-error text-error; @apply border-error
placeholder:text-error;
} }
&.p-inputtext-sm { &.p-inputtext-sm {
@apply px-2 py-1; @apply px-2 py-1.5 text-body-2;
} }
&.p-inputtext-lg { &.p-inputtext-lg {
@apply px-6 py-5; @apply py-4;
}
&.p-invalid {
~ label,
&:focus ~ label {
@apply text-error;
}
} }
} }
.p-input-icon-right { .p-input-icon-left > i:first-of-type {
> .p-inputtext { //left: nth($inputPadding, 2);
@apply pr-10; //color: $inputIconColor;
} }
> i:last-of-type { .p-input-icon-left > .p-inputtext {
@apply right-3; //padding-left: nth($inputPadding, 2) * 2 + $primeIconFontSize;
}
} }
.p-float-label { .p-input-icon-left.p-float-label > label {
input.p-inputtext { //left: nth($inputPadding, 2) * 2 + $primeIconFontSize;
@apply w-full; }
&:focus, .p-input-icon-right > i:last-of-type {
&.p-filled { //right: nth($inputPadding, 2);
~ { //color: $inputIconColor;
label {
@apply top-0;
} }
.p-input-icon-right > .p-inputtext {
//padding-right: nth($inputPadding, 2) * 2 + $primeIconFontSize;
} }
.p-inputtext-sm {
.p-inputtext {
//@include scaledFontSize($inputTextFontSize, $scaleSM);
//@include scaledPadding($inputPadding, $scaleSM);
} }
} }
> label { .p-inputtext-lg {
@apply bg-white duration-200 left-2 px-1 text-support-3; .p-inputtext {
//@include scaledFontSize($inputTextFontSize, $scaleLG);
//@include scaledPadding($inputPadding, $scaleLG);
} }
} }

@ -0,0 +1,46 @@
$color_1: #01579B;
$color_2: #1B5E20;
$color_3: #7f6003;
$color_4: #B71C1C;
.p-toast {
@apply opacity-95;
&-message {
@apply rounded-md mb-3.5 shadow-gray-30 shadow-md;
&-content {
@apply py-4 px-6 gap-2.5;
.p-toast-message-text {
@apply text-body-1;
}
.p-toast-message-icon {
}
.p-toast-summary {
@apply font-semibold;
}
.p-toast-detail {
}
}
.p-toast-icon-close {
@apply rounded-full transition duration-200 w-4 h-6
focus:outline-none;
}
&.p-toast-message-info {
@apply bg-primary text-white;
}
&.p-toast-message-success {
@apply bg-success text-white;
}
&.p-toast-message-warn {
@apply bg-warning text-gray-90;
}
&.p-toast-message-error {
@apply bg-error text-white;
}
}
}

@ -13,11 +13,11 @@
@import "settings/typography"; @import "settings/typography";
@import "atoms/form";
@import "atoms/avatar"; @import "atoms/avatar";
@import "atoms/buttons"; @import "atoms/buttons";
@import "atoms/checkbox"; @import "atoms/checkbox";
@import "atoms/dropdown"; @import "atoms/dropdown";
@import "atoms/form";
@import "atoms/fieldset"; @import "atoms/fieldset";
@import "atoms/inline_message"; @import "atoms/inline_message";
@import "atoms/input_switch"; @import "atoms/input_switch";
@ -29,6 +29,7 @@
@import "atoms/radio"; @import "atoms/radio";
@import "atoms/skeleton"; @import "atoms/skeleton";
@import "atoms/tags"; @import "atoms/tags";
@import "atoms/toast";
@import "molecules/course_tool"; @import "molecules/course_tool";
@import "molecules/datepicker"; @import "molecules/datepicker";

@ -3,18 +3,32 @@
:is="layout" :is="layout"
:show-breadcrumb="route.meta.showBreadcrumb" :show-breadcrumb="route.meta.showBreadcrumb"
> >
<transition-group <Toast
name="p-message" position="top-center"
tag="div"
> >
<Message <template #message="slotProps">
v-for="(toastObj, index) in flashMessageList" <span
:key="index" :class="{
:severity="toastObj.severity" 'mdi-close-outline': 'error' === slotProps.message.severity,
> 'mdi-information-outline': 'info' === slotProps.message.severity,
<div v-html="toastObj.detail" /> 'mdi-check-outline': 'success' === slotProps.message.severity,
</Message> 'mdi-alert-outline': 'warn' === slotProps.message.severity
</transition-group> }"
class="p-toast-message-icon mdi"
/>
<div class="p-toast-message-text">
<span
v-if="slotProps.message.summary"
class="p-toast-summary"
v-text="slotProps.message.summary"
/>
<div
class="p-toast-detail"
v-html="slotProps.message.detail"
/>
</div>
</template>
</Toast>
<slot /> <slot />
<div <div
id="legacy_content" id="legacy_content"
@ -32,8 +46,9 @@ import {ApolloClient, createHttpLink, InMemoryCache} from '@apollo/client/core';
import {useStore} from "vuex"; import {useStore} from "vuex";
import axios from "axios"; import axios from "axios";
import {isEmpty} from "lodash"; import {isEmpty} from "lodash";
import Message from "primevue/message";
import ConfirmDialog from "primevue/confirmdialog"; import ConfirmDialog from "primevue/confirmdialog";
import Toast from 'primevue/toast';
import { useToast } from 'primevue/usetoast';
const apolloClient = new ApolloClient({ const apolloClient = new ApolloClient({
link: createHttpLink({ link: createHttpLink({
@ -47,6 +62,8 @@ provide(DefaultApolloClient, apolloClient);
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const toast = useToast();
const layout = computed( const layout = computed(
() => { () => {
const queryParams = new URLSearchParams(window.location.search); const queryParams = new URLSearchParams(window.location.search);
@ -137,10 +154,6 @@ const payload = {isAuthenticated, user};
store.dispatch('security/onRefresh', payload); store.dispatch('security/onRefresh', payload);
const flashMessageList = ref([]);
provide('flashMessageList', flashMessageList);
onMounted(() => { onMounted(() => {
const app = document.getElementById('app'); const app = document.getElementById('app');
@ -152,9 +165,10 @@ onMounted(() => {
for (const key in flashes) { for (const key in flashes) {
for (const flashText in flashes[key]) { for (const flashText in flashes[key]) {
flashMessageList.value.push({ toast.add({
severity: key, severity: key,
detail: flashes[key][flashText], detail: flashes[key][flashText],
life: 3500,
}); });
} }
} }
@ -164,14 +178,16 @@ axios.interceptors.response.use(
undefined, undefined,
(error) => new Promise(() => { (error) => new Promise(() => {
if (401 === error.response.status) { if (401 === error.response.status) {
flashMessageList.value.push({ toast.add({
severity: 'warn', severity: 'warn',
detail: error.response.data.error, detail: error.response.data.error,
life: 3500,
}); });
} else if (500 === error.response.status) { } else if (500 === error.response.status) {
flashMessageList.value.push({ toast.add({
severity: 'warn', severity: 'warn',
detail: error.response.data.detail, detail: error.response.data.detail,
life: 3500,
}); });
} }

@ -20,8 +20,8 @@
/> />
</div> </div>
<div class="flex flex-col md:flex-row gap-5"> <div class="flex flex-col md:flex-row gap-x-5">
<div class="md:w-1/2 flex flex-col gap-5"> <div class="md:w-1/2 flex flex-col">
<div class="field"> <div class="field">
<div class="p-float-label"> <div class="p-float-label">
<Calendar <Calendar
@ -87,7 +87,7 @@
/> />
</div> </div>
<div class="md:w-1/2 flex flex-col gap-5"> <div class="md:w-1/2 flex flex-col">
<div <div
v-t="'Invitees'" v-t="'Invitees'"
class="text-h6" class="text-h6"
@ -98,9 +98,10 @@
:item="item" :item="item"
:links-type="linksType" :links-type="linksType"
:show-status="false" :show-status="false"
show-share-with-user
/> />
<div class="field flex-row"> <div class="field-checkbox">
<Checkbox <Checkbox
id="is_collective" id="is_collective"
v-model="item.collective" v-model="item.collective"

@ -6,6 +6,7 @@
id="item_title" id="item_title"
v-model="v$.item.title.$model" v-model="v$.item.title.$model"
:class="{ 'p-invalid': v$.item.title.$invalid }" :class="{ 'p-invalid': v$.item.title.$invalid }"
type="text"
/> />
<label <label
v-t="'Title'" v-t="'Title'"

@ -1,31 +1,42 @@
<template> <template>
<div v-if="item && item['resourceLinkListFromEntity']"> <div
<v-card> v-for="(link, index) in item.resourceLinkListFromEntity"
<v-list-item :key="index"
v-for="link in item['resourceLinkListFromEntity']" class="field space-y-2"
> >
<v-list-item-content> <div
<div v-if="link['course']"> v-if="link.course"
<v-icon icon="mdi-book" /> :class="{ 'text-right text-body-2': editStatus }"
{{ $t('Course') }}: {{ link.course.resourceNode.title }} >
<span class="mdi mdi-book" />
{{ t('Course: {0}', [ link.course.resourceNode.title ]) }}
</div> </div>
<div v-if="link['session']"> <div
<v-icon icon="mdi-book-open" /> v-if="link.session"
{{ $t('Session') }}: {{ link.session.name }} :class="{ 'text-right text-body-2': editStatus }"
>
<span class="mdi mdi-book-open" />
{{ t('Session: {0}', [ link.session.name ]) }}
</div> </div>
<div v-if="link['group']"> <div
<v-icon icon="mdi-people" /> v-if="link.group"
{{ $t('Group') }}: {{ link.group.resourceNode.title }} :class="{ 'text-right text-body-2': editStatus }"
>
<span class="mdi mdi-people" />
{{ t('Group: {0}', [ link.group.resourceNode.title ]) }}
</div> </div>
<div v-if="link['userGroup']"> <div
{{ $t('Class') }}: {{ link.userGroup.resourceNode.title }} v-if="link.userGroup"
</div> v-t="{ path: 'Class: {0}', args: [ link.userGroup.resourceNode.title ] }"
/>
<div v-if="link['user']"> <div
<v-icon icon="mdi-account" /> v-if="link.user"
>
<span class="mdi mdi-account" />
<!-- @todo add avatar --> <!-- @todo add avatar -->
<!-- <q-avatar size="32px">--> <!-- <q-avatar size="32px">-->
<!-- <img :src="link.user.illustrationUrl + '?w=80&h=80&fit=crop'" />--> <!-- <img :src="link.user.illustrationUrl + '?w=80&h=80&fit=crop'" />-->
@ -33,34 +44,44 @@
{{ link.user.username }} {{ link.user.username }}
</div> </div>
<div v-if="showStatus"> <div
{{ $t('Status') }}: {{ link.visibilityName }} v-if="showStatus"
</div> v-t="{ path: 'Status: {0}', args: [link.visibilityName] }"
/>
<q-select <div
v-if="editStatus" v-if="editStatus"
>
<div class="p-float-label">
<Dropdown
v-model="link.visibility" v-model="link.visibility"
:options="visibilityList" :input-id="`link-${link.id}-status`"
emit-value :options="visibilityOptions"
filled option-label="label"
label="Status" option-value="value"
map-options
/> />
</v-list-item-content> <label
</v-list-item> v-t="'Status'"
</v-card> :for="`link-${link.id}-status`"
/>
</div>
</div>
</div> </div>
</template> </template>
<script> <script setup>
import { RESOURCE_LINK_PUBLISHED, RESOURCE_LINK_DRAFT } from "./visibility"; import { RESOURCE_LINK_PUBLISHED, RESOURCE_LINK_DRAFT } from "./visibility";
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
export default { defineProps({
name: 'ShowLinks',
props: {
item: { item: {
type: Object, type: Object,
required: true required: true,
default: () => ({
resourceLinkListFromEntity: [],
})
}, },
showStatus: { showStatus: {
type: Boolean, type: Boolean,
@ -72,16 +93,10 @@ export default {
required: false, required: false,
default: false default: false
} }
}, });
setup() {
const visibilityList = [
{value: RESOURCE_LINK_PUBLISHED, label: 'Published'},
{value: RESOURCE_LINK_DRAFT, label: 'Draft'},
];
return { const visibilityOptions = [
visibilityList, { value: RESOURCE_LINK_PUBLISHED, label: t('Published') },
}; { value: RESOURCE_LINK_DRAFT, label: t('Draft') },
} ];
};
</script> </script>

@ -1,7 +1,7 @@
import { inject } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import { useToast } from 'primevue/usetoast';
export function useDatatableCreate (servicePrefix) { export function useDatatableCreate (servicePrefix) {
const moduleName = servicePrefix.toLowerCase(); const moduleName = servicePrefix.toLowerCase();
@ -11,14 +11,15 @@ export function useDatatableCreate (servicePrefix) {
const route = useRoute(); const route = useRoute();
const { t } = useI18n(); const { t } = useI18n();
const flashMessageList = inject('flashMessageList'); const toast = useToast();
function onCreated (item) { function onCreated (item) {
flashMessageList.value.push({ toast.add({
severity: 'success', severity: 'success',
detail: t('{resource} created', { detail: t('{resource} created', {
'resource': item['resourceNode'] ? item['resourceNode'].title : item.title, 'resource': item['resourceNode'] ? item['resourceNode'].title : item.title,
}), }),
life: 3500,
}); });
let folderParams = route.query; let folderParams = route.query;

@ -121,10 +121,11 @@ export function useDatatableList (servicePrefix) {
onUpdateOptions(options.value); onUpdateOptions(options.value);
flashMessageList.value.push({ toast.add({
severity: 'success', severity: 'success',
detail: t('Deleted') detail: t('Deleted'),
}) life: 3500,
});
} }
return { return {

@ -1,8 +1,9 @@
import { computed, inject, ref, watch } from 'vue'; import { computed, ref, watch } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { isEmpty } from 'lodash'; import { isEmpty } from 'lodash';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { useToast } from 'primevue/usetoast';
export function useDatatableUpdate (servicePrefix) { export function useDatatableUpdate (servicePrefix) {
const moduleName = servicePrefix.toLowerCase(); const moduleName = servicePrefix.toLowerCase();
@ -11,7 +12,7 @@ export function useDatatableUpdate (servicePrefix) {
const route = useRoute(); const route = useRoute();
const { t } = useI18n(); const { t } = useI18n();
const flashMessageList = inject('flashMessageList'); const toast = useToast();
const isLoading = computed(() => store.getters[`${moduleName}/isLoading`]); const isLoading = computed(() => store.getters[`${moduleName}/isLoading`]);
@ -74,11 +75,12 @@ export function useDatatableUpdate (servicePrefix) {
} }
function onUpdated (item) { function onUpdated (item) {
flashMessageList.value.push({ toast.add({
severity: 'success', severity: 'success',
detail: t('{resource} updated', { detail: t('{resource} updated', {
'resource': item['@id'], 'resource': item['@id'],
}), }),
life: 3500,
}); });
} }

@ -93,7 +93,7 @@
</template> </template>
<script setup> <script setup>
import { computed, inject, reactive, ref, watch } from 'vue'; import { computed, reactive, ref, watch } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
@ -113,6 +113,7 @@ import allLocales from '@fullcalendar/core/locales-all';
import toInteger from 'lodash/toInteger'; import toInteger from 'lodash/toInteger';
import Dialog from 'primevue/dialog'; import Dialog from 'primevue/dialog';
import Button from 'primevue/button'; import Button from 'primevue/button';
import { useToast } from 'primevue/usetoast';
const store = useStore(); const store = useStore();
const route = useRoute(); const route = useRoute();
@ -367,17 +368,18 @@ function onCreateEventForm () {
dialog.value = false; dialog.value = false;
} }
const flashMessageList = inject('flashMessageList'); const toast = useToast();
watch( watch(
() => store.state.ccalendarevent.created, () => store.state.ccalendarevent.created,
(created) => { (created) => {
flashMessageList.value.push({ toast.add({
severity: 'success', severity: 'success',
detail: t( detail: t(
'{resource} created', '{resource} created',
{ 'resource': created.resourceNode.title } { 'resource': created.resourceNode.title }
), ),
life: 3500,
}); });
reFetch(); reFetch();
@ -387,12 +389,13 @@ watch(
watch( watch(
() => store.state.ccalendarevent.updated, () => store.state.ccalendarevent.updated,
(updated) => { (updated) => {
flashMessageList.value.push({ toast.add({
severity: 'success', severity: 'success',
detail: t( detail: t(
'{resource} updated', '{resource} updated',
{ 'resource': updated.resourceNode.title } { 'resource': updated.resourceNode.title }
), ),
life: 3500,
}); });
reFetch(); reFetch();

@ -252,11 +252,12 @@ import { useRoute, useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import Toolbar from 'primevue/toolbar' import Toolbar from 'primevue/toolbar'
import Dialog from 'primevue/dialog' import Dialog from 'primevue/dialog'
import { computed, inject, onMounted, ref, watch } from 'vue' import { computed, onMounted, ref, watch } from 'vue'
import { useCidReq } from '../../composables/cidReq' import { useCidReq } from '../../composables/cidReq'
import { useDatatableList } from '../../composables/datatableList' import { useDatatableList } from '../../composables/datatableList'
import { useRelativeDatetime } from '../../composables/formatDate' import { useRelativeDatetime } from '../../composables/formatDate'
import axios from 'axios' import axios from 'axios'
import { useToast } from 'primevue/usetoast';
const store = useStore() const store = useStore()
const route = useRoute() const route = useRoute()
@ -265,7 +266,7 @@ const { t } = useI18n()
const { filters, options, onUpdateOptions, deleteItem } = useDatatableList('Documents') const { filters, options, onUpdateOptions, deleteItem } = useDatatableList('Documents')
const flashMessageList = inject('flashMessageList') const toast = useToast();
const { cid, sid, gid } = useCidReq() const { cid, sid, gid } = useCidReq()
@ -352,9 +353,10 @@ function saveItem () {
store.dispatch('documents/createWithFormData', item.value) store.dispatch('documents/createWithFormData', item.value)
.then(() => { .then(() => {
flashMessageList.value.push({ toast.add({
severity: 'success', severity: 'success',
detail: t('Saved') detail: t('Saved'),
life: 3500,
}) })
onUpdateOptions(options.value) onUpdateOptions(options.value)

@ -7,7 +7,8 @@
<EditLinks <EditLinks
:item="item" :item="item"
links-type="users" links-type="users"
show-share-with-user :show-status="false"
:show-share-with-user="false"
/> />
</DocumentsForm> </DocumentsForm>
<Loading :visible="isLoading" /> <Loading :visible="isLoading" />

@ -9,19 +9,20 @@
</template> </template>
<script setup> <script setup>
import { computed, inject, ref, watch } from 'vue'; import { computed, ref, watch } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import PageForm from '../../components/page/Form.vue'; import PageForm from '../../components/page/Form.vue';
import Loading from '../../components/Loading.vue'; import Loading from '../../components/Loading.vue';
import { useDatatableCreate } from '../../composables/datatableCreate'; import { useDatatableCreate } from '../../composables/datatableCreate';
import { useToast } from 'primevue/usetoast';
const store = useStore(); const store = useStore();
const { createItem, onCreated } = useDatatableCreate('Page'); const { createItem, onCreated } = useDatatableCreate('Page');
const flashMessageList = inject('flashMessageList'); const toast = useToast();
const error = computed(() => store.state['page'].error); const error = computed(() => store.state['page'].error);
const isLoading = computed(() => store.state['page'].isLoading); const isLoading = computed(() => store.state['page'].isLoading);
@ -40,9 +41,10 @@ watch(created, (newCreated) => {
}); });
watch(error, (newError) => { watch(error, (newError) => {
flashMessageList.value.push({ toast.add({
severity: 'error', severity: 'error',
detail: newError, detail: newError,
life: 3500,
}); });
}); });
</script> </script>

@ -228,8 +228,9 @@
import PrimeToolbar from 'primevue/toolbar'; import PrimeToolbar from 'primevue/toolbar';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import { useDatatableList } from '../../composables/datatableList'; import { useDatatableList } from '../../composables/datatableList';
import { computed, inject, onMounted, ref } from 'vue'; import { computed, onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { useToast } from 'primevue/usetoast';
const store = useStore(); const store = useStore();
@ -237,7 +238,7 @@ const { t } = useI18n();
const { filters, options, onUpdateOptions, goToAddItem, onShowItem, goToEditItem, deleteItem } = useDatatableList('Page'); const { filters, options, onUpdateOptions, goToAddItem, onShowItem, goToEditItem, deleteItem } = useDatatableList('Page');
const flashMessageList = inject('flashMessageList'); const toast = useToast();
onMounted(() => { onMounted(() => {
filters.value.loadNode = 0; filters.value.loadNode = 0;
@ -290,9 +291,10 @@ const saveItem = () => {
if (!item.value.id) { if (!item.value.id) {
// item.value.creator // item.value.creator
//createCategory.value(item.value); //createCategory.value(item.value);
flashMessageList.value.push({ toast.add({
severity: 'success', severity: 'success',
detail: t('Saved') detail: t('Saved'),
life: 3500,
}); });
} }
@ -308,9 +310,10 @@ const deleteMultipleItems = () => {
deleteMultipleDialog.value = false; deleteMultipleDialog.value = false;
selectedItems.value = []; selectedItems.value = [];
flashMessageList.value.push({ toast.add({
severity: 'success', severity: 'success',
detail: t('Pages deleted') detail: t('Pages deleted'),
life: 3500,
}); });
}); });

Loading…
Cancel
Save