diff --git a/backend/io/campaign.js b/backend/io/campaign.js index 4853c7af..89396b65 100644 --- a/backend/io/campaign.js +++ b/backend/io/campaign.js @@ -50,7 +50,8 @@ module.exports = io => { console.log(socket.user.username + " ha entrado!"); SetPlayerProperty(campaignId, socket.user._id, "online", true); - io.to(socket.campaign).emit('update-players', sessions[campaignId].players) + // io.to(socket.campaign).emit('update-players', sessions[campaignId].players) + socket.emit('init-info', {players: sessions[campaignId].players}) // console.log(JSON.stringify(sessions[campaignId], null, 4)); } diff --git a/backend/models/Campaign.js b/backend/models/Campaign.js index 919d8fe5..d946c243 100644 --- a/backend/models/Campaign.js +++ b/backend/models/Campaign.js @@ -3,6 +3,7 @@ const Schema = mongoose.Schema; const CampaignSchema = new Schema({ name: {type: String, required: true}, + description: {type: String}, system: {type: String, required: true}, creation_date: { type: Date, default: Date.now}, last_opened: { type: Date, default: Date.now}, diff --git a/backend/routes/campaign.js b/backend/routes/campaign.js index 6f36fc7f..c5d70448 100644 --- a/backend/routes/campaign.js +++ b/backend/routes/campaign.js @@ -99,4 +99,27 @@ router.get('/players', (req, res) => { }).catch((err) => res.json({status: "error", msg: "not-found"})); }); +router.put('/update', (req, res) => { + CampaignUser.find({campaign: req.query.campaign}).then((data) => { + if(data.is_dm){ + let { + name, + description + } = req.body.campaign; + Campaign.findOneAndUpdate({_id: req.query.campaign}, { + name, + description + }).then((campaign) => { + res.json({stauts: "ok", campaign}) + }); + return; + } + res.json({ + status: "error", + msg: "forbidden" + }) + }); + +}); + module.exports = router; \ No newline at end of file diff --git a/backend/uploads/image-1727299238153 b/backend/uploads/image-1727299238153 new file mode 100644 index 00000000..c3f3198d Binary files /dev/null and b/backend/uploads/image-1727299238153 differ diff --git a/client/package-lock.json b/client/package-lock.json index e0a8a740..832cc8e8 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -20,6 +20,7 @@ "marked": "^9.1.6", "marked-katex-extension": "^4.0.1", "mitt": "^3.0.1", + "motion": "^10.18.0", "prismjs": "^1.29.0", "serve": "^14.2.3", "socket.io-client": "^4.7.5", @@ -1193,6 +1194,70 @@ "dev": true, "license": "MIT" }, + "node_modules/@motionone/animation": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", + "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==", + "license": "MIT", + "dependencies": { + "@motionone/easing": "^10.18.0", + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/dom": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.18.0.tgz", + "integrity": "sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==", + "license": "MIT", + "dependencies": { + "@motionone/animation": "^10.18.0", + "@motionone/generators": "^10.18.0", + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/easing": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", + "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==", + "license": "MIT", + "dependencies": { + "@motionone/utils": "^10.18.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/generators": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", + "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==", + "license": "MIT", + "dependencies": { + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/types": { + "version": "10.17.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", + "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==", + "license": "MIT" + }, + "node_modules/@motionone/utils": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz", + "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==", + "license": "MIT", + "dependencies": { + "@motionone/types": "^10.17.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, "node_modules/@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -7521,6 +7586,12 @@ "he": "bin/he" } }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", + "license": "MIT" + }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -9226,6 +9297,18 @@ "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.29.4.tgz", "integrity": "sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==" }, + "node_modules/motion": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/motion/-/motion-10.18.0.tgz", + "integrity": "sha512-MVAZZmwM/cp77BrNe1TxTMldxRPjwBNHheU5aPToqT4rJdZxLiADk58H+a0al5jKLxkB0OdgNq6DiVn11cjvIQ==", + "license": "MIT", + "dependencies": { + "@motionone/animation": "^10.18.0", + "@motionone/dom": "^10.18.0", + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0" + } + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -12844,7 +12927,6 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true, "license": "0BSD" }, "node_modules/type-check": { diff --git a/client/package.json b/client/package.json index dd152db1..213e5f82 100644 --- a/client/package.json +++ b/client/package.json @@ -21,6 +21,7 @@ "marked": "^9.1.6", "marked-katex-extension": "^4.0.1", "mitt": "^3.0.1", + "motion": "^10.18.0", "prismjs": "^1.29.0", "serve": "^14.2.3", "socket.io-client": "^4.7.5", diff --git a/client/src/locale/ca.json b/client/src/locale/ca.json index c8c85d3a..9935a3ba 100644 --- a/client/src/locale/ca.json +++ b/client/src/locale/ca.json @@ -11,7 +11,10 @@ "username": "Username", "password": "Password", "password-confirm": "Confirm your password", - "register": "Register" + "register": "Register", + "quantity": "Quantity", + "weight": "Weight", + "price": "Price" }, "placeholders": { "name": "John Doe", diff --git a/client/src/locale/es-ES.json b/client/src/locale/es-ES.json index 7d8db334..66fa69fe 100644 --- a/client/src/locale/es-ES.json +++ b/client/src/locale/es-ES.json @@ -11,7 +11,10 @@ "username": "Nombre de usuario", "password": "ContraseƱa", "password-confirm": "Confirma tu contraseƱa", - "register": "Registrar-se" + "register": "Registrar-se", + "quantity": "Quantity", + "weight": "Weight", + "price": "Price" }, "placeholders": { "name": "John Doe", diff --git a/client/src/services/Campaign.js b/client/src/services/Campaign.js index f771aa7a..344ea8a5 100644 --- a/client/src/services/Campaign.js +++ b/client/src/services/Campaign.js @@ -28,18 +28,27 @@ function Disconnect(){ } -function DisplayCampaign(data = currentCampaign){ +function DisplayCampaign(data = _currentCampaign){ ClearAll(); CreateWindow('campaign_preview', {campaign: data}); } socket.on('update-players', data => { + _UpdatePlayers(data) +}) + +socket.on('init-info', data => { + _UpdatePlayers(data.players); + DisplayCampaign(); +}) + +function _UpdatePlayers(data){ _players.value = []; Object.keys(data).forEach((key) => { _players.value.push(data[key]); if(GetUser()._id == data[key].user._id) _currentPlayer = data[key]; }); -}) +} export { _currentCampaign, diff --git a/client/src/views/partials/CampaignEntry.vue b/client/src/views/partials/CampaignEntry.vue index edf93454..c7a07ba0 100644 --- a/client/src/views/partials/CampaignEntry.vue +++ b/client/src/views/partials/CampaignEntry.vue @@ -23,7 +23,7 @@ onMounted(() => { function ViewCampaign(){ ConnectToCampaign(data); - DisplayCampaign(data); + // DisplayCampaign(data); } diff --git a/client/src/views/partials/MarkdownEditor.vue b/client/src/views/partials/MarkdownEditor.vue index aad24425..7530e649 100644 --- a/client/src/views/partials/MarkdownEditor.vue +++ b/client/src/views/partials/MarkdownEditor.vue @@ -2,11 +2,13 @@ import { onMounted, ref, watch } from 'vue'; import { marked } from "https://cdn.jsdelivr.net/npm/marked/lib/marked.esm.js"; -const props = defineProps(['done']); +const props = defineProps(['done', 'editable']); import IconButton from '../partials/game/IconButton.vue'; const editing = ref(false); +const isEditable = ref(true); + const editor = ref(null); const preview = ref(null); const text = ref(""); @@ -21,12 +23,26 @@ function PreviewContent(){ preview.value.innerHTML = marked.parse(editor.value.value); } +function UpdateEditable(val){ + if(val) { + isEditable.value = true; + } else { + isEditable.value = false; + editing.value = false; + } +} + onMounted(() => { watch(text, () => { editor.value.value = text.value; preview.value.innerHTML = marked.parse(editor.value.value); }); + UpdateEditable(props.editable); + watch(() => props.editable, () => { + UpdateEditable(props.editable); + }) + editor.value.addEventListener("change", () => { props.done(editor.value.value); }); @@ -44,18 +60,18 @@ defineExpose({
-
+
- +
- +
@@ -68,7 +84,28 @@ defineExpose({ height: 100%; } +.document, .preview { + width: 100%; + max-width: 100%; + height: 100%; + max-height: 100%; + overflow-y: auto; + overflow-x: auto; +} + +.document { + padding: 10px; + max-width: fit-content; + position: absolute; +} + +.editor-content { + display: flex; + width: 100%; +} + .editing { + resize: none; background-color: var(--color-background); } @@ -86,9 +123,4 @@ defineExpose({ z-index: 2; display: flex; } -.preview { - padding: 8px 0 8px 8px; - overflow-y: auto; - height: 100%; -} \ No newline at end of file diff --git a/client/src/views/windows/campaigns/CampaignPreviewWindow.vue b/client/src/views/windows/campaigns/CampaignPreviewWindow.vue index d30f0be5..dd97833a 100644 --- a/client/src/views/windows/campaigns/CampaignPreviewWindow.vue +++ b/client/src/views/windows/campaigns/CampaignPreviewWindow.vue @@ -1,10 +1,10 @@ @@ -90,8 +97,10 @@ function Exit(){
-

Books

- +
+ +
+
@@ -109,6 +118,13 @@ function Exit(){