mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-12 13:24:25 +00:00
Turn component into a small vue app and add public private comment logic
This commit is contained in:
parent
f0f2531fa3
commit
cd40eb3932
@ -216,12 +216,12 @@ class ActivityType extends AbstractType
|
|||||||
]);
|
]);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
if ($activityType->isVisible('privateComment')) {
|
/* if ($activityType->isVisible('privateComment')) {
|
||||||
$builder->add('privateComment', PrivateCommentType::class, [
|
$builder->add('privateComment', PrivateCommentType::class, [
|
||||||
'label' => '' === $activityType->getLabel('privateComment') ? 'private comment' : $activityType->getPrivateCommentLabel(),
|
'label' => '' === $activityType->getLabel('privateComment') ? 'private comment' : $activityType->getPrivateCommentLabel(),
|
||||||
'required' => false,
|
'required' => false,
|
||||||
]);
|
]);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if ($activityType->isVisible('persons')) {
|
if ($activityType->isVisible('persons')) {
|
||||||
$builder->add('persons', HiddenType::class);
|
$builder->add('persons', HiddenType::class);
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
import ConcernedGroups from "./components/ConcernedGroups.vue";
|
import ConcernedGroups from "./components/ConcernedGroups.vue";
|
||||||
import SocialIssuesAcc from "./components/SocialIssuesAcc.vue";
|
import SocialIssuesAcc from "./components/SocialIssuesAcc.vue";
|
||||||
import Location from "./components/Location.vue";
|
import Location from "./components/Location.vue";
|
||||||
import CommentEditor from "ChillMainAssets/vuejs/_components/CommentEditor.vue"
|
import CommentEditor from "ChillMainAssets/vuejs/CommentEditor/component/CommentEditor.vue"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "App",
|
name: "App",
|
||||||
|
@ -84,11 +84,11 @@
|
|||||||
{# {{ form_row(form.comment) }}#}
|
{# {{ form_row(form.comment) }}#}
|
||||||
{#{% endif %}#}
|
{#{% endif %}#}
|
||||||
|
|
||||||
<div id="add-comment"></div>
|
<div id="comment-widget" data-comment-mode="{{ 'both' }}"></div>
|
||||||
|
|
||||||
{%- if form.privateComment is defined -%}
|
{#{%- if form.privateComment is defined -%}#}
|
||||||
{{ form_row(form.privateComment) }}
|
{# {{ form_row(form.privateComment) }}#}
|
||||||
{% endif %}
|
{#{% endif %}#}
|
||||||
|
|
||||||
{%- if form.attendee is defined -%}
|
{%- if form.attendee is defined -%}
|
||||||
{{ form_row(form.attendee) }}
|
{{ form_row(form.attendee) }}
|
||||||
@ -124,6 +124,7 @@
|
|||||||
|
|
||||||
{% block js %}
|
{% block js %}
|
||||||
{{ encore_entry_script_tags('mod_pickentity_type') }}
|
{{ encore_entry_script_tags('mod_pickentity_type') }}
|
||||||
|
{{ encore_entry_script_tags('vue_comment_editor') }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block css %}
|
{% block css %}
|
||||||
|
@ -33,6 +33,8 @@
|
|||||||
|
|
||||||
@import './scss/hover.scss';
|
@import './scss/hover.scss';
|
||||||
|
|
||||||
|
@import './scss/comment-editor.scss';
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BASE LAYOUT POSITION
|
* BASE LAYOUT POSITION
|
||||||
*/
|
*/
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
.comment-container {
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-container {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-wrapper {
|
||||||
|
position: relative;
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div class="comment-container" v-if="shouldRenderPublic">
|
||||||
|
<label class="col-form-label" for="content">{{
|
||||||
|
$t("comment.label_public")
|
||||||
|
}}</label>
|
||||||
|
<comment-editor type="public"></comment-editor>
|
||||||
|
</div>
|
||||||
|
<div class="comment-container" v-if="shouldRenderPrivate">
|
||||||
|
<label class="col-form-label" for="content">{{
|
||||||
|
$t("comment.label_private")
|
||||||
|
}}</label>
|
||||||
|
<comment-editor type="private"></comment-editor>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import CommentEditor from "../CommentEditor/component/CommentEditor.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "App",
|
||||||
|
components: { CommentEditor },
|
||||||
|
props: {
|
||||||
|
commentMode: String,
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
shouldRenderPublic() {
|
||||||
|
return this.commentMode === "public" || this.commentMode === "both";
|
||||||
|
},
|
||||||
|
shouldRenderPrivate() {
|
||||||
|
return this.commentMode === "private" || this.commentMode === "both";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
@ -0,0 +1,89 @@
|
|||||||
|
<template>
|
||||||
|
<div class="editor-container">
|
||||||
|
<div v-if="!isSimple" class="editor-wrapper">
|
||||||
|
<ckeditor
|
||||||
|
name="content"
|
||||||
|
:editor="classicEditor"
|
||||||
|
:config="editorConfig"
|
||||||
|
v-model="content"
|
||||||
|
tag-name="textarea"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div v-else class="editor-wrapper">
|
||||||
|
<textarea
|
||||||
|
v-model="content"
|
||||||
|
name="content"
|
||||||
|
class="form-control"
|
||||||
|
></textarea>
|
||||||
|
</div>
|
||||||
|
<a @click="toggleSimpleEditor" class="toggle-button">{{ buttonText }}</a>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import {Ckeditor} from "@ckeditor/ckeditor5-vue";
|
||||||
|
import classicEditorConfig from "ChillMainAssets/module/ckeditor5/editor_config"
|
||||||
|
import {ClassicEditor} from "ckeditor5";
|
||||||
|
import {onMounted, ref} from "vue"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "CommentEditor",
|
||||||
|
components: {
|
||||||
|
ckeditor: Ckeditor,
|
||||||
|
},
|
||||||
|
setup() {
|
||||||
|
const isSimple = ref(false);
|
||||||
|
const content = ref("");
|
||||||
|
const classicEditor = ClassicEditor;
|
||||||
|
const editorConfig = classicEditorConfig;
|
||||||
|
|
||||||
|
const buttonText = "Simple editor"
|
||||||
|
|
||||||
|
const initializeEditorPreference = () => {
|
||||||
|
const storedValue = localStorage.getItem("isSimpleEditor");
|
||||||
|
if (storedValue !== null) {
|
||||||
|
isSimple.value = storedValue === "true";
|
||||||
|
} else {
|
||||||
|
localStorage.setItem("isSimpleEditor", "false");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const toggleSimpleEditor = () => {
|
||||||
|
isSimple.value = !isSimple.value;
|
||||||
|
localStorage.setItem("isSimpleEditor", String(isSimple.value));
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(() => initializeEditorPreference())
|
||||||
|
|
||||||
|
return {
|
||||||
|
isSimple,
|
||||||
|
toggleSimpleEditor,
|
||||||
|
content: "",
|
||||||
|
classicEditor,
|
||||||
|
editorConfig,
|
||||||
|
buttonText
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.toggle-button {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -10px;
|
||||||
|
left: 10px;
|
||||||
|
background: white;
|
||||||
|
padding: 2px 6px;
|
||||||
|
font-size: 14px;
|
||||||
|
text-decoration: none;
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.1);
|
||||||
|
cursor: pointer;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-wrapper textarea {
|
||||||
|
resize: vertical;
|
||||||
|
min-height: 100px;
|
||||||
|
}
|
||||||
|
</style>
|
@ -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: {
|
||||||
|
comment:{
|
||||||
|
label_public: "Note",
|
||||||
|
label_private: "Note privée",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export { appMessages };
|
@ -0,0 +1,16 @@
|
|||||||
|
import { createApp } from "vue";
|
||||||
|
import App from "./App.vue";
|
||||||
|
import {_createI18n} from "ChillMainAssets/vuejs/_js/i18n";
|
||||||
|
import {appMessages} from "ChillMainAssets/vuejs/CommentEditor/i18n";
|
||||||
|
|
||||||
|
const i18n = _createI18n(appMessages);
|
||||||
|
const commentContainer = document.getElementById('comment-widget');
|
||||||
|
|
||||||
|
const commentMode = commentContainer.dataset.commentMode;
|
||||||
|
|
||||||
|
const app = createApp({
|
||||||
|
template: `<app></app>`,
|
||||||
|
}, { commentMode })
|
||||||
|
.use(i18n)
|
||||||
|
.component("app", App)
|
||||||
|
.mount("#comment-widget");
|
@ -1,91 +0,0 @@
|
|||||||
<template>
|
|
||||||
<teleport to="#add-comment">
|
|
||||||
<div>
|
|
||||||
<label class="col-form-label" for="content">{{
|
|
||||||
$t("comment.label")
|
|
||||||
}}</label>
|
|
||||||
|
|
||||||
<div class="text-md-end">
|
|
||||||
<span class="d-block d-sm-inline-block mb-md-2">
|
|
||||||
<a @click="toggleSimpleEditor" class="flag-toggle">
|
|
||||||
<span :class="{ on: isSimple }">{{ $t("comment.editor_simple") }}</span>
|
|
||||||
<i
|
|
||||||
class="fa"
|
|
||||||
:class="{
|
|
||||||
'fa-toggle-on': !isSimple,
|
|
||||||
'fa-toggle-on fa-flip-horizontal': isSimple,
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<span :class="{ on: !isSimple }">{{ $t("comment.editor_rich") }}</span>
|
|
||||||
</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="!isSimple">
|
|
||||||
<ckeditor
|
|
||||||
name="content"
|
|
||||||
:editor="classicEditor"
|
|
||||||
:config="editorConfig"
|
|
||||||
v-model="content"
|
|
||||||
tag-name="textarea"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-else>
|
|
||||||
<textarea
|
|
||||||
v-model="content"
|
|
||||||
name="content"
|
|
||||||
class="form-control"
|
|
||||||
></textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</teleport>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import {Ckeditor} from "@ckeditor/ckeditor5-vue";
|
|
||||||
import classicEditorConfig from "ChillMainAssets/module/ckeditor5/editor_config"
|
|
||||||
import {ClassicEditor} from "ckeditor5";
|
|
||||||
import {onMounted, ref} from "vue"
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "CommentEditor",
|
|
||||||
components: {
|
|
||||||
ckeditor: Ckeditor,
|
|
||||||
},
|
|
||||||
setup() {
|
|
||||||
const isSimple = ref(false);
|
|
||||||
const content = ref("");
|
|
||||||
const classicEditor = ClassicEditor;
|
|
||||||
const editorConfig = classicEditorConfig;
|
|
||||||
|
|
||||||
const initializeEditorPreference = () => {
|
|
||||||
const storedValue = localStorage.getItem("isSimpleEditor");
|
|
||||||
if (storedValue !== null) {
|
|
||||||
isSimple.value = storedValue === "true"; // Convert string to boolean
|
|
||||||
} else {
|
|
||||||
localStorage.setItem("isSimpleEditor", "false"); // Set default value
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const toggleSimpleEditor = () => {
|
|
||||||
isSimple.value = !isSimple.value;
|
|
||||||
localStorage.setItem("isSimpleEditor", String(isSimple.value)); // Update localStorage
|
|
||||||
};
|
|
||||||
|
|
||||||
onMounted(() => initializeEditorPreference())
|
|
||||||
|
|
||||||
return {
|
|
||||||
isSimple,
|
|
||||||
toggleSimpleEditor,
|
|
||||||
content: "",
|
|
||||||
classicEditor,
|
|
||||||
editorConfig,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped lang="scss">
|
|
||||||
|
|
||||||
</style>
|
|
@ -120,4 +120,8 @@ module.exports = function (encore, entries) {
|
|||||||
"vue_onthefly",
|
"vue_onthefly",
|
||||||
__dirname + "/Resources/public/vuejs/OnTheFly/index.js",
|
__dirname + "/Resources/public/vuejs/OnTheFly/index.js",
|
||||||
);
|
);
|
||||||
|
encore.addEntry(
|
||||||
|
"vue_comment_editor",
|
||||||
|
__dirname + "/Resources/public/vuejs/CommentEditor/index.js",
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user