diff --git a/xcpq/buildtime/xcpq_editor/static/css/.ignore b/xcpq/buildtime/xcpq_editor/static/_archiv/css/.ignore similarity index 100% rename from xcpq/buildtime/xcpq_editor/static/css/.ignore rename to xcpq/buildtime/xcpq_editor/static/_archiv/css/.ignore diff --git a/xcpq/buildtime/xcpq_editor/static/css/daisyui.css b/xcpq/buildtime/xcpq_editor/static/_archiv/css/daisyui.css similarity index 100% rename from xcpq/buildtime/xcpq_editor/static/css/daisyui.css rename to xcpq/buildtime/xcpq_editor/static/_archiv/css/daisyui.css diff --git a/xcpq/buildtime/xcpq_editor/static/js/.ignore b/xcpq/buildtime/xcpq_editor/static/_archiv/fonts/.ignore similarity index 100% rename from xcpq/buildtime/xcpq_editor/static/js/.ignore rename to xcpq/buildtime/xcpq_editor/static/_archiv/fonts/.ignore diff --git a/xcpq/buildtime/xcpq_editor/static/_archiv/images/SimplyCPQ_Logo.svg b/xcpq/buildtime/xcpq_editor/static/_archiv/images/SimplyCPQ_Logo.svg new file mode 100644 index 000000000..3088fe1da --- /dev/null +++ b/xcpq/buildtime/xcpq_editor/static/_archiv/images/SimplyCPQ_Logo.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xcpq/buildtime/xcpq_editor/static/_archiv/images/screens/dummy.webp b/xcpq/buildtime/xcpq_editor/static/_archiv/images/screens/dummy.webp new file mode 100644 index 000000000..e4782c958 Binary files /dev/null and b/xcpq/buildtime/xcpq_editor/static/_archiv/images/screens/dummy.webp differ diff --git a/xcpq/buildtime/xcpq_editor/static/_archiv/images/users/tsindt.png b/xcpq/buildtime/xcpq_editor/static/_archiv/images/users/tsindt.png new file mode 100644 index 000000000..54f4d575c Binary files /dev/null and b/xcpq/buildtime/xcpq_editor/static/_archiv/images/users/tsindt.png differ diff --git a/xcpq/buildtime/xcpq_editor/static/_archiv/index.html b/xcpq/buildtime/xcpq_editor/static/_archiv/index.html new file mode 100644 index 000000000..33338e0ed --- /dev/null +++ b/xcpq/buildtime/xcpq_editor/static/_archiv/index.html @@ -0,0 +1,259 @@ + + + + + + + + X-CPQ by Simply CPQ + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+
+ +
+
+
+

Willkommen zum X-CPQ Material Editor

+

Hier können Sie Ihre Materialien und Produkte konfigurieren und verwalten.

+ +
+

Beispiel Treeview (DaisyUI)

+
    +
  • +
    + Root +
      +
    • +
      + Child 1 +
        +
      • +
        + Child 1.1 +
          +
        • Child 1.1.1
        • +
        • Child 1.1.2
        • +
        +
        +
      • +
      • +
        + Child 1.2 +
          +
        • Child 1.2.1
        • +
        • Child 1.2.2
        • +
        +
        +
      • +
      • +
        + Child 1.3 +
          +
        • Child 1.3.1
        • +
        • Child 1.3.2
        • +
        +
        +
      • +
      +
      +
    • +
    • +
      + Child 2 +
        +
      • +
        + Child 2.1 +
          +
        • Child 2.1.1
        • +
        • Child 2.1.2
        • +
        +
        +
      • +
      • +
        + Child 2.2 +
          +
        • Child 2.2.1
        • +
        • Child 2.2.2
        • +
        +
        +
      • +
      • +
        + Child 2.3 +
          +
        • Child 2.3.1
        • +
        • Child 2.3.2
        • +
        +
        +
      • +
      +
      +
    • +
    • +
      + Child 3 +
        +
      • +
        + Child 3.1 +
          +
        • Child 3.1.1
        • +
        • Child 3.1.2
        • +
        +
        +
      • +
      • +
        + Child 3.2 +
          +
        • Child 3.2.1
        • +
        • Child 3.2.2
        • +
        +
        +
      • +
      • +
        + Child 3.3 +
          +
        • Child 3.3.1
        • +
        • Child 3.3.2
        • +
        +
        +
      • +
      +
      +
    • +
    • +
      + Child 4 +
        +
      • +
        + Child 4.1 +
          +
        • Child 4.1.1
        • +
        • Child 4.1.2
        • +
        +
        +
      • +
      • +
        + Child 4.2 +
          +
        • Child 4.2.1
        • +
        • Child 4.2.2
        • +
        +
        +
      • +
      • +
        + Child 4.3 +
          +
        • Child 4.3.1
        • +
        • Child 4.3.2
        • +
        +
        +
      • +
      +
      +
    • +
    +
    +
  • +
+
+
+
+

Eigenschaften

+

Damit in allen Produkten bei der Pflege von Eigenschaften keine Missverständnisse entstehen, gibt es bei X-CPQ einen Eigenschaften-Pool. In diesem Pool werden alle zu verwendenen Eigenschaften und deren Wertebereiche in Form von Properties und deren mögliche Werte in Form von Listen spezifiziert. Diese Properties können fachlich noch in sog. Property-Groups eingeordnet werden. Z.B. kann ich eine Eigenschaft "Farbe" definieren, die die Werte "Rot, Grün und Blau" annehmen kann. Jedem Produkt, bei welchem ich eine Eigenschaft "Farbe" habe, weise ich dann dieses Property zu nud schrenke bei Bedarf den Wertebereich ein, z.B. bei einem blauen Produkt auf "Blau". Damit verhinde ich, dass es für gleichartige Eigenschaften unterschiedliche Begriffe verwendet werden, z.B. "Farbe", "Farbton" und "Ton" bedeuten eigentlich das gleiche.

+
+
+
+
+
+
+
+ + + +
+ + + \ No newline at end of file diff --git a/xcpq/buildtime/xcpq_editor/static/_archiv/js/.ignore b/xcpq/buildtime/xcpq_editor/static/_archiv/js/.ignore new file mode 100644 index 000000000..e69de29bb diff --git a/xcpq/buildtime/xcpq_editor/static/_archiv/js/htmx.js b/xcpq/buildtime/xcpq_editor/static/_archiv/js/htmx.js new file mode 100644 index 000000000..4d76457bd --- /dev/null +++ b/xcpq/buildtime/xcpq_editor/static/_archiv/js/htmx.js @@ -0,0 +1,5342 @@ +var htmx = (function() { + 'use strict' + + // Public API + const htmx = { + // Tsc madness here, assigning the functions directly results in an invalid TypeScript output, but reassigning is fine + /* Event processing */ + /** @type {typeof onLoadHelper} */ + onLoad: null, + /** @type {typeof processNode} */ + process: null, + /** @type {typeof addEventListenerImpl} */ + on: null, + /** @type {typeof removeEventListenerImpl} */ + off: null, + /** @type {typeof triggerEvent} */ + trigger: null, + /** @type {typeof ajaxHelper} */ + ajax: null, + /* DOM querying helpers */ + /** @type {typeof find} */ + find: null, + /** @type {typeof findAll} */ + findAll: null, + /** @type {typeof closest} */ + closest: null, + /** + * Returns the input values that would resolve for a given element via the htmx value resolution mechanism + * + * @see https://htmx.org/api/#values + * + * @param {Element} elt the element to resolve values on + * @param {HttpVerb} type the request type (e.g. **get** or **post**) non-GET's will include the enclosing form of the element. Defaults to **post** + * @returns {Object} + */ + values: function(elt, type) { + const inputValues = getInputValues(elt, type || 'post') + return inputValues.values + }, + /* DOM manipulation helpers */ + /** @type {typeof removeElement} */ + remove: null, + /** @type {typeof addClassToElement} */ + addClass: null, + /** @type {typeof removeClassFromElement} */ + removeClass: null, + /** @type {typeof toggleClassOnElement} */ + toggleClass: null, + /** @type {typeof takeClassForElement} */ + takeClass: null, + /** @type {typeof swap} */ + swap: null, + /* Extension entrypoints */ + /** @type {typeof defineExtension} */ + defineExtension: null, + /** @type {typeof removeExtension} */ + removeExtension: null, + /* Debugging */ + /** @type {typeof logAll} */ + logAll: null, + /** @type {typeof logNone} */ + logNone: null, + /* Debugging */ + /** + * The logger htmx uses to log with + * + * @see https://htmx.org/api/#logger + */ + logger: null, + /** + * A property holding the configuration htmx uses at runtime. + * + * Note that using a [meta tag](https://htmx.org/docs/#config) is the preferred mechanism for setting these properties. + * + * @see https://htmx.org/api/#config + */ + config: { + /** + * Whether to use history. + * @type boolean + * @default true + */ + historyEnabled: true, + /** + * The number of pages to keep in **sessionStorage** for history support. + * @type number + * @default 10 + */ + historyCacheSize: 10, + /** + * @type boolean + * @default false + */ + refreshOnHistoryMiss: false, + /** + * The default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted. + * @type HtmxSwapStyle + * @default 'innerHTML' + */ + defaultSwapStyle: 'innerHTML', + /** + * The default delay between receiving a response from the server and doing the swap. + * @type number + * @default 0 + */ + defaultSwapDelay: 0, + /** + * The default delay between completing the content swap and settling attributes. + * @type number + * @default 20 + */ + defaultSettleDelay: 20, + /** + * If true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present. + * @type boolean + * @default true + */ + includeIndicatorStyles: true, + /** + * The class to place on indicators when a request is in flight. + * @type string + * @default 'htmx-indicator' + */ + indicatorClass: 'htmx-indicator', + /** + * The class to place on triggering elements when a request is in flight. + * @type string + * @default 'htmx-request' + */ + requestClass: 'htmx-request', + /** + * The class to temporarily place on elements that htmx has added to the DOM. + * @type string + * @default 'htmx-added' + */ + addedClass: 'htmx-added', + /** + * The class to place on target elements when htmx is in the settling phase. + * @type string + * @default 'htmx-settling' + */ + settlingClass: 'htmx-settling', + /** + * The class to place on target elements when htmx is in the swapping phase. + * @type string + * @default 'htmx-swapping' + */ + swappingClass: 'htmx-swapping', + /** + * Allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility. + * @type boolean + * @default true + */ + allowEval: true, + /** + * If set to false, disables the interpretation of script tags. + * @type boolean + * @default true + */ + allowScriptTags: true, + /** + * If set, the nonce will be added to inline scripts. + * @type string + * @default '' + */ + inlineScriptNonce: '', + /** + * If set, the nonce will be added to inline styles. + * @type string + * @default '' + */ + inlineStyleNonce: '', + /** + * The attributes to settle during the settling phase. + * @type string[] + * @default ['class', 'style', 'width', 'height'] + */ + attributesToSettle: ['class', 'style', 'width', 'height'], + /** + * Allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates. + * @type boolean + * @default false + */ + withCredentials: false, + /** + * @type number + * @default 0 + */ + timeout: 0, + /** + * The default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later**. + * @type {'full-jitter' | ((retryCount:number) => number)} + * @default "full-jitter" + */ + wsReconnectDelay: 'full-jitter', + /** + * The type of binary data being received over the WebSocket connection + * @type BinaryType + * @default 'blob' + */ + wsBinaryType: 'blob', + /** + * @type string + * @default '[hx-disable], [data-hx-disable]' + */ + disableSelector: '[hx-disable], [data-hx-disable]', + /** + * @type {'auto' | 'instant' | 'smooth'} + * @default 'instant' + */ + scrollBehavior: 'instant', + /** + * If the focused element should be scrolled into view. + * @type boolean + * @default false + */ + defaultFocusScroll: false, + /** + * If set to true htmx will include a cache-busting parameter in GET requests to avoid caching partial responses by the browser + * @type boolean + * @default false + */ + getCacheBusterParam: false, + /** + * If set to true, htmx will use the View Transition API when swapping in new content. + * @type boolean + * @default false + */ + globalViewTransitions: false, + /** + * htmx will format requests with these methods by encoding their parameters in the URL, not the request body + * @type {(HttpVerb)[]} + * @default ['get', 'delete'] + */ + methodsThatUseUrlParams: ['get', 'delete'], + /** + * If set to true, disables htmx-based requests to non-origin hosts. + * @type boolean + * @default false + */ + selfRequestsOnly: true, + /** + * If set to true htmx will not update the title of the document when a title tag is found in new content + * @type boolean + * @default false + */ + ignoreTitle: false, + /** + * Whether the target of a boosted element is scrolled into the viewport. + * @type boolean + * @default true + */ + scrollIntoViewOnBoost: true, + /** + * The cache to store evaluated trigger specifications into. + * You may define a simple object to use a never-clearing cache, or implement your own system using a [proxy object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy) + * @type {Object|null} + * @default null + */ + triggerSpecsCache: null, + /** @type boolean */ + disableInheritance: false, + /** @type HtmxResponseHandlingConfig[] */ + responseHandling: [ + { code: '204', swap: false }, + { code: '[23]..', swap: true }, + { code: '[45]..', swap: false, error: true } + ], + /** + * Whether to process OOB swaps on elements that are nested within the main response element. + * @type boolean + * @default true + */ + allowNestedOobSwaps: true, + /** + * Whether to treat history cache miss full page reload requests as a "HX-Request" by returning this response header + * This should always be disabled when using HX-Request header to optionally return partial responses + * @type boolean + * @default true + */ + historyRestoreAsHxRequest: true, + /** + * Whether to report input validation errors to the end user and update focus to the first input that fails validation. + * This should always be enabled as this matches default browser form submit behaviour + * @type boolean + * @default false + */ + reportValidityOfForms: false + }, + /** @type {typeof parseInterval} */ + parseInterval: null, + /** + * proxy of window.location used for page reload functions + * @type location + */ + location, + /** @type {typeof internalEval} */ + _: null, + version: '2.0.10' + } + // Tsc madness part 2 + htmx.onLoad = onLoadHelper + htmx.process = processNode + htmx.on = addEventListenerImpl + htmx.off = removeEventListenerImpl + htmx.trigger = triggerEvent + htmx.ajax = ajaxHelper + htmx.find = find + htmx.findAll = findAll + htmx.closest = closest + htmx.remove = removeElement + htmx.addClass = addClassToElement + htmx.removeClass = removeClassFromElement + htmx.toggleClass = toggleClassOnElement + htmx.takeClass = takeClassForElement + htmx.swap = swap + htmx.defineExtension = defineExtension + htmx.removeExtension = removeExtension + htmx.logAll = logAll + htmx.logNone = logNone + htmx.parseInterval = parseInterval + htmx._ = internalEval + + const internalAPI = { + addTriggerHandler, + bodyContains, + canAccessLocalStorage, + findThisElement, + filterValues, + swap, + hasAttribute, + getAttributeValue, + getClosestAttributeValue, + getClosestMatch, + getExpressionVars, + getHeaders, + getInputValues, + getInternalData, + getSwapSpecification, + getTriggerSpecs, + getTarget, + makeFragment, + mergeObjects, + makeSettleInfo, + oobSwap, + querySelectorExt, + settleImmediately, + shouldCancel, + triggerEvent, + triggerErrorEvent, + withExtensions + } + + const VERBS = ['get', 'post', 'put', 'delete', 'patch'] + const VERB_SELECTOR = VERBS.map(function(verb) { + return '[hx-' + verb + '], [data-hx-' + verb + ']' + }).join(', ') + + //= =================================================================== + // Utilities + //= =================================================================== + + /** + * Parses an interval string consistent with the way htmx does. Useful for plugins that have timing-related attributes. + * + * Caution: Accepts an int followed by either **s** or **ms**. All other values use **parseFloat** + * + * @see https://htmx.org/api/#parseInterval + * + * @param {string} str timing string + * @returns {number|undefined} + */ + function parseInterval(str) { + if (str == undefined) { + return undefined + } + + let interval = NaN + if (str.slice(-2) == 'ms') { + interval = parseFloat(str.slice(0, -2)) + } else if (str.slice(-1) == 's') { + interval = parseFloat(str.slice(0, -1)) * 1000 + } else if (str.slice(-1) == 'm') { + interval = parseFloat(str.slice(0, -1)) * 1000 * 60 + } else { + interval = parseFloat(str) + } + return isNaN(interval) ? undefined : interval + } + + /** + * @param {Node} elt + * @param {string} name + * @returns {(string | null)} + */ + function getRawAttribute(elt, name) { + return elt instanceof Element && elt.getAttribute(name) + } + + /** + * @param {Element} elt + * @param {string} qualifiedName + * @returns {boolean} + */ + // resolve with both hx and data-hx prefixes + function hasAttribute(elt, qualifiedName) { + return !!elt.hasAttribute && (elt.hasAttribute(qualifiedName) || + elt.hasAttribute('data-' + qualifiedName)) + } + + /** + * + * @param {Node} elt + * @param {string} qualifiedName + * @returns {(string | null)} + */ + function getAttributeValue(elt, qualifiedName) { + return getRawAttribute(elt, qualifiedName) || getRawAttribute(elt, 'data-' + qualifiedName) + } + + /** + * @param {Node} elt + * @returns {Node | null} + */ + function parentElt(elt) { + const parent = elt.parentElement + if (!parent && elt.parentNode instanceof ShadowRoot) return elt.parentNode + return parent + } + + /** + * @returns {Document} + */ + function getDocument() { + return document + } + + /** + * @param {Node} elt + * @param {boolean} global + * @returns {Node|Document} + */ + function getRootNode(elt, global) { + return elt.getRootNode ? elt.getRootNode({ composed: global }) : getDocument() + } + + /** + * @param {Node} elt + * @param {(e:Node) => boolean} condition + * @returns {Node | null} + */ + function getClosestMatch(elt, condition) { + while (elt && !condition(elt)) { + elt = parentElt(elt) + } + + return elt || null + } + + /** + * @param {Element} initialElement + * @param {Element} ancestor + * @param {string} attributeName + * @returns {string|null} + */ + function getAttributeValueWithDisinheritance(initialElement, ancestor, attributeName) { + const attributeValue = getAttributeValue(ancestor, attributeName) + const disinherit = getAttributeValue(ancestor, 'hx-disinherit') + var inherit = getAttributeValue(ancestor, 'hx-inherit') + if (initialElement !== ancestor) { + if (htmx.config.disableInheritance) { + if (inherit && (inherit === '*' || inherit.split(' ').indexOf(attributeName) >= 0)) { + return attributeValue + } else { + return null + } + } + if (disinherit && (disinherit === '*' || disinherit.split(' ').indexOf(attributeName) >= 0)) { + return 'unset' + } + } + return attributeValue + } + + /** + * @param {Element} elt + * @param {string} attributeName + * @returns {string | null} + */ + function getClosestAttributeValue(elt, attributeName) { + let closestAttr = null + getClosestMatch(elt, function(e) { + return !!(closestAttr = getAttributeValueWithDisinheritance(elt, asElement(e), attributeName)) + }) + if (closestAttr !== 'unset') { + return closestAttr + } + } + + /** + * @param {Node} elt + * @param {string} selector + * @returns {boolean} + */ + function matches(elt, selector) { + return elt instanceof Element && elt.matches(selector) + } + + /** + * @param {string} str + * @returns {string} + */ + function getStartTag(str) { + const tagMatcher = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i + const match = tagMatcher.exec(str) + if (match) { + return match[1].toLowerCase() + } else { + return '' + } + } + + /** + * @param {string} resp + * @returns {Document} + */ + function parseHTML(resp) { + if ('parseHTMLUnsafe' in Document) { + return Document.parseHTMLUnsafe(resp) + } + const parser = new DOMParser() + return parser.parseFromString(resp, 'text/html') + } + + /** + * @param {DocumentFragment} fragment + * @param {Node} elt + */ + function takeChildrenFor(fragment, elt) { + while (elt.childNodes.length > 0) { + fragment.append(elt.childNodes[0]) + } + } + + /** + * @param {HTMLScriptElement} script + * @returns {HTMLScriptElement} + */ + function duplicateScript(script) { + const newScript = getDocument().createElement('script') + forEach(script.attributes, function(attr) { + newScript.setAttribute(attr.name, attr.value) + }) + newScript.textContent = script.textContent + newScript.async = false + if (htmx.config.inlineScriptNonce) { + newScript.nonce = htmx.config.inlineScriptNonce + } + return newScript + } + + /** + * @param {HTMLScriptElement} script + * @returns {boolean} + */ + function isJavaScriptScriptNode(script) { + return script.matches('script') && (script.type === 'text/javascript' || script.type === 'module' || script.type === '') + } + + /** + * we have to make new copies of script tags that we are going to insert because + * SOME browsers (not saying who, but it involves an element and an animal) don't + * execute scripts created in