gdpr audit implemented, email log, vollmachten, pdf delete cancel data privacy and vollmachten, removed message no id card in engergy car, and other contracts that are not telecom contracts, added insert counter for engery

This commit is contained in:
2026-03-21 11:59:53 +01:00
parent 89cf92eaf5
commit f2876f877e
1491 changed files with 265550 additions and 1292 deletions
+150
View File
@@ -0,0 +1,150 @@
import { mergeAttributes, Node, textblockTypeInputRule } from '@tiptap/core'
/**
* The heading level options.
*/
export type Level = 1 | 2 | 3 | 4 | 5 | 6
export interface HeadingOptions {
/**
* The available heading levels.
* @default [1, 2, 3, 4, 5, 6]
* @example [1, 2, 3]
*/
levels: Level[]
/**
* The HTML attributes for a heading node.
* @default {}
* @example { class: 'foo' }
*/
HTMLAttributes: Record<string, any>
}
declare module '@tiptap/core' {
interface Commands<ReturnType> {
heading: {
/**
* Set a heading node
* @param attributes The heading attributes
* @example editor.commands.setHeading({ level: 1 })
*/
setHeading: (attributes: { level: Level }) => ReturnType
/**
* Toggle a heading node
* @param attributes The heading attributes
* @example editor.commands.toggleHeading({ level: 1 })
*/
toggleHeading: (attributes: { level: Level }) => ReturnType
}
}
}
/**
* This extension allows you to create headings.
* @see https://www.tiptap.dev/api/nodes/heading
*/
export const Heading = Node.create<HeadingOptions>({
name: 'heading',
addOptions() {
return {
levels: [1, 2, 3, 4, 5, 6],
HTMLAttributes: {},
}
},
content: 'inline*',
group: 'block',
defining: true,
addAttributes() {
return {
level: {
default: 1,
rendered: false,
},
}
},
parseHTML() {
return this.options.levels.map((level: Level) => ({
tag: `h${level}`,
attrs: { level },
}))
},
renderHTML({ node, HTMLAttributes }) {
const hasLevel = this.options.levels.includes(node.attrs.level)
const level = hasLevel ? node.attrs.level : this.options.levels[0]
return [`h${level}`, mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]
},
parseMarkdown: (token, helpers) => {
// Convert 'heading' token to heading node
// marked provides 'depth' property (1-6) for heading level
return helpers.createNode('heading', { level: token.depth || 1 }, helpers.parseInline(token.tokens || []))
},
renderMarkdown: (node, h) => {
const level = node.attrs?.level ? parseInt(node.attrs.level as string, 10) : 1
const headingChars = '#'.repeat(level)
if (!node.content) {
return ''
}
// Use current context for proper joining/spacing
return `${headingChars} ${h.renderChildren(node.content)}`
},
addCommands() {
return {
setHeading:
attributes =>
({ commands }) => {
if (!this.options.levels.includes(attributes.level)) {
return false
}
return commands.setNode(this.name, attributes)
},
toggleHeading:
attributes =>
({ commands }) => {
if (!this.options.levels.includes(attributes.level)) {
return false
}
return commands.toggleNode(this.name, 'paragraph', attributes)
},
}
},
addKeyboardShortcuts() {
return this.options.levels.reduce(
(items, level) => ({
...items,
...{
[`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level }),
},
}),
{},
)
},
addInputRules() {
return this.options.levels.map(level => {
return textblockTypeInputRule({
find: new RegExp(`^(#{${Math.min(...this.options.levels)},${level}})\\s$`),
type: this.type,
getAttributes: {
level,
},
})
})
},
})
+5
View File
@@ -0,0 +1,5 @@
import { Heading } from './heading.js'
export * from './heading.js'
export default Heading