mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-10-02 11:29:41 +00:00
Compare commits
50 Commits
v3.11.0
...
321-text-e
Author | SHA1 | Date | |
---|---|---|---|
b5c9e65986
|
|||
8b2af35e97
|
|||
dc44c46667 | |||
ba571c1a69 | |||
6a364705f2 | |||
b6d454691a | |||
6d7a6932a9 | |||
|
2faf194b15 | ||
f207599d86 | |||
b0959f8cc5 | |||
4c5dee5f0a | |||
f6c98aa0d5 | |||
6d13d184d5 | |||
af36eccfaf | |||
483a20a43f | |||
6d8e2ad825 | |||
86388a63a8 | |||
|
5ea55ebfe5 | ||
f97dc8f931 | |||
|
a9c3aab528 | ||
1181377bd6 | |||
|
2275b7c560 | ||
4a8d298ae5 | |||
3e7f03d331
|
|||
2dcce7b826 | |||
dcd1777a70 | |||
a6eb28175a | |||
7d78512823 | |||
d0cd4792d6 | |||
6d196ead94 | |||
4047d5fd5b | |||
9aac80d834 | |||
7560dc57c6 | |||
10314845f6 | |||
9b84bc4d69 | |||
a2fcf039be | |||
b4d887a372 | |||
0aaa7122da | |||
1bc7f85874 | |||
1d2fd000aa | |||
506df432b0 | |||
c32c18b0e2 | |||
321d569ee9 | |||
cd40eb3932 | |||
f0f2531fa3 | |||
183a220e7b | |||
9df127a82c | |||
04a1412562 | |||
3aef0a185e | |||
578bce31b9 |
6
.changes/unreleased/DX-20250430-144550.yaml
Normal file
6
.changes/unreleased/DX-20250430-144550.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: DX
|
||||
body: Remove dead code for wopi-link module
|
||||
time: 2025-04-30T14:45:50.406111606+02:00
|
||||
custom:
|
||||
Issue: "352"
|
||||
SchemaChange: No schema change
|
7
.changes/unreleased/Feature-20250424-142211.yaml
Normal file
7
.changes/unreleased/Feature-20250424-142211.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
kind: Feature
|
||||
body: Add the document file name to the document title when a user upload a document,
|
||||
unless there is already a document title.
|
||||
time: 2025-04-24T14:22:11.800975422+02:00
|
||||
custom:
|
||||
Issue: "377"
|
||||
SchemaChange: No schema change
|
6
.changes/unreleased/Feature-20250520-095628.yaml
Normal file
6
.changes/unreleased/Feature-20250520-095628.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Feature
|
||||
body: Add desactivation date for social action and issue csv export
|
||||
time: 2025-05-20T09:56:28.108941934+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: No schema change
|
7
.changes/unreleased/Fixed-20250424-133943.yaml
Normal file
7
.changes/unreleased/Fixed-20250424-133943.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
kind: Fixed
|
||||
body: trying to prevent bug of typeerror in doc-history + improved display of document
|
||||
history
|
||||
time: 2025-04-24T13:39:43.878468232+02:00
|
||||
custom:
|
||||
Issue: "376"
|
||||
SchemaChange: No schema change
|
7
.changes/unreleased/Fixed-20250424-163746.yaml
Normal file
7
.changes/unreleased/Fixed-20250424-163746.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
kind: Fixed
|
||||
body: Display previous participation in acc course work even if the person has left
|
||||
the acc course
|
||||
time: 2025-04-24T16:37:46.970203594+02:00
|
||||
custom:
|
||||
Issue: "381"
|
||||
SchemaChange: No schema change
|
6
.changes/unreleased/Fixed-20250505-102715.yaml
Normal file
6
.changes/unreleased/Fixed-20250505-102715.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Fixed
|
||||
body: Fix display of text in calendar events
|
||||
time: 2025-05-05T10:27:15.461493066+02:00
|
||||
custom:
|
||||
Issue: "372"
|
||||
SchemaChange: No schema change
|
6
.changes/unreleased/Fixed-20250514-145339.yaml
Normal file
6
.changes/unreleased/Fixed-20250514-145339.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Fixed
|
||||
body: Add missing translation for user_group.no_user_groups
|
||||
time: 2025-05-14T14:53:39.53927329+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: No schema change
|
6
.changes/unreleased/UX-20250423-172624.yaml
Normal file
6
.changes/unreleased/UX-20250423-172624.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: UX
|
||||
body: Remove default filter in_progress for the page 'my tasks'; Allows for new tasks to be displayed upon opening of the page
|
||||
time: 2025-04-23T17:26:24.45777387+02:00
|
||||
custom:
|
||||
Issue: "374"
|
||||
SchemaChange: No schema change
|
@@ -220,6 +220,7 @@ framework:
|
||||
- attenteModification
|
||||
- attenteMiseEnForme
|
||||
- attenteValidationMiseEnForme
|
||||
- attenteSignature
|
||||
- attenteVisa
|
||||
- postSignature
|
||||
- attenteTraitement
|
||||
|
@@ -11,6 +11,7 @@
|
||||
"@hotwired/stimulus": "^3.0.0",
|
||||
"@luminateone/eslint-baseline": "^1.0.9",
|
||||
"@symfony/stimulus-bridge": "^3.2.0",
|
||||
"@symfony/ux-translator": "file:vendor/symfony/ux-translator/assets",
|
||||
"@symfony/webpack-encore": "^4.1.0",
|
||||
"@tsconfig/node20": "^20.1.4",
|
||||
"@types/dompurify": "^3.0.5",
|
||||
|
@@ -11,7 +11,7 @@ import Location from "./components/Location.vue";
|
||||
|
||||
export default {
|
||||
name: "App",
|
||||
props: ["hasSocialIssues", "hasLocation", "hasPerson"],
|
||||
props: ["hasSocialIssues", "hasLocation", "hasPerson", "isSimpleEditor"],
|
||||
components: {
|
||||
ConcernedGroups,
|
||||
SocialIssuesAcc,
|
||||
|
@@ -14,18 +14,21 @@ const i18n = _createI18n(activityMessages);
|
||||
const hasSocialIssues = document.querySelector("#social-issues-acc") !== null;
|
||||
const hasLocation = document.querySelector("#location") !== null;
|
||||
const hasPerson = document.querySelector("#add-persons") !== null;
|
||||
const isSimpleEditor = true;
|
||||
|
||||
const app = createApp({
|
||||
template: `<app
|
||||
:hasSocialIssues="hasSocialIssues"
|
||||
:hasLocation="hasLocation"
|
||||
:hasPerson="hasPerson"
|
||||
:isSimpleEditor = "isSimpleEditor"
|
||||
></app>`,
|
||||
data() {
|
||||
return {
|
||||
hasSocialIssues,
|
||||
hasLocation,
|
||||
hasPerson,
|
||||
isSimpleEditor
|
||||
};
|
||||
},
|
||||
})
|
||||
|
@@ -126,4 +126,4 @@
|
||||
|
||||
{% block css %}
|
||||
{{ encore_entry_link_tags('mod_pickentity_type') }}
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
@@ -96,23 +96,23 @@
|
||||
</div>
|
||||
</div>
|
||||
<FullCalendar :options="calendarOptions" ref="calendarRef">
|
||||
<template v-slot:eventContent="{ arg }: { arg: { event: EventApi } }">
|
||||
<span :class="eventClasses(arg.event)">
|
||||
<b v-if="arg.event.extendedProps.is === 'remote'">{{
|
||||
arg.event.title
|
||||
<template v-slot:eventContent="{ event }">
|
||||
<span :class="eventClasses(event)">
|
||||
<b v-if="event.extendedProps.is === 'remote'">{{
|
||||
event.title
|
||||
}}</b>
|
||||
<b v-else-if="arg.event.extendedProps.is === 'range'"
|
||||
>{{ arg.event.startStr }} -
|
||||
{{ arg.event.extendedProps.locationName }}</b
|
||||
<b v-else-if="event.extendedProps.is === 'range'"
|
||||
>{{ formatDate(event.startStr) }} -
|
||||
{{ event.extendedProps.locationName }}</b
|
||||
>
|
||||
<b v-else-if="arg.event.extendedProps.is === 'local'">{{
|
||||
arg.event.title
|
||||
<b v-else-if="event.extendedProps.is === 'local'">{{
|
||||
event.title
|
||||
}}</b>
|
||||
<b v-else>no 'is'</b>
|
||||
<a
|
||||
v-if="arg.event.extendedProps.is === 'range'"
|
||||
v-if="event.extendedProps.is === 'range'"
|
||||
class="fa fa-fw fa-times delete"
|
||||
@click.prevent="onClickDelete(arg.event)"
|
||||
@click.prevent="onClickDelete(event)"
|
||||
>
|
||||
</a>
|
||||
</span>
|
||||
@@ -221,13 +221,12 @@ import type {
|
||||
DatesSetArg,
|
||||
EventInput,
|
||||
} from "@fullcalendar/core";
|
||||
import { reactive, computed, ref, onMounted } from "vue";
|
||||
import { computed, ref, onMounted } from "vue";
|
||||
import { useStore } from "vuex";
|
||||
import { key } from "./store";
|
||||
import FullCalendar from "@fullcalendar/vue3";
|
||||
import frLocale from "@fullcalendar/core/locales/fr";
|
||||
import interactionPlugin, {
|
||||
DropArg,
|
||||
EventResizeDoneArg,
|
||||
} from "@fullcalendar/interaction";
|
||||
import timeGridPlugin from "@fullcalendar/timegrid";
|
||||
@@ -237,19 +236,13 @@ import {
|
||||
EventDropArg,
|
||||
EventClickArg,
|
||||
} from "@fullcalendar/core";
|
||||
import {
|
||||
dateToISO,
|
||||
ISOToDate,
|
||||
} from "../../../../../ChillMainBundle/Resources/public/chill/js/date";
|
||||
import { dateToISO, ISOToDate } from "ChillMainAssets/chill/js/date";
|
||||
import VueMultiselect from "vue-multiselect";
|
||||
import { Location } from "../../../../../ChillMainBundle/Resources/public/types";
|
||||
import { Location } from "ChillMainAssets/types";
|
||||
import EditLocation from "./Components/EditLocation.vue";
|
||||
import { useI18n } from "vue-i18n";
|
||||
|
||||
const store = useStore(key);
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const showWeekends = ref(false);
|
||||
const slotDuration = ref("00:15:00");
|
||||
const slotMinTime = ref("09:00:00");
|
||||
@@ -301,6 +294,11 @@ const nextWeeks = computed((): Weeks[] =>
|
||||
}),
|
||||
);
|
||||
|
||||
const formatDate = (datetime: string) => {
|
||||
console.log(typeof datetime);
|
||||
return ISOToDate(datetime);
|
||||
};
|
||||
|
||||
const baseOptions = ref<CalendarOptions>({
|
||||
locale: frLocale,
|
||||
plugins: [interactionPlugin, timeGridPlugin],
|
||||
@@ -353,7 +351,7 @@ const pickedLocation = computed<Location | null>({
|
||||
* return the show classes for the event
|
||||
* @param arg
|
||||
*/
|
||||
const eventClasses = function (arg: EventApi): object {
|
||||
const eventClasses = function (): object {
|
||||
return { calendarRangeItems: true };
|
||||
};
|
||||
|
||||
@@ -431,7 +429,6 @@ function onEventDropOrResize(payload: EventDropArg | EventResizeDoneArg) {
|
||||
if (payload.event.extendedProps.is !== "range") {
|
||||
return;
|
||||
}
|
||||
const changedEvent = payload.event;
|
||||
|
||||
store.dispatch("calendarRanges/patchRangeTime", {
|
||||
calendarRangeId: payload.event.extendedProps.calendarRangeId,
|
||||
|
@@ -10,6 +10,9 @@ const startApp = (
|
||||
collectionEntry: null | HTMLLIElement,
|
||||
): void => {
|
||||
console.log("app started", divElement);
|
||||
|
||||
const inputTitle = collectionEntry?.querySelector("input[type='text']");
|
||||
|
||||
const input_stored_object: HTMLInputElement | null =
|
||||
divElement.querySelector("input[data-stored-object]");
|
||||
if (null === input_stored_object) {
|
||||
@@ -26,9 +29,10 @@ const startApp = (
|
||||
const app = createApp({
|
||||
template:
|
||||
'<drop-file-widget :existingDoc="this.$data.existingDoc" :allowRemove="true" @addDocument="this.addDocument" @removeDocument="removeDocument"></drop-file-widget>',
|
||||
data(vm) {
|
||||
data() {
|
||||
return {
|
||||
existingDoc: existingDoc,
|
||||
inputTitle: inputTitle,
|
||||
};
|
||||
},
|
||||
components: {
|
||||
@@ -38,10 +42,13 @@ const startApp = (
|
||||
addDocument: function ({
|
||||
stored_object,
|
||||
stored_object_version,
|
||||
file_name,
|
||||
}: {
|
||||
stored_object: StoredObject;
|
||||
stored_object_version: StoredObjectVersion;
|
||||
file_name: string;
|
||||
}): void {
|
||||
stored_object.title = file_name;
|
||||
console.log("object added", stored_object);
|
||||
console.log("version added", stored_object_version);
|
||||
this.$data.existingDoc = stored_object;
|
||||
@@ -49,6 +56,11 @@ const startApp = (
|
||||
input_stored_object.value = JSON.stringify(
|
||||
this.$data.existingDoc,
|
||||
);
|
||||
if (this.$data.inputTitle) {
|
||||
if (!this.$data.inputTitle?.value) {
|
||||
this.$data.inputTitle.value = file_name;
|
||||
}
|
||||
}
|
||||
},
|
||||
removeDocument: function (object: StoredObject): void {
|
||||
console.log("catch remove document", object);
|
||||
|
@@ -23,6 +23,7 @@ const emit =
|
||||
{
|
||||
stored_object_version: StoredObjectVersionCreated,
|
||||
stored_object: StoredObject,
|
||||
file_name: string,
|
||||
},
|
||||
) => void
|
||||
>();
|
||||
@@ -114,7 +115,21 @@ const handleFile = async (file: File): Promise<void> => {
|
||||
persisted: false,
|
||||
};
|
||||
|
||||
emit("addDocument", { stored_object, stored_object_version });
|
||||
const fileName = file.name;
|
||||
let file_name = "Nouveau document";
|
||||
const file_name_split = fileName.split(".");
|
||||
if (file_name_split.length > 1) {
|
||||
const extension = file_name_split
|
||||
? file_name_split[file_name_split.length - 1]
|
||||
: "";
|
||||
file_name = fileName.replace(extension, "").slice(0, -1);
|
||||
}
|
||||
|
||||
emit("addDocument", {
|
||||
stored_object,
|
||||
stored_object_version,
|
||||
file_name: file_name,
|
||||
});
|
||||
uploading.value = false;
|
||||
};
|
||||
</script>
|
||||
|
@@ -20,6 +20,7 @@ const emit = defineEmits<{
|
||||
{
|
||||
stored_object: StoredObject,
|
||||
stored_object_version: StoredObjectVersion,
|
||||
file_name: string,
|
||||
},
|
||||
): void;
|
||||
(e: "removeDocument"): void;
|
||||
@@ -42,14 +43,16 @@ const buttonState = computed<"add" | "replace">(() => {
|
||||
function onAddDocument({
|
||||
stored_object,
|
||||
stored_object_version,
|
||||
file_name,
|
||||
}: {
|
||||
stored_object: StoredObject;
|
||||
stored_object_version: StoredObjectVersion;
|
||||
file_name: string;
|
||||
}): void {
|
||||
const message =
|
||||
buttonState.value === "add" ? "Document ajouté" : "Document remplacé";
|
||||
$toast.success(message);
|
||||
emit("addDocument", { stored_object_version, stored_object });
|
||||
emit("addDocument", { stored_object_version, stored_object, file_name });
|
||||
state.showModal = false;
|
||||
}
|
||||
|
||||
|
@@ -19,6 +19,7 @@ const emit = defineEmits<{
|
||||
{
|
||||
stored_object: StoredObject,
|
||||
stored_object_version: StoredObjectVersion,
|
||||
file_name: string,
|
||||
},
|
||||
): void;
|
||||
(e: "removeDocument"): void;
|
||||
@@ -53,11 +54,13 @@ const dav_link_href = computed<string | undefined>(() => {
|
||||
const onAddDocument = ({
|
||||
stored_object,
|
||||
stored_object_version,
|
||||
file_name,
|
||||
}: {
|
||||
stored_object: StoredObject;
|
||||
stored_object_version: StoredObjectVersion;
|
||||
file_name: string;
|
||||
}): void => {
|
||||
emit("addDocument", { stored_object, stored_object_version });
|
||||
emit("addDocument", { stored_object, stored_object_version, file_name });
|
||||
};
|
||||
|
||||
const onRemoveDocument = (e: Event): void => {
|
||||
|
@@ -53,7 +53,7 @@ const onRestored = ({
|
||||
<template>
|
||||
<template v-if="props.versions.length > 0">
|
||||
<div class="container">
|
||||
<template v-for="v in props.versions">
|
||||
<template v-for="v in props.versions" :key="v.id">
|
||||
<history-button-list-item
|
||||
:version="v"
|
||||
:can-edit="canEdit"
|
||||
|
@@ -32,13 +32,17 @@ const onRestore = ({
|
||||
emit("restoreVersion", { newVersion });
|
||||
};
|
||||
|
||||
const isKeptBeforeConversion = computed<boolean>(() =>
|
||||
props.version["point-in-times"].reduce(
|
||||
(accumulator: boolean, pit: StoredObjectPointInTime) =>
|
||||
accumulator || "keep-before-conversion" === pit.reason,
|
||||
false,
|
||||
),
|
||||
);
|
||||
const isKeptBeforeConversion = computed<boolean>(() => {
|
||||
if ("point-in-times" in props.version) {
|
||||
return props.version["point-in-times"].reduce(
|
||||
(accumulator: boolean, pit: StoredObjectPointInTime) =>
|
||||
accumulator || "keep-before-conversion" === pit.reason,
|
||||
false,
|
||||
);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
const isRestored = computed<boolean>(
|
||||
() => props.version.version > 0 && null !== props.version["from-restored"],
|
||||
@@ -90,11 +94,11 @@ const classes = computed<{
|
||||
<div class="col-12">
|
||||
<file-icon :type="version.type"></file-icon>
|
||||
<span
|
||||
><strong>#{{ version.version + 1 }}</strong></span
|
||||
><strong> #{{ version.version + 1 }} </strong></span
|
||||
>
|
||||
<template
|
||||
v-if="version.createdBy !== null && version.createdAt !== null"
|
||||
><strong v-if="version.version == 0">Créé par</strong
|
||||
><strong v-if="version.version == 0">créé par</strong
|
||||
><strong v-else>modifié par</strong>
|
||||
<span class="badge-user"
|
||||
><UserRenderBoxBadge
|
||||
|
@@ -20,9 +20,11 @@
|
||||
{{ mm.mimeIcon(document.object.type) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
<div>
|
||||
<p>{{ document.category.name|localize_translatable_string }}</p>
|
||||
</div>
|
||||
{% if document.category %}
|
||||
<div>
|
||||
<p>{{ document.category.name|localize_translatable_string }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if document.object.hasTemplate %}
|
||||
<div>
|
||||
<p>{{ document.object.template.name|localize_translatable_string }}</p>
|
||||
|
@@ -33,6 +33,8 @@
|
||||
|
||||
@import './scss/hover.scss';
|
||||
|
||||
@import './scss/comment-editor.scss';
|
||||
|
||||
/*
|
||||
* BASE LAYOUT POSITION
|
||||
*/
|
||||
|
@@ -0,0 +1,39 @@
|
||||
.comment-container {
|
||||
margin-top: 1.5rem;
|
||||
}
|
||||
|
||||
.toggle-button {
|
||||
background-color: white;
|
||||
font-size: .8rem;
|
||||
text-decoration: none;
|
||||
position: absolute;
|
||||
bottom: -10px;
|
||||
left: 20px;
|
||||
padding: 2px 6px;
|
||||
cursor: pointer;
|
||||
z-index: 10;
|
||||
transition: left 0.1s ease-in-out;
|
||||
}
|
||||
|
||||
.rich-editor-active .toggle-button {
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.editor-wrapper textarea {
|
||||
resize: vertical;
|
||||
min-height: 100px;
|
||||
}
|
||||
|
||||
.editor-container {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.editor-wrapper {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.hidden-textarea {
|
||||
display: none;
|
||||
}
|
@@ -8,10 +8,10 @@ import {
|
||||
Heading,
|
||||
Link,
|
||||
List,
|
||||
} from "ckeditor5";
|
||||
import coreTranslations from "ckeditor5/translations/fr.js";
|
||||
} from 'ckeditor5';
|
||||
import coreTranslations from 'ckeditor5/translations/fr.js';
|
||||
|
||||
import "ckeditor5/ckeditor5.css";
|
||||
import 'ckeditor5/ckeditor5.css';
|
||||
|
||||
import "./index.scss";
|
||||
|
||||
@@ -41,6 +41,8 @@ export default {
|
||||
"redo",
|
||||
],
|
||||
},
|
||||
translations: [coreTranslations],
|
||||
translations: [
|
||||
coreTranslations
|
||||
],
|
||||
licenseKey: "GPL",
|
||||
};
|
||||
} ;
|
||||
|
@@ -1,12 +1,23 @@
|
||||
import config from "./editor_config";
|
||||
import { ClassicEditor } from "ckeditor5";
|
||||
import App from "../../vuejs/CommentEditor/App.vue"
|
||||
import { createApp, reactive } from "vue";
|
||||
|
||||
const ckeditorFields: NodeListOf<HTMLTextAreaElement> =
|
||||
document.querySelectorAll("textarea[ckeditor]");
|
||||
ckeditorFields.forEach((field: HTMLTextAreaElement): void => {
|
||||
ClassicEditor.create(field, config).catch((error) => {
|
||||
console.error(error.stack);
|
||||
throw error;
|
||||
});
|
||||
document.querySelectorAll("[id^='comment-app']");
|
||||
|
||||
const globalState = reactive({
|
||||
isSimple: localStorage.getItem('editorMode') === 'simple'
|
||||
});
|
||||
window.addEventListener('storage', () => {
|
||||
globalState.isSimple = localStorage.getItem('editorMode') === 'simple';
|
||||
});
|
||||
|
||||
ckeditorFields.forEach((field: HTMLTextAreaElement): void => {
|
||||
const app = createApp(App,{
|
||||
fieldName: field.dataset.fieldName,
|
||||
template: `<app></app>`
|
||||
});
|
||||
|
||||
app.provide('globalState', globalState)
|
||||
.component("app", App)
|
||||
.mount(field);
|
||||
});
|
||||
//Fields.push.apply(Fields, document.querySelectorAll('.cf-fields textarea'));
|
||||
|
@@ -10,6 +10,10 @@ let appsPerInput = new Map();
|
||||
|
||||
function loadDynamicPicker(element) {
|
||||
let apps = element.querySelectorAll('[data-module="pick-dynamic"]');
|
||||
let suggested;
|
||||
let as_id;
|
||||
let submit_on_adding_new_entity;
|
||||
let label;
|
||||
|
||||
apps.forEach(function (el) {
|
||||
const isMultiple = parseInt(el.dataset.multiple) === 1,
|
||||
|
@@ -1,45 +0,0 @@
|
||||
import { createApp } from "vue";
|
||||
import OpenWopiLink from "ChillMainAssets/vuejs/_components/OpenWopiLink";
|
||||
import { _createI18n } from "ChillMainAssets/vuejs/_js/i18n";
|
||||
|
||||
const i18n = _createI18n({});
|
||||
|
||||
//TODO move to chillDocStore or ChillWopi
|
||||
|
||||
/*
|
||||
|
||||
tags to load module:
|
||||
|
||||
<span data-module="wopi-link"
|
||||
data-wopi-url="{{ path('chill_wopi_file_edit', {'fileId': document.uuid}) }}"
|
||||
data-doc-type="{{ document.type|e('html_attr') }}"
|
||||
data-options="{{ options|json_encode }}"
|
||||
></span>
|
||||
|
||||
*/
|
||||
|
||||
window.addEventListener("DOMContentLoaded", function (e) {
|
||||
document
|
||||
.querySelectorAll('span[data-module="wopi-link"]')
|
||||
.forEach(function (el) {
|
||||
createApp({
|
||||
template:
|
||||
'<open-wopi-link :wopiUrl="wopiUrl" :type="type" :options="options"></open-wopi-link>',
|
||||
components: {
|
||||
OpenWopiLink,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
wopiUrl: el.dataset.wopiUrl,
|
||||
type: el.dataset.docType,
|
||||
options:
|
||||
el.dataset.options !== "null"
|
||||
? JSON.parse(el.dataset.options)
|
||||
: {},
|
||||
};
|
||||
},
|
||||
})
|
||||
.use(i18n)
|
||||
.mount(el);
|
||||
});
|
||||
});
|
@@ -0,0 +1,36 @@
|
||||
<template>
|
||||
<div>
|
||||
<div>
|
||||
<comment-editor
|
||||
:isSimple="globalState.isSimple"
|
||||
:fieldName="fieldName"
|
||||
@toggle="toggleEditorMode"
|
||||
></comment-editor>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { defineComponent, inject } from 'vue';
|
||||
import CommentEditor from "../CommentEditor/component/CommentEditor.vue";
|
||||
|
||||
export default defineComponent({
|
||||
name: "App",
|
||||
components: { CommentEditor },
|
||||
props: {
|
||||
fieldName: String
|
||||
},
|
||||
setup() {
|
||||
const globalState = inject('globalState');
|
||||
const toggleEditorMode = () => {
|
||||
globalState.isSimple = !globalState.isSimple;
|
||||
localStorage.setItem('editorMode', globalState.isSimple ? 'simple' : 'rich');
|
||||
};
|
||||
|
||||
return {
|
||||
globalState,
|
||||
toggleEditorMode,
|
||||
};
|
||||
}
|
||||
});
|
||||
</script>
|
@@ -0,0 +1,58 @@
|
||||
<template>
|
||||
<div :class="{'editor-container': true, 'rich-editor-active': !isSimple}">
|
||||
<div v-if="!isSimple" class="editor-wrapper">
|
||||
<ckeditor
|
||||
:name="fieldName"
|
||||
:editor="classicEditor"
|
||||
:config="editorConfig"
|
||||
v-model.lazy="content"
|
||||
tag-name="textarea"
|
||||
/>
|
||||
</div>
|
||||
<div v-else class="editor-wrapper">
|
||||
<textarea
|
||||
v-model.lazy="content"
|
||||
:name="fieldName"
|
||||
class="form-control"
|
||||
></textarea>
|
||||
</div>
|
||||
<a @click="toggleSimpleEditor" class="toggle-button">{{ isSimple ? "rich" : "simple" }}</a>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref, computed, toRefs } from 'vue';
|
||||
import { Ckeditor } from "@ckeditor/ckeditor5-vue";
|
||||
import classicEditorConfig from "ChillMainAssets/module/ckeditor5/editor_config";
|
||||
import { ClassicEditor } from "ckeditor5";
|
||||
|
||||
export default defineComponent({
|
||||
name: "CommentEditor",
|
||||
components: {
|
||||
ckeditor: Ckeditor,
|
||||
},
|
||||
props: {
|
||||
type: String,
|
||||
isSimple: Boolean,
|
||||
fieldName: String,
|
||||
},
|
||||
setup(props, { emit }) {
|
||||
const { isSimple } = toRefs(props);
|
||||
const content = ref("");
|
||||
const classicEditor = ClassicEditor;
|
||||
const editorConfig = classicEditorConfig;
|
||||
|
||||
const toggleSimpleEditor = () => {
|
||||
emit("toggle");
|
||||
};
|
||||
|
||||
return {
|
||||
isSimple,
|
||||
content,
|
||||
classicEditor,
|
||||
editorConfig,
|
||||
toggleSimpleEditor,
|
||||
};
|
||||
}
|
||||
});
|
||||
</script>
|
@@ -0,0 +1,14 @@
|
||||
import {personMessages} from "ChillPersonAssets/vuejs/_js/i18n";
|
||||
import {calendarUserSelectorMessages} from "ChillCalendarAssets/vuejs/_components/CalendarUserSelector/js/i18n";
|
||||
import {activityMessages} from "ChillActivityAssets/vuejs/Activity/i18n";
|
||||
|
||||
const appMessages = {
|
||||
fr: {
|
||||
mode: {
|
||||
simple: "Editeur simple",
|
||||
rich: "Editeur riche"
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
export { appMessages };
|
@@ -1,214 +0,0 @@
|
||||
<template>
|
||||
<a
|
||||
v-if="isOpenDocument"
|
||||
class="btn"
|
||||
:class="[
|
||||
isChangeIcon ? 'change-icon' : '',
|
||||
isChangeClass ? options.changeClass : 'btn-wopilink',
|
||||
]"
|
||||
@click="openModal"
|
||||
>
|
||||
<i v-if="isChangeIcon" class="fa me-2" :class="options.changeIcon"></i>
|
||||
|
||||
<span v-if="!noText">
|
||||
{{ trans(WOPI_ONLINE_EDIT_DOCUMENT) }}
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<teleport to="body">
|
||||
<div class="wopi-frame" v-if="isOpenDocument">
|
||||
<modal
|
||||
v-if="modal.showModal"
|
||||
:modalDialogClass="modal.modalDialogClass"
|
||||
:hideFooter="true"
|
||||
@close="modal.showModal = false"
|
||||
>
|
||||
<template #header>
|
||||
<img class="logo" :src="logo" height="45" />
|
||||
<span class="ms-auto me-3">
|
||||
<span v-if="options.title">{{ options.title }}</span>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<template #body>
|
||||
<div v-if="loading" class="loading">
|
||||
<i
|
||||
class="fa fa-circle-o-notch fa-spin fa-3x"
|
||||
:title="trans(WOPI_LOADING)"
|
||||
></i>
|
||||
</div>
|
||||
<iframe :src="this.wopiUrl" @load="loaded"></iframe>
|
||||
</template>
|
||||
</modal>
|
||||
</div>
|
||||
<div v-else>
|
||||
<Modal
|
||||
v-if="modal.showModal"
|
||||
modalDialogClass="modal-sm"
|
||||
@close="modal.showModal = false"
|
||||
>
|
||||
<template v-slot:header>
|
||||
<h3>{{ trans(WOPI_INVALID_TITLE) }}</h3>
|
||||
</template>
|
||||
<template v-slot:body>
|
||||
<div class="alert alert-warning">
|
||||
{{ trans(WOPI_ONLINE_EDIT_DOCUMENT) }}
|
||||
</div>
|
||||
</template>
|
||||
</Modal>
|
||||
</div>
|
||||
</teleport>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed } from "vue";
|
||||
import {
|
||||
trans,
|
||||
WOPI_ONLINE_EDIT_DOCUMENT,
|
||||
WOPI_INVALID_TITLE,
|
||||
WOPI_LOADING,
|
||||
} from "translator";
|
||||
import Modal from "ChillMainAssets/vuejs/_components/Modal";
|
||||
import logo from "ChillMainAssets/chill/img/logo-chill-sans-slogan_white.png";
|
||||
|
||||
// Props
|
||||
const props = defineProps({
|
||||
wopiUrl: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
options: {
|
||||
type: Object,
|
||||
required: false,
|
||||
},
|
||||
});
|
||||
|
||||
// data
|
||||
const modal = ref({
|
||||
showModal: false,
|
||||
modalDialogClass: "modal-fullscreen",
|
||||
});
|
||||
const loading = ref(false);
|
||||
|
||||
// MIME types
|
||||
const mime = [
|
||||
// TODO temporary hardcoded. to be replaced by twig extension or a collabora server query
|
||||
"application/clarisworks",
|
||||
"application/coreldraw",
|
||||
"application/macwriteii",
|
||||
"application/msword",
|
||||
"application/pdf",
|
||||
"application/vnd.lotus-1-2-3",
|
||||
"application/vnd.ms-excel",
|
||||
"application/vnd.ms-excel.sheet.binary.macroEnabled.12",
|
||||
"application/vnd.ms-excel.sheet.macroEnabled.12",
|
||||
"application/vnd.ms-excel.template.macroEnabled.12",
|
||||
"application/vnd.ms-powerpoint",
|
||||
"application/vnd.ms-powerpoint.presentation.macroEnabled.12",
|
||||
"application/vnd.ms-powerpoint.template.macroEnabled.12",
|
||||
"application/vnd.ms-visio.drawing",
|
||||
"application/vnd.ms-word.document.macroEnabled.12",
|
||||
"application/vnd.ms-word.template.macroEnabled.12",
|
||||
"application/vnd.ms-works",
|
||||
"application/vnd.oasis.opendocument.chart",
|
||||
"application/vnd.oasis.opendocument.formula",
|
||||
"application/vnd.oasis.opendocument.graphics",
|
||||
"application/vnd.oasis.opendocument.graphics-flat-xml",
|
||||
"application/vnd.oasis.opendocument.graphics-template",
|
||||
"application/vnd.oasis.opendocument.presentation",
|
||||
"application/vnd.oasis.opendocument.presentation-flat-xml",
|
||||
"application/vnd.oasis.opendocument.presentation-template",
|
||||
"application/vnd.oasis.opendocument.spreadsheet",
|
||||
"application/vnd.oasis.opendocument.spreadsheet-flat-xml",
|
||||
"application/vnd.oasis.opendocument.spreadsheet-template",
|
||||
"application/vnd.oasis.opendocument.text",
|
||||
"application/vnd.oasis.opendocument.text-flat-xml",
|
||||
"application/vnd.oasis.opendocument.text-master",
|
||||
"application/vnd.oasis.opendocument.text-master-template",
|
||||
"application/vnd.oasis.opendocument.text-template",
|
||||
"application/vnd.oasis.opendocument.text-web",
|
||||
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
||||
"application/vnd.openxmlformats-officedocument.presentationml.slideshow",
|
||||
"application/vnd.openxmlformats-officedocument.presentationml.template",
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.template",
|
||||
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||||
"application/vnd.openxmlformats-officedocument.wordprocessingml.template",
|
||||
"application/vnd.sun.xml.calc",
|
||||
"application/vnd.sun.xml.calc.template",
|
||||
"application/vnd.sun.xml.chart",
|
||||
"application/vnd.sun.xml.draw",
|
||||
"application/vnd.sun.xml.draw.template",
|
||||
"application/vnd.sun.xml.impress",
|
||||
"application/vnd.sun.xml.impress.template",
|
||||
"application/vnd.sun.xml.math",
|
||||
"application/vnd.sun.xml.writer",
|
||||
"application/vnd.sun.xml.writer.global",
|
||||
"application/vnd.sun.xml.writer.template",
|
||||
"application/vnd.visio",
|
||||
"application/vnd.visio2013",
|
||||
"application/vnd.wordperfect",
|
||||
"application/x-abiword",
|
||||
"application/x-aportisdoc",
|
||||
"application/x-dbase",
|
||||
"application/x-dif-document",
|
||||
"application/x-fictionbook+xml",
|
||||
"application/x-gnumeric",
|
||||
"application/x-hwp",
|
||||
"application/x-iwork-keynote-sffkey",
|
||||
"application/x-iwork-numbers-sffnumbers",
|
||||
"application/x-iwork-pages-sffpages",
|
||||
"application/x-mspublisher",
|
||||
"application/x-mswrite",
|
||||
"application/x-pagemaker",
|
||||
"application/x-sony-bbeb",
|
||||
"application/x-t602",
|
||||
];
|
||||
|
||||
// Computed
|
||||
const isOpenDocument = computed(() => mime.includes(props.type));
|
||||
|
||||
const noText = computed(() => props.options?.noText === true);
|
||||
|
||||
const isChangeIcon = computed(() => !!props.options?.changeIcon);
|
||||
|
||||
const isChangeClass = computed(() => !!props.options?.changeClass);
|
||||
|
||||
// Methods
|
||||
const openModal = () => {
|
||||
loading.value = true;
|
||||
modal.value.showModal = true;
|
||||
};
|
||||
|
||||
const loaded = () => {
|
||||
loading.value = false;
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
div.wopi-frame {
|
||||
div.modal-header {
|
||||
border-bottom: 0;
|
||||
background-color: var(--bs-primary);
|
||||
color: white;
|
||||
}
|
||||
div.modal-body {
|
||||
padding: 0;
|
||||
overflow-y: unset !important;
|
||||
iframe {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
div.loading {
|
||||
position: absolute;
|
||||
color: var(--bs-chill-gray);
|
||||
top: calc(50% - 30px);
|
||||
left: calc(50% - 30px);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
@@ -54,6 +54,11 @@ const messages = {
|
||||
residential_address: "Adresse de résidence",
|
||||
located_at: "réside chez",
|
||||
},
|
||||
comment: {
|
||||
label: "Commentaire",
|
||||
editor_simple: "Simple",
|
||||
editor_rich: "Riche"
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
|
@@ -214,7 +214,9 @@
|
||||
|
||||
{% block private_comment_widget %}
|
||||
{% for entry in form %}
|
||||
{{ form_widget(entry) }}
|
||||
<div id="comment-app-{{ form.vars.id }}" data-field-name="{{ form.vars.full_name }}">
|
||||
{{ form_widget(entry, { attr: { ckeditor: 'true' } }) }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -224,7 +226,9 @@
|
||||
|
||||
{% block comment_widget %}
|
||||
{% for entry in form %}
|
||||
{{ form_widget(entry) }}
|
||||
<div id="comment-app-{{ form.vars.id }}" data-field-name="{{ form.vars.full_name }}">
|
||||
{{ form_widget(entry, { attr: { ckeditor: 'true' } }) }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endblock comment_widget %}
|
||||
|
||||
|
@@ -9,7 +9,6 @@
|
||||
{{ encore_entry_script_tags('mod_pickentity_type') }}
|
||||
{{ encore_entry_script_tags('mod_entity_workflow_subscribe') }}
|
||||
{{ encore_entry_script_tags('page_workflow_show') }}
|
||||
{{ encore_entry_script_tags('mod_wopi_link') }}
|
||||
{{ encore_entry_script_tags('mod_document_action_buttons_group') }}
|
||||
{{ encore_entry_script_tags('mod_workflow_attachment') }}
|
||||
{% endblock %}
|
||||
@@ -19,7 +18,6 @@
|
||||
{{ encore_entry_link_tags('mod_pickentity_type') }}
|
||||
{{ encore_entry_link_tags('mod_entity_workflow_subscribe') }}
|
||||
{{ encore_entry_link_tags('page_workflow_show') }}
|
||||
{{ encore_entry_link_tags('mod_wopi_link') }}
|
||||
{{ encore_entry_link_tags('mod_document_action_buttons_group') }}
|
||||
{{ encore_entry_link_tags('mod_workflow_attachment') }}
|
||||
{% endblock %}
|
||||
|
@@ -86,10 +86,6 @@ module.exports = function (encore, entries) {
|
||||
"mod_entity_workflow_pick",
|
||||
__dirname + "/Resources/public/module/entity-workflow-pick/index.js",
|
||||
);
|
||||
encore.addEntry(
|
||||
"mod_wopi_link",
|
||||
__dirname + "/Resources/public/module/wopi-link/index.js",
|
||||
);
|
||||
encore.addEntry(
|
||||
"mod_pick_postal_code",
|
||||
__dirname + "/Resources/public/module/pick-postal-code/index.js",
|
||||
|
@@ -59,6 +59,7 @@ user_group:
|
||||
inactive: Inactif
|
||||
with_users: Membres
|
||||
no_users: Aucun utilisateur associé
|
||||
no_user_groups: Aucune groupe d'utilisateurs
|
||||
no_admin_users: Aucun administrateur
|
||||
Label: Nom du groupe
|
||||
BackgroundColor: Couleur de fond du badge
|
||||
@@ -112,6 +113,8 @@ Any comment: Aucun commentaire
|
||||
# comment embeddable
|
||||
No comment associated: Aucun commentaire
|
||||
private comment: Notes privées
|
||||
comment_public: Note
|
||||
comment_private: Note privée
|
||||
|
||||
#pagination
|
||||
Previous: Précédent
|
||||
@@ -739,6 +742,7 @@ export:
|
||||
id: Identifiant de l'action
|
||||
social_issue_id: Identifiant de la problématique sociale
|
||||
social_issue: Problématique sociale
|
||||
desactivation_date: Date de désactivation
|
||||
social_issue_ordering: Ordre de la problématique sociale
|
||||
action_label: Action d'accompagnement
|
||||
action_ordering: Ordre
|
||||
|
@@ -207,7 +207,6 @@ final class AccompanyingCourseController extends \Symfony\Bundle\FrameworkBundle
|
||||
$works = $this->workRepository->findByAccompanyingPeriod(
|
||||
$accompanyingCourse,
|
||||
['startDate' => 'DESC', 'endDate' => 'DESC'],
|
||||
3
|
||||
);
|
||||
|
||||
$counters = [
|
||||
@@ -220,7 +219,7 @@ final class AccompanyingCourseController extends \Symfony\Bundle\FrameworkBundle
|
||||
'accompanyingCourse' => $accompanyingCourse,
|
||||
'withoutHousehold' => $withoutHousehold,
|
||||
'participationsByHousehold' => $accompanyingCourse->actualParticipationsByHousehold(),
|
||||
'works' => $works,
|
||||
'works' => \array_slice($works, 0, 3),
|
||||
'activities' => \array_slice($activities, 0, 3),
|
||||
'counters' => $counters,
|
||||
]);
|
||||
|
@@ -22,7 +22,7 @@ use Doctrine\ORM\Mapping as ORM;
|
||||
class MaritalStatus
|
||||
{
|
||||
#[ORM\Id]
|
||||
#[ORM\Column(type: \Doctrine\DBAL\Types\Types::STRING, length: 7)]
|
||||
#[ORM\Column(type: \Doctrine\DBAL\Types\Types::STRING, length: 15)]
|
||||
private ?string $id;
|
||||
|
||||
#[ORM\Column(type: \Doctrine\DBAL\Types\Types::JSON)]
|
||||
|
@@ -87,7 +87,7 @@ class AccompanyingCourseMenuBuilder implements LocalMenuBuilderInterface
|
||||
], ])
|
||||
->setExtras([
|
||||
'order' => 40,
|
||||
'counter' => count($period->getOpenWorks()) > 0 ? count($period->getOpenWorks()) : null,
|
||||
'counter' => count($period->getWorks()) > 0 ? count($period->getWorks()) : null,
|
||||
]);
|
||||
}
|
||||
|
||||
|
@@ -61,15 +61,15 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ClassicEditor } from "ckeditor5";
|
||||
import { Ckeditor } from "@ckeditor/ckeditor5-vue";
|
||||
import {ClassicEditor} from "ckeditor5";
|
||||
import {Ckeditor} from "@ckeditor/ckeditor5-vue";
|
||||
import classicEditorConfig from "ChillMainAssets/module/ckeditor5/editor_config";
|
||||
import { mapState } from "vuex";
|
||||
|
||||
export default {
|
||||
name: "Comment",
|
||||
components: {
|
||||
ckeditor: Ckeditor,
|
||||
ckeditor: Ckeditor
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@@ -39,15 +39,15 @@
|
||||
<script>
|
||||
import Modal from "ChillMainAssets/vuejs/_components/Modal.vue";
|
||||
import { makeFetch } from "ChillMainAssets/lib/api/apiMethods";
|
||||
import { Ckeditor } from "@ckeditor/ckeditor5-vue";
|
||||
import { Ckeditor }from "@ckeditor/ckeditor5-vue";
|
||||
import classicEditorConfig from "ChillMainAssets/module/ckeditor5/editor_config";
|
||||
import { ClassicEditor } from "ckeditor5";
|
||||
import {ClassicEditor} from "ckeditor5";
|
||||
|
||||
export default {
|
||||
name: "WriteComment",
|
||||
components: {
|
||||
Modal,
|
||||
ckeditor: Ckeditor,
|
||||
ckeditor: Ckeditor
|
||||
},
|
||||
props: ["resource"],
|
||||
emits: ["updateComment"],
|
||||
|
@@ -46,8 +46,7 @@
|
||||
<label class="col-form-label">{{ $t("comments") }}</label>
|
||||
<ckeditor
|
||||
v-model="note"
|
||||
:editor="classicEditor"
|
||||
:config="editorConfig"
|
||||
:editor="classicEditor" :config="editorConfig"
|
||||
tag-name="textarea"
|
||||
></ckeditor>
|
||||
</div>
|
||||
@@ -208,6 +207,29 @@
|
||||
</label>
|
||||
</div>
|
||||
</li>
|
||||
<li
|
||||
v-for="p in getPreviousPersons"
|
||||
:key="p.id"
|
||||
class="alert alert-danger"
|
||||
>
|
||||
<div class="form-check">
|
||||
<input
|
||||
v-model="personsPicked"
|
||||
:value="p.id"
|
||||
type="checkbox"
|
||||
class="me-2 form-check-input"
|
||||
:id="'person_check' + p.id"
|
||||
/>
|
||||
<label :for="'person_check' + p.id" class="form-check-label">
|
||||
<person-text :person="p"></person-text>
|
||||
</label>
|
||||
</div>
|
||||
<span
|
||||
><i class="fa fa-warning"></i> {{
|
||||
$t("warning_previous_persons")
|
||||
}}</span
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -440,7 +462,7 @@
|
||||
import { mapState, mapGetters } from "vuex";
|
||||
import { Ckeditor } from "@ckeditor/ckeditor5-vue";
|
||||
import classicEditorConfig from "ChillMainAssets/module/ckeditor5/editor_config";
|
||||
import { ClassicEditor } from "ckeditor5";
|
||||
import {ClassicEditor} from "ckeditor5";
|
||||
import AddResult from "./components/AddResult.vue";
|
||||
import AddEvaluation from "./components/AddEvaluation.vue";
|
||||
import AddPersons from "ChillPersonAssets/vuejs/_components/AddPersons.vue";
|
||||
@@ -497,6 +519,8 @@ const i18n = {
|
||||
notification_notify_referrer: "Notifier le référent",
|
||||
notification_notify_any: "Notifier d'autres utilisateurs",
|
||||
notification_send: "Envoyer une notification",
|
||||
warning_previous_persons:
|
||||
"Cet usager n'est désormais plus concerné par le parcours, bien qu'il ait été associé à l'action par le passé.",
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -583,6 +607,7 @@ export default {
|
||||
"hasHandlingThirdParty",
|
||||
"hasThirdParties",
|
||||
"hasReferrers",
|
||||
"getPreviousPersons",
|
||||
]),
|
||||
classicEditor: () => ClassicEditor,
|
||||
editorConfig: () => classicEditorConfig,
|
||||
|
@@ -273,7 +273,7 @@
|
||||
|
||||
<script>
|
||||
import { ISOToDatetime } from "ChillMainAssets/chill/js/date";
|
||||
import { Ckeditor } from "@ckeditor/ckeditor5-vue";
|
||||
import {Ckeditor} from "@ckeditor/ckeditor5-vue";
|
||||
import { ClassicEditor } from "ckeditor5";
|
||||
import classicEditorConfig from "ChillMainAssets/module/ckeditor5/editor_config";
|
||||
import { mapState } from "vuex";
|
||||
@@ -535,11 +535,11 @@ export default {
|
||||
title: title,
|
||||
});
|
||||
},
|
||||
addDocument({ stored_object, stored_object_version }) {
|
||||
addDocument({ stored_object, stored_object_version, file_name }) {
|
||||
let document = {
|
||||
type: "accompanying_period_work_evaluation_document",
|
||||
storedObject: stored_object,
|
||||
title: "Nouveau document",
|
||||
title: file_name,
|
||||
};
|
||||
this.$store.commit("addDocument", {
|
||||
key: this.evaluation.key,
|
||||
|
@@ -87,6 +87,11 @@ const store = createStore({
|
||||
|
||||
return [];
|
||||
},
|
||||
getPreviousPersons(state) {
|
||||
return state.personsPicked.filter(
|
||||
(p) => !state.personsReachables.map((pr) => pr.id).includes(p.id),
|
||||
);
|
||||
},
|
||||
buildPayload(state) {
|
||||
return {
|
||||
type: "accompanying_period_work",
|
||||
@@ -607,8 +612,7 @@ const store = createStore({
|
||||
submit({ getters, state, commit }, callback) {
|
||||
let payload = getters.buildPayload,
|
||||
params = new URLSearchParams({ entity_version: state.version }),
|
||||
url = `/api/1.0/person/accompanying-course/work/${state.work.id}.json?${params}`,
|
||||
errors = [];
|
||||
url = `/api/1.0/person/accompanying-course/work/${state.work.id}.json?${params}`;
|
||||
commit("setIsPosting", true);
|
||||
|
||||
// console.log('the social action', payload);
|
||||
|
@@ -30,8 +30,7 @@
|
||||
|
||||
<div class="item-row comment">
|
||||
<ckeditor
|
||||
:editor="classicEditor"
|
||||
:config="editorConfig"
|
||||
:editor="classicEditor" :config="editorConfig"
|
||||
v-model="comment"
|
||||
tag-name="textarea"
|
||||
/>
|
||||
@@ -103,9 +102,9 @@ div.participation-details {
|
||||
<script>
|
||||
import { mapGetters } from "vuex";
|
||||
import PersonRenderBox from "ChillPersonAssets/vuejs/_components/Entity/PersonRenderBox.vue";
|
||||
import { Ckeditor } from "@ckeditor/ckeditor5-vue";
|
||||
import {Ckeditor} from "@ckeditor/ckeditor5-vue";
|
||||
import classicEditorConfig from "ChillMainAssets/module/ckeditor5/editor_config";
|
||||
import { ClassicEditor } from "ckeditor5";
|
||||
import {ClassicEditor} from "ckeditor5";
|
||||
|
||||
export default {
|
||||
name: "MemberDetails",
|
||||
|
@@ -1,25 +1,25 @@
|
||||
<template>
|
||||
<ckeditor
|
||||
name="content"
|
||||
:placeholder="
|
||||
<ckeditor
|
||||
name="content"
|
||||
:placeholder="
|
||||
$t('household_members_editor.positioning.comment_placeholder')
|
||||
"
|
||||
:editor="editor"
|
||||
:config="editorConfig"
|
||||
v-model="content"
|
||||
tag-name="textarea"
|
||||
/>
|
||||
:editor="editor"
|
||||
:config="editorConfig"
|
||||
v-model="content"
|
||||
tag-name="textarea"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { Ckeditor } from "@ckeditor/ckeditor5-vue";
|
||||
import { Ckeditor } from "@ckeditor/ckeditor5-vue";
|
||||
import classicEditorConfig from "ChillMainAssets/module/ckeditor5/editor_config";
|
||||
import { ClassicEditor } from "ckeditor5";
|
||||
import {ClassicEditor} from "ckeditor5";
|
||||
|
||||
export default {
|
||||
name: "PersonComment.vue",
|
||||
components: {
|
||||
ckeditor: Ckeditor,
|
||||
ckeditor: Ckeditor
|
||||
},
|
||||
props: ["conc"],
|
||||
computed: {
|
||||
|
@@ -8,7 +8,7 @@ L'usager {{ oldPersonLocation|chill_entity_render_string }} a déménagé.
|
||||
Son adresse était utilisée pour localiser le parcours n°{{ period.id }}, dont vous êtes
|
||||
le référent.
|
||||
|
||||
En conséquence de ce déménage, le parcours est toujours localisé à cette adresse, mais à l'aide d'une
|
||||
En conséquence de ce déménagement, le parcours est toujours localisé à cette adresse, mais à l'aide d'une
|
||||
adresse temporaire.
|
||||
|
||||
Si vous continuez à suivre le parcours, vous pouvez le localiser à nouveau auprès de l'adresse de
|
||||
|
@@ -30,9 +30,6 @@ final readonly class SocialActionCSVExportService
|
||||
private TranslatorInterface $translator,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* @param list<SocialAction> $actions
|
||||
*/
|
||||
public function generateCsv(array $actions): Writer
|
||||
{
|
||||
// CSV headers
|
||||
@@ -84,7 +81,8 @@ final readonly class SocialActionCSVExportService
|
||||
'action_id' => $action->getId(),
|
||||
'social_issue_id' => $action->getIssue()?->getId(),
|
||||
'problematique_label' => null !== $action->getIssue() ? $this->socialIssueRender->renderString($action->getIssue(), []) : null,
|
||||
'social_issue_ordering' => null !== $action->getIssue() ? $action->getIssue()->getOrdering() : null,
|
||||
'desactivation_date' => $action->getDesactivationDate()?->format('Y-m-d'),
|
||||
'social_issue_ordering' => $action->getIssue()?->getOrdering(),
|
||||
'action_label' => $this->socialActionRender->renderString($action, []),
|
||||
'action_ordering' => $action->getOrdering(),
|
||||
'goal_label' => null !== $goal ? $this->stringHelper->localize($goal->getTitle()) : null,
|
||||
|
@@ -44,6 +44,7 @@ readonly class SocialIssueCSVExportService
|
||||
'Id',
|
||||
'Label',
|
||||
'Social issue',
|
||||
'export.social_action_list.desactivation_date',
|
||||
'socialIssue.isParent?',
|
||||
'socialIssue.Parent id',
|
||||
]
|
||||
@@ -66,6 +67,7 @@ readonly class SocialIssueCSVExportService
|
||||
'id' => $issue->getId(),
|
||||
'label' => $this->stringHelper->localize($issue->getTitle()),
|
||||
'title' => $this->socialIssueRender->renderString($issue, []),
|
||||
'export.social_action_list.desactivation_date' => $issue->getDesactivationDate()?->format('Y-m-d'),
|
||||
'isParent' => $issue->hasChildren() ? 'X' : '',
|
||||
'parent_id' => null !== $issue->getParent() ? $issue->getParent()->getId() : '',
|
||||
];
|
||||
|
@@ -52,6 +52,7 @@ class SocialActionCsvExporterTest extends TestCase
|
||||
// Création d'une instance réelle de SocialAction sans objectifs ni résultats
|
||||
$actionWithoutGoalsOrResults = new SocialAction();
|
||||
$actionWithoutGoalsOrResults->setIssue($socialIssue);
|
||||
$actionWithoutGoalsOrResults->setDesactivationDate(new \DateTime('2025-05-21'));
|
||||
$actionWithoutGoalsOrResults->setTitle(['fr' => 'Action without goals or results']);
|
||||
|
||||
// Création d'une instance réelle de SocialAction avec des objectifs et des résultats
|
||||
@@ -61,6 +62,7 @@ class SocialActionCsvExporterTest extends TestCase
|
||||
|
||||
$actionWithGoalsAndResults = new SocialAction();
|
||||
$actionWithGoalsAndResults->setIssue($socialIssue);
|
||||
$actionWithGoalsAndResults->setDesactivationDate(new \DateTime('2025-05-21'));
|
||||
$actionWithGoalsAndResults->setTitle(['fr' => 'Action with goals and results']);
|
||||
$actionWithGoalsAndResults->addGoal($goalWithResult);
|
||||
|
||||
@@ -68,6 +70,7 @@ class SocialActionCsvExporterTest extends TestCase
|
||||
$goalWithoutResult = new Goal();
|
||||
$actionWithGoalsNoResults = new SocialAction();
|
||||
$actionWithGoalsNoResults->setIssue($socialIssue);
|
||||
$actionWithGoalsNoResults->setDesactivationDate(new \DateTime('2025-05-21'));
|
||||
$actionWithGoalsNoResults->setTitle(['fr' => 'Action with goals and no results']);
|
||||
$actionWithGoalsNoResults->addGoal($goalWithoutResult);
|
||||
|
||||
@@ -76,6 +79,7 @@ class SocialActionCsvExporterTest extends TestCase
|
||||
$resultWithNoAction->setTitle(['fr' => 'Result without objectives']);
|
||||
$actionWithResultsNoGoals = new SocialAction();
|
||||
$actionWithResultsNoGoals->setIssue($socialIssue);
|
||||
$actionWithResultsNoGoals->setDesactivationDate(new \DateTime('2025-05-21'));
|
||||
$actionWithResultsNoGoals->setTitle(['fr' => 'Action with results and no goals']);
|
||||
$actionWithResultsNoGoals->addResult($resultWithNoAction);
|
||||
|
||||
@@ -91,11 +95,11 @@ class SocialActionCsvExporterTest extends TestCase
|
||||
$this->assertStringContainsString('Action with results and no goals', $content);
|
||||
|
||||
self::assertEquals(<<<'CSV'
|
||||
export.social_action_list.action_id,export.social_action_list.social_issue_id,export.social_action_list.problematique_label,export.social_action_list.social_issue_ordering,export.social_action_list.action_label,export.social_action_list.action_ordering,export.social_action_list.goal_label,export.social_action_list.goal_id,export.social_action_list.goal_result_label,export.social_action_list.goal_result_id,export.social_action_list.result_without_goal_label,export.social_action_list.result_without_goal_id,export.social_action_list.evaluation_title,export.social_action_list.evaluation_id,export.social_action_list.evaluation_url,export.social_action_list.evaluation_delay_month,export.social_action_list.evaluation_delay_week,export.social_action_list.evaluation_delay_day
|
||||
,,"Issue Title",0,"Action with goals and results",0,"not found",,"not found",,,,,,,,,
|
||||
,,"Issue Title",0,"Action without goals or results",0,,,,,,,,,,,,
|
||||
,,"Issue Title",0,"Action with goals and no results",0,"not found",,,,,,,,,,,
|
||||
,,"Issue Title",0,"Action with results and no goals",0,,,,,"Result without objectives",,,,,,,
|
||||
export.social_action_list.action_id,export.social_action_list.social_issue_id,export.social_action_list.problematique_label,export.social_action_list.desactivation_date,export.social_action_list.social_issue_ordering,export.social_action_list.action_label,export.social_action_list.action_ordering,export.social_action_list.goal_label,export.social_action_list.goal_id,export.social_action_list.goal_result_label,export.social_action_list.goal_result_id,export.social_action_list.result_without_goal_label,export.social_action_list.result_without_goal_id,export.social_action_list.evaluation_title,export.social_action_list.evaluation_id,export.social_action_list.evaluation_url,export.social_action_list.evaluation_delay_month,export.social_action_list.evaluation_delay_week,export.social_action_list.evaluation_delay_day
|
||||
,,"Issue Title",2025-05-21,0,"Action with goals and results",0,"not found",,"not found",,,,,,,,,
|
||||
,,"Issue Title",2025-05-21,0,"Action without goals or results",0,,,,,,,,,,,,
|
||||
,,"Issue Title",2025-05-21,0,"Action with goals and no results",0,"not found",,,,,,,,,,,
|
||||
,,"Issue Title",2025-05-21,0,"Action with results and no goals",0,,,,,"Result without objectives",,,,,,,
|
||||
|
||||
CSV, $content);
|
||||
}
|
||||
|
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* Chill is a software for social workers
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Chill\Migrations\Person;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
final class Version20250514115009 extends AbstractMigration
|
||||
{
|
||||
public function getDescription(): string
|
||||
{
|
||||
return 'Allow more characters for maritalstatus id';
|
||||
}
|
||||
|
||||
public function up(Schema $schema): void
|
||||
{
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE chill_person_marital_status ALTER id TYPE VARCHAR(15)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE chill_person_person ALTER maritalstatus_id TYPE VARCHAR(15)
|
||||
SQL);
|
||||
}
|
||||
|
||||
public function down(Schema $schema): void
|
||||
{
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE chill_person_person ALTER maritalStatus_id TYPE VARCHAR(7)
|
||||
SQL);
|
||||
$this->addSql(<<<'SQL'
|
||||
ALTER TABLE chill_person_marital_status ALTER id TYPE VARCHAR(7)
|
||||
SQL);
|
||||
}
|
||||
}
|
@@ -624,7 +624,7 @@ final class SingleTaskController extends AbstractController
|
||||
->addCheckbox('status', $statuses, $statuses, $statusTrans);
|
||||
|
||||
$states = $this->singleTaskStateRepository->findAllExistingStates();
|
||||
$checked = array_values(array_filter($states, fn (string $state) => !in_array($state, ['closed', 'canceled', 'validated'], true)));
|
||||
$checked = array_values(array_filter($states, fn (string $state) => !in_array($state, ['in_progress', 'closed', 'canceled', 'validated'], true)));
|
||||
|
||||
if ([] !== $states) {
|
||||
$filterBuilder
|
||||
|
Reference in New Issue
Block a user