1
0
mirror of https://github.com/typemill/typemill.git synced 2025-08-06 14:16:46 +02:00

v2.2.0 resolve conflict user getFullName

This commit is contained in:
trendschau
2024-01-29 21:26:08 +01:00
11 changed files with 230 additions and 173 deletions

View File

@@ -332,7 +332,7 @@ class ControllerApiAuthorArticle extends Controller
# META is important e.g. for newsletter, so send it, too
$meta = new Meta();
$metadata = $meta->getMetaData($item);
$metadata = $meta->addMetaDefaults($metadata, $item, $this->settings['author']);
$metadata = $meta->addMetaDefaults($metadata, $item, $this->settings['author'], $request->getAttribute('c_username'));
# $metadata = $meta->addMetaTitleDescription($metadata, $item, $markdownArray);
# dispatch event, e.g. send newsletter and more

View File

@@ -33,9 +33,15 @@ class ControllerApiAuthorMeta extends Controller
$metadata = $meta->getMetaData($item);
if(!$metadata)
if(!$metadata or !isset($metadata['meta']['owner']) OR !$metadata['meta']['owner'])
{
$metadata = $meta->addMetaDefaults($metadata, $item, $this->settings['author']);
$metadata = $meta->addMetaDefaults($metadata, $item, $this->settings['author'], $request->getAttribute('c_username'));
}
#fix for version 1 because owner in meta is often 'false'
if(!isset($metadata['meta']['owner']) OR !$metadata['meta']['owner'])
{
$metadata = $meta->addMetaDefaults($metadata, $item, $this->settings['author'], $request->getAttribute('c_username'));
}
# if user is not allowed to perform this action (e.g. not admin)

View File

@@ -159,14 +159,23 @@ class ControllerWebFrontend extends Controller
]);
}
$refKeyPathArray = explode(".", $refpageinfo['keyPath']);
$refItem = $navigation->getItemWithKeyPath($draftNavigation, $refKeyPathArray);
$refKeyPathArray = explode(".", $refpageinfo['keyPath']);
$refitem = $navigation->getItemWithKeyPath($draftNavigation, $refKeyPathArray);
# GET THE CONTENT FROM REFENCED PAGE
$liveMarkdown = $content->getLiveMarkdown($refItem);
$liveMarkdown = $content->getLiveMarkdown($refitem);
$liveMarkdown = $this->c->get('dispatcher')->dispatch(new OnMarkdownLoaded($liveMarkdown), 'onMarkdownLoaded')->getData();
$markdownArray = $content->markdownTextToArray($liveMarkdown);
# GET THE META FROM REFERENCED PAGE
$refmeta = $meta->getMetaData($refitem);
if($refmeta && isset($refmeta['meta']))
{
$metadata = $meta->getMetaData($refitem);
$metadata = $meta->addMetaDefaults($metadata, $refitem, $this->settings['author']);
$metadata = $meta->addMetaTitleDescription($metadata, $refItem, $markdownArray);
}
break;
}
}

View File

@@ -545,7 +545,6 @@ class ParsedownExtension extends \ParsedownExtra
# has a fix for visual editor mode and option for spanFootnotes
public function buildFootnoteElement()
{
# we do not need a footnote element if we use w3c inline style with spans for footnotes
if($this->spanFootnotes)
{
@@ -564,7 +563,7 @@ class ParsedownExtension extends \ParsedownExtra
),
);
uasort($this->DefinitionData['Footnote'], 'self::sortFootnotes');
uasort($this->DefinitionData['Footnote'], [$this, 'sortFootnotes']);
foreach ($this->DefinitionData['Footnote'] as $definitionId => $DefinitionData)
{

View File

@@ -20,7 +20,7 @@ class Meta
public function getMetaData($item)
{
$metadata = $this->storage->getYaml('contentFolder', '', $item->pathWithoutType . '.yaml');
return $metadata;
}
@@ -78,7 +78,11 @@ class Meta
$user = new User();
if($user->setUser($username))
{
$author = $user->getFullName();
$fullname = $user->getFullName();
if($fullname)
{
$author = $fullname;
}
}
$meta = [];
@@ -112,10 +116,13 @@ class Meta
$meta['meta'] = [];
}
if(!isset($meta['meta']['owner']))
if(!isset($meta['meta']['owner']) OR !$meta['meta']['owner'])
{
$meta['meta']['owner'] = $currentuser;
$modified = true;
if($currentuser)
{
$meta['meta']['owner'] = $currentuser;
$modified = true;
}
}
if(!isset($meta['meta']['author']))
@@ -127,7 +134,11 @@ class Meta
$user = new User();
if($user->setUser($currentuser))
{
$author = $user->getFullName();
$fullname = $user->getFullName();
if($fullname)
{
$author = $fullname;
}
}
}

View File

@@ -71,15 +71,16 @@ class User
public function getFullName()
{
$firstname = isset($this->user['firstname']) ? trim($this->user['firstname']) : false;
$lastname = isset($this->user['lastname']) ? trim($this->user['lastname']) : false;
$firstname = $this->user['firstname'] ?? '';
$lastname = $this->user['lastname'] ?? '';
$fullname = trim($firstname . ' ' . $lastname);
if($firstname OR $lastname)
if($fullname != '')
{
return trim($this->user['firstname'] . ' ' . $this->user['lastname']);
return $fullname;
}
return $this->user['username'];
return false;
}
public function getError()

View File

@@ -142,6 +142,18 @@ abstract class Plugin implements EventSubscriberInterface
return $storage->getError();
}
protected function deletePluginData($filename, $pluginname = false)
{
$pluginname = $this->getPluginName($pluginname);
$storageClass = $this->container->get('settings')['storage'];
$storage = new StorageWrapper($storageClass);
$data = $storage->deleteFile('dataFolder', $pluginname, $filename);
return $data;
}
private function getPluginName($pluginname = NULL)
{
if(!$pluginname)

View File

@@ -547,7 +547,7 @@
margin-left: 2px;
margin-right: 2px;
}
.blox-editor input.urlinput{
.inlineFormatBar input.urlinput{
width: 75%;
min-height: auto;
background: #555;
@@ -555,7 +555,7 @@
border: 0px;
padding: 5px;
}
.blox-editor input.urlinput:focus{
.inlineFormatBar input.urlinput:focus{
outline: 0px;
border: 0px;
}

View File

@@ -96,143 +96,11 @@ const bloxeditor = Vue.createApp({
bloxeditor.component('draggable', vuedraggable);
bloxeditor.component('new-block',{
props: ['markdown', 'index'],
template: `
<div class="w-full mb-4">
<div v-if="!componentType" class="w-full flex p-4 dark:bg-stone-900">
<button v-for="button in formats"
class="p-2 m-1 border border-stone-300 bg-stone-100 dark:border-stone-700 dark:bg-stone-700 hover:bg-stone-700 hover:dark:bg-stone-600 hover:text-stone-50 transition-1"
@click.prevent="setComponentType( $event, button.component )"
:title="button.title"
v-html="button.label">
</button>
</div>
<div v-if="componentType" class="relative bg-stone-100 dark:bg-stone-900">
<component ref="activeComponent" :disabled="disabled" :markdown="newblockmarkdown" :index="index" @saveBlockEvent="saveNewBlock" @updateMarkdownEvent="updateMarkdownFunction" :is="componentType"></component>
<div class="edit-buttons absolute -bottom-3 right-4 z-2 text-xs">
<button class="cancel w-20 p-1 border-r border-stone-700 bg-stone-200 dark:bg-stone-600 hover:bg-rose-500 hover:dark:bg-rose-500 hover:text-white transition-1" :disabled="disabled" @click.prevent="closeComponent">{{ $filters.translate('cancel') }}</button>
<button class="save w-20 p-1 border-l border-stone-700 bg-stone-200 dark:bg-stone-600 hover:bg-teal-500 hover:dark:bg-teal-500 hover:text-white transition-1" :disabled="disabled" @click.prevent="beforeSaveNew()">{{ $filters.translate('save') }}</button>
</div>
</div>
</div>
`,
data: function () {
return {
formats: bloxFormats,
componentType: false,
disabled: false,
newblockmarkdown: '',
unsafedcontent: false,
}
},
mounted: function()
{
eventBus.$on('closeComponents', this.closeComponent);
eventBus.$on('inlineFormat', content => {
this.newblockmarkdown = content;
});
eventBus.$on('lockcontent', content => {
this.unsafedcontent = true;
});
eventBus.$on('unlockcontent', content => {
this.unsafedcontent = false;
});
},
methods: {
setComponentType(event, componenttype)
{
if(this.unsafedcontent)
{
eventBus.$emit('publishermessage', 'Save or cancel your changes first.');
}
else
{
eventBus.$emit('freezeblocks');
this.componentType = componenttype;
}
},
closeComponent()
{
this.componentType = false;
this.newblockmarkdown = '';
eventBus.$emit('unlockcontent');
eventBus.$emit('publisherclear');
},
updateMarkdownFunction(value)
{
eventBus.$emit('lockcontent');
this.newblockmarkdown = value;
},
beforeSaveNew()
{
eventBus.$emit('beforeSave');
},
saveNewBlock()
{
if(
this.newblockmarkdown == undefined ||
this.newblockmarkdown.replace(/(\r\n|\n|\r|\s)/gm,"") == ''
)
{
this.closeComponent();
return;
}
if(typeof this.$refs.activeComponent.saveBlock === "function")
{
this.$refs.activeComponent.saveBlock(this.updatedmarkdown);
return;
}
var self = this;
eventBus.$emit('publisherclear');
tmaxios.post('/api/v1/block',{
'url': data.urlinfo.route,
'block_id': this.index,
'markdown': this.newblockmarkdown.trim(),
})
.then(function (response)
{
self.$root.$data.content = response.data.content;
self.closeComponent();
eventBus.$emit('closeComponents');
if(response.data.navigation)
{
eventBus.$emit('navigation', response.data.navigation);
}
if(response.data.item)
{
eventBus.$emit('item', response.data.item);
}
})
.catch(function (error)
{
if(error.response)
{
let message = handleErrorMessage(error);
if(message)
{
eventBus.$emit('publishermessage', message);
}
}
});
},
}
});
bloxeditor.component('content-block', {
props: ['element', 'index'],
template: `
<div :class="{'edit': edit}">
<div v-if="newblock" class="bg-stone-100 dark:bg-stone-600">
<div v-if="newblock" class="blox-editor bg-stone-100 dark:bg-stone-600">
<div class="w-full flex justify-between bg-stone-200 dark:bg-stone-600">
<p class="p-2 pl-4">Choose a content type</p>
<button class="p-2 border-l border-stone-700 hover:text-white hover:bg-rose-500 transition-1" @click="closeNewBlock">{{ $filters.translate('close') }}</button>
@@ -302,6 +170,7 @@ bloxeditor.component('content-block', {
}
else
{
eventBus.$emit('closeComponents');
eventBus.$emit('freeze');
this.newblock = true;
@@ -314,7 +183,7 @@ bloxeditor.component('content-block', {
eventBus.$emit('unfreeze');
eventBus.$emit('publisherclear');
this.newblock = false;
this.newblock = false;
},
closeEditor()
{
@@ -483,4 +352,141 @@ bloxeditor.component('content-block', {
});
},
},
})
})
bloxeditor.component('new-block',{
props: ['markdown', 'index'],
template: `
<div class="w-full mb-4">
<div v-if="!componentType" class="w-full flex p-4 dark:bg-stone-900">
<button v-for="button in formats"
class="p-2 m-1 border border-stone-300 bg-stone-100 dark:border-stone-700 dark:bg-stone-700 hover:bg-stone-700 hover:dark:bg-stone-600 hover:text-stone-50 transition-1"
@click.prevent="setComponentType( $event, button.component )"
:title="button.title"
v-html="button.label">
</button>
</div>
<div v-if="componentType" class="relative bg-stone-100 dark:bg-stone-900">
<component ref="activeComponent" :disabled="disabled" :markdown="newblockmarkdown" :index="index" @saveBlockEvent="saveNewBlock" @updateMarkdownEvent="updateMarkdownFunction" :is="componentType"></component>
<div class="edit-buttons absolute -bottom-3 right-4 z-2 text-xs">
<button class="cancel w-20 p-1 border-r border-stone-700 bg-stone-200 dark:bg-stone-600 hover:bg-rose-500 hover:dark:bg-rose-500 hover:text-white transition-1" :disabled="disabled" @click.prevent="closeComponent">{{ $filters.translate('cancel') }}</button>
<button class="save w-20 p-1 border-l border-stone-700 bg-stone-200 dark:bg-stone-600 hover:bg-teal-500 hover:dark:bg-teal-500 hover:text-white transition-1" :disabled="disabled" @click.prevent="beforeSaveNew()">{{ $filters.translate('save') }}</button>
</div>
</div>
</div>
`,
data: function () {
return {
formats: bloxFormats,
componentType: false,
disabled: false,
newblockmarkdown: '',
unsafedcontent: false,
}
},
mounted: function()
{
eventBus.$on('closeComponents', this.closeComponent);
eventBus.$on('inlineFormat', content => {
this.newblockmarkdown = content;
});
eventBus.$on('lockcontent', content => {
this.unsafedcontent = true;
});
eventBus.$on('unlockcontent', content => {
this.unsafedcontent = false;
});
},
methods: {
setComponentType(event, componenttype)
{
if(this.unsafedcontent)
{
eventBus.$emit('publishermessage', 'Save or cancel your changes first.');
}
else
{
/* if it is a new block at the end of the page, close other open blocks first */
if(this.index == 999999)
{
eventBus.$emit('closeComponents');
}
eventBus.$emit('freezeblocks');
this.componentType = componenttype;
}
},
closeComponent()
{
this.componentType = false;
this.newblockmarkdown = '';
eventBus.$emit('unlockcontent');
eventBus.$emit('publisherclear');
},
updateMarkdownFunction(value)
{
eventBus.$emit('lockcontent');
this.newblockmarkdown = value;
},
beforeSaveNew()
{
eventBus.$emit('beforeSave');
},
saveNewBlock()
{
if(
this.newblockmarkdown == undefined ||
this.newblockmarkdown.replace(/(\r\n|\n|\r|\s)/gm,"") == ''
)
{
this.closeComponent();
return;
}
if(typeof this.$refs.activeComponent.saveBlock === "function")
{
this.$refs.activeComponent.saveBlock(this.updatedmarkdown);
return;
}
var self = this;
eventBus.$emit('publisherclear');
tmaxios.post('/api/v1/block',{
'url': data.urlinfo.route,
'block_id': this.index,
'markdown': this.newblockmarkdown.trim(),
})
.then(function (response)
{
self.$root.$data.content = response.data.content;
self.closeComponent();
eventBus.$emit('closeComponents');
if(response.data.navigation)
{
eventBus.$emit('navigation', response.data.navigation);
}
if(response.data.item)
{
eventBus.$emit('item', response.data.item);
}
})
.catch(function (error)
{
if(error.response)
{
let message = handleErrorMessage(error);
if(message)
{
eventBus.$emit('publishermessage', message);
}
}
});
},
}
});

View File

@@ -70,7 +70,7 @@ const navigation = Vue.createApp({
{
return tmaxios.defaults.baseURL + '/tm/content/' + data.settings.editor;
},
toggleFolder(name)
toggleFolderOLD(name)
{
var index = this.expanded.indexOf(name);
if (index > -1)
@@ -84,40 +84,53 @@ const navigation = Vue.createApp({
}
localStorage.setItem("expanded", this.expanded.toString());
},
toggleFolder(url)
{
var index = this.expanded.indexOf(url);
if (index > -1)
{
this.expanded.splice(index, 1);
}
else
{
this.expanded.push(url);
}
localStorage.setItem("expanded", this.expanded.toString());
},
expandNavigation()
{
this.expanded = this.getFolderNames(this.navigation, []);
this.expanded = this.getFolderUrls(this.navigation, []);
localStorage.setItem("expanded", this.expanded.toString());
},
collapseNavigation()
{
this.expanded = this.getActiveNames(this.navigation, []);
this.expanded = this.getActiveUrls(this.navigation, []);
localStorage.setItem("expanded", this.expanded.toString());
},
getActiveNames(navigation, expanded)
getActiveUrls(navigation, expanded)
{
for (const item of navigation)
{
if(item.activeParent || item.active)
{
expanded.push(item.name);
expanded.push(item.urlRelWoF);
}
if (item.elementType == 'folder')
{
this.getActiveNames(item.folderContent, expanded);
this.getActiveUrls(item.folderContent, expanded);
}
}
return expanded;
},
getFolderNames(navigation, result)
getFolderUrls(navigation, result)
{
for (const item of navigation)
{
if (item.elementType == 'folder')
{
result.push(item.name);
this.getFolderNames(item.folderContent, result);
result.push(item.urlRelWoF);
this.getFolderUrls(item.folderContent, result);
}
}
return result;
@@ -169,8 +182,8 @@ navigation.component('navilevel',{
<use xlink:href="#icon-eye-blocked"></use>
</svg>
</div>
<div v-if="element.elementType == 'folder' && element.contains == 'pages'" class=" p-1 bg-transparent absolute right-0" @click="callToggle(element.name)">
<svg v-if="isExpanded(element.name)" class="icon icon-cheveron-up">
<div v-if="element.elementType == 'folder' && element.contains == 'pages'" class=" p-1 bg-transparent absolute right-0" @click="callToggle(element.urlRelWoF)">
<svg v-if="isExpanded(element.urlRelWoF)" class="icon icon-cheveron-up">
<use xlink:href="#icon-cheveron-up"></use>
</svg>
<svg v-else class="icon icon-cheveron-down">
@@ -178,7 +191,7 @@ navigation.component('navilevel',{
</svg>
</div>
</div>
<navilevel v-show="isExpanded(element.name)" v-if="element.elementType == 'folder' && element.contains == 'pages'" :list="element.folderContent" :navigation="element.folderContent" :parentId="element.keyPath" :expanded="expanded" />
<navilevel v-show="isExpanded(element.urlRelWoF)" v-if="element.elementType == 'folder' && element.contains == 'pages'" :list="element.folderContent" :navigation="element.folderContent" :parentId="element.keyPath" :expanded="expanded" />
</li>
</template>
<template #footer>
@@ -305,13 +318,13 @@ navigation.component('navilevel',{
{
return tmaxios.defaults.baseURL + '/tm/content/' + data.settings.editor + segment;
},
callToggle(name)
callToggle(url)
{
eventBus.$emit('toggleFolder', name);
eventBus.$emit('toggleFolder', url);
},
isExpanded(name)
isExpanded(url)
{
if(this.expanded.indexOf(name) > -1)
if(this.expanded.indexOf(url) > -1)
{
return true;
}

View File

@@ -1,4 +1,4 @@
version: '2.1.1'
version: '2.1.2'
title: 'Typemill'
author: 'Unknown'
copyright: false