@logimaxx/kviews.js 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +60 -0
- package/CODE_OF_CONDUCT.md +133 -0
- package/CONTRIBUTING.md +50 -0
- package/LICENSE +21 -0
- package/README.md +399 -0
- package/SECURITY.md +13 -0
- package/SUPPORT.md +16 -0
- package/dist/index.js +4039 -0
- package/dist/index.js.map +7 -0
- package/dist/kviews.js +4068 -0
- package/dist/kviews.js.map +7 -0
- package/dist/kviews.min.js +11 -0
- package/package.json +80 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils.js", "../src/apiBase.js", "../src/errors.js", "../src/URL.js", "../src/Storage.js", "../src/dataParser.js", "../src/adapters/JsonApiAdapter.js", "../src/adapters/plainUtils.js", "../src/adapters/PlainRestAdapter.js", "../src/adapters/resolveAdapter.js", "../src/ItemView.js", "../src/Item.js", "../src/CollectionView.js", "../src/Paging.js", "../src/Collection.js", "../src/Filtering.js", "../src/Sorting.js", "../src/utilities.js", "../src/KViews.js", "../src/index.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Utility functions for KViews\n */\n\n/**\n * Debug logging function\n */\nexport function dbg() {\n if (typeof kviewsLogLevel !== \"undefined\" && kviewsLogLevel>=3) {\n console.trace(...arguments);\n }\n}\nexport function log() {\n if (typeof kviewsLogLevel !== \"undefined\" && kviewsLogLevel>=2) {\n console.log(...arguments);\n }\n}\nexport function error() {\n if (typeof kviewsLogLevel !== \"undefined\" && kviewsLogLevel>=1) {\n console.error(...arguments);\n }\n}\n\nexport function trace() {\n if (typeof kviewsLogLevel !== \"undefined\" && kviewsLogLevel>=4) {\n console.trace(...arguments);\n }\n}\n\n\n/**\n * Generate unique ID\n */\nexport function uid() {\n return \"uid_\" + Math.random().toString(36).substr(2, 9);\n}\n\n/**\n * Parse options object\n */\nexport function parseOptions(options) {\n if (typeof options === \"undefined\") {\n return {};\n }\n\n if (options.constructor === Object) {\n return options;\n }\n\n throw new Error(\"Invalid options\", options);\n}\n\n/**\n * Deep merge utility\n */\nexport function deepmerge(target, source, optionsArgument) {\n function defaultArrayMerge(target, source, optionsArgument) {\n let destination = target.slice();\n source.forEach(function (e, i) {\n if (typeof destination[i] === 'undefined') {\n destination[i] = cloneIfNecessary(e, optionsArgument);\n } else if (isMergeableObject(e)) {\n destination[i] = deepmerge(target[i], e, optionsArgument);\n } else if (target.indexOf(e) === -1) {\n destination.push(cloneIfNecessary(e, optionsArgument));\n }\n });\n return destination;\n }\n\n function isMergeableObject(val) {\n var nonNullObject = val && typeof val === 'object';\n return nonNullObject\n && Object.prototype.toString.call(val) !== '[object RegExp]'\n && Object.prototype.toString.call(val) !== '[object Date]';\n }\n\n function emptyTarget(val) {\n return Array.isArray(val) ? [] : {};\n }\n\n function cloneIfNecessary(value, optionsArgument) {\n let clone = optionsArgument && optionsArgument.clone === true;\n return (clone && isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, optionsArgument) : value;\n }\n\n function mergeObject(target, source, optionsArgument) {\n let destination = {};\n\n if (isMergeableObject(target)) {\n Object.keys(target).forEach(function (key) {\n destination[key] = cloneIfNecessary(target[key], optionsArgument);\n });\n }\n\n Object.keys(source).forEach(function (key) {\n if (!isMergeableObject(source[key]) || !target[key]) {\n destination[key] = cloneIfNecessary(source[key], optionsArgument);\n } else {\n destination[key] = deepmerge(target[key], source[key], optionsArgument);\n }\n });\n return destination;\n }\n\n let array = Array.isArray(source);\n let options = optionsArgument || { arrayMerge: defaultArrayMerge };\n let arrayMerge = options.arrayMerge || defaultArrayMerge;\n\n if (array) {\n return Array.isArray(target) ? arrayMerge(target, source, optionsArgument) : cloneIfNecessary(source, optionsArgument);\n } else {\n return mergeObject(target, source, optionsArgument);\n }\n}\n\ndeepmerge.all = function deepmergeAll(array, optionsArgument) {\n if (!Array.isArray(array) || array.length < 2) {\n throw new Error('first argument should be an array with at least two elements');\n }\n\n return array.reduce(function (prev, next) {\n return deepmerge(prev, next, optionsArgument);\n });\n};\n\n/**\n * Get bound objects from element data attributes\n */\nexport function getBoundObjects(el) {\n let db = {};\n if (!el || $(el).length === 0) {\n return db;\n }\n\n let boundData = $(el).data();\n for (let key in boundData) {\n if (typeof boundData[key] === \"object\" && key !== \"instance\") {\n db[key] = boundData[key];\n }\n }\n return db;\n}\n\n/**\n * Template compilation (uses Handlebars if available)\n */\nexport function template(text) {\n if (typeof Handlebars !== \"undefined\") {\n return Handlebars.compile(text);\n }\n throw new Error(\"Handlebars is required for template compilation\");\n}\n\n/**\n * Create overlay element for loading indicators\n */\nexport function createOverlay(instance) {\n // Use a real element so `$(\"<div>\")` HTML parsing quirks (e.g. in jsdom) never yield an empty set.\n return $(document.createElement(\"div\"))\n .text(\"Se incarca 123\")\n .addClass(\"komponent-overlay\")\n .data(\"asd\", instance)\n .attr(\n \"style\",\n \"background: linear-gradient(135deg,rgb(191, 225, 205),rgb(236, 234, 232) 70%, #fca); text-align: center; position:absolute; z-index:100000;\"\n );\n}\n", "/**\n * Default base URL/path prepended to relative request URLs in Storage.sync.\n * Set via KViews.baseUrl (full origin or any prefix) or KViews.basePath (alias).\n * If both are set, baseUrl takes precedence.\n *\n * defaultHeaders: merged into every fetch (lowest precedence). Override per instance\n * with options.headers, or per request via Storage.sync options.\n */\nexport const apiBaseConfig = {\n baseUrl: null,\n basePath: null,\n defaultHeaders: {},\n};\n\n/**\n * @param {string} url\n * @returns {string}\n */\nexport function resolveRequestUrl(url) {\n if (url == null || url === \"\") {\n return url;\n }\n const s = typeof url === \"string\" ? url : String(url);\n if (/^https?:\\/\\//i.test(s) || s.startsWith(\"//\")) {\n return s;\n }\n const base = apiBaseConfig.baseUrl || apiBaseConfig.basePath || \"\";\n if (!base) {\n return s;\n }\n const baseNorm = base.replace(/\\/+$/, \"\");\n const pathNorm = s.replace(/^\\/+/, \"\");\n if (!pathNorm) {\n return baseNorm + \"/\";\n }\n return baseNorm + \"/\" + pathNorm;\n}\n", "/**\n * KViews Error Classes\n * \n * Custom error hierarchy for KViews operations\n */\n\n/**\n * Base error class for all KViews errors\n */\nexport class KViewsError extends Error {\n constructor(message, options = {}) {\n super(message);\n this.name = 'KViewsError';\n this.options = options.options || {};\n this.context = options.context || null;\n \n // Maintain proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * HTTP-related errors\n */\nexport class KViewsHttpError extends KViewsError {\n constructor(message, options = {}) {\n super(message, options);\n this.name = 'KViewsHttpError';\n this.status = options.status || 0;\n this.statusText = options.statusText || 'error';\n this.responseText = options.responseText || null;\n this.responseJSON = options.responseJSON || null;\n this.jqXHR = options.jqXHR || null;\n this.textStatus = options.textStatus || 'error'; // For backward compatibility\n this.errorThrown = options.errorThrown || null;\n }\n}\n\n/**\n * JSON:API parsing errors\n */\nexport class KViewsParseError extends KViewsError {\n constructor(message, options = {}) {\n super(message, options);\n this.name = 'KViewsParseError';\n this.rawData = options.rawData || null;\n this.parseStep = options.parseStep || null;\n }\n}\n\n/**\n * URL-related errors\n */\nexport class KViewsUrlError extends KViewsError {\n constructor(message, options = {}) {\n super(message, options);\n this.name = 'KViewsUrlError';\n this.url = options.url || null;\n }\n}\n\n/**\n * Network/fetch errors (distinct from HTTP errors)\n */\nexport class KViewsNetworkError extends KViewsError {\n constructor(message, options = {}) {\n super(message, options);\n this.name = 'KViewsNetworkError';\n this.originalError = options.originalError || null;\n this.url = options.url || null;\n }\n}\n", "import { dbg } from './utils.js';\nimport { KViewsUrlError } from './errors.js';\n\n/**\n * URL parsing and manipulation utility class\n * \n * Wraps standard URL/URLSearchParams API for better reliability\n * while maintaining backward compatibility with existing API\n */\nexport class URL {\n constructor(url) {\n if (!url) {\n throw new KViewsUrlError(\"URL is not provided\", { url: url });\n }\n\n // If already a URL instance, copy properties\n if (typeof url === \"object\" && url.hasOwnProperty(\"protocol\")) {\n Object.assign(this, url);\n // Ensure parameters object has toString method\n if (this.parameters && !this.parameters.toString) {\n this._addParametersToString();\n }\n return;\n }\n\n if (url.constructor !== String) {\n dbg(\"URL is not a string\", url);\n throw new KViewsUrlError(\"URL is not a string: \" + url.toString(), { url: url });\n }\n\n // Check if URL is absolute (has protocol) or relative\n const isAbsolute = /^[a-z]+:\\/\\//i.test(url);\n \n if (isAbsolute && typeof window !== 'undefined' && window.URL) {\n // Use standard URL API for absolute URLs\n try {\n const standardUrl = new window.URL(url);\n this.protocol = standardUrl.protocol ? standardUrl.protocol.replace(':', '') : null;\n this.fqdn = standardUrl.hostname || null;\n this.port = standardUrl.port || null;\n this.path = standardUrl.pathname || null;\n this.fragment = standardUrl.hash ? standardUrl.hash.replace('#', '') : null;\n \n // Parse query parameters using URLSearchParams\n this.parameters = {};\n if (standardUrl.search) {\n const params = new URLSearchParams(standardUrl.search);\n params.forEach((value, key) => {\n this.parameters[key] = value;\n });\n }\n } catch (e) {\n // Fallback if standard URL API fails\n this._parseRelativeUrl(url);\n }\n } else {\n // Relative URL - use regex-based parsing\n this._parseRelativeUrl(url);\n }\n\n // Ensure parameters object has toString method\n this._addParametersToString();\n }\n\n /**\n * Parse relative URL using regex fallback\n * @private\n */\n _parseRelativeUrl(url) {\n // Improved regex that handles relative URLs better\n let regExp = /^((?:([a-z]+):)([\\/]{2,3})([\\w\\.\\-\\_]+)(?::(\\d+))?)?(?:(\\/?[^?#]*))?(?:\\?([^#]*))?(?:#(.*))?$/i;\n let parts = regExp.exec(url);\n\n this.protocol = null;\n this.fqdn = null;\n this.port = null;\n this.path = null;\n this.parameters = {};\n this.fragment = null;\n\n if (typeof parts[2] !== \"undefined\") {\n this.protocol = parts[2];\n }\n if (typeof parts[4] !== \"undefined\") {\n this.fqdn = parts[4];\n }\n if (typeof parts[5] !== \"undefined\") {\n this.port = parts[5];\n }\n if (typeof parts[6] !== \"undefined\") {\n this.path = parts[6];\n }\n if (typeof parts[7] !== \"undefined\") {\n // Use URLSearchParams for query parsing when available\n try {\n const params = new URLSearchParams(parts[7]);\n params.forEach((value, key) => {\n this.parameters[key] = value;\n });\n } catch (e) {\n // Fallback to manual parsing\n let tmp = parts[7].split(\"&\");\n tmp.forEach((item) => {\n if (!item || item === \"\") {\n return;\n }\n let eqPos = item.indexOf(\"=\");\n if (eqPos === -1) {\n this.parameters[item] = \"\";\n } else {\n this.parameters[item.substr(0, eqPos)] = decodeURIComponent(item.substr(eqPos + 1));\n }\n });\n }\n }\n if (typeof parts[8] !== \"undefined\") {\n this.fragment = parts[8];\n }\n }\n\n /**\n * Add toString method to parameters object\n * @private\n */\n _addParametersToString() {\n if (!this.parameters.toString || this.parameters.toString === Object.prototype.toString) {\n const self = this;\n this.parameters.toString = function () {\n // Use URLSearchParams when available for proper encoding\n if (typeof URLSearchParams !== 'undefined') {\n try {\n const params = new URLSearchParams();\n for (let para in this) {\n if (this.hasOwnProperty(para) && para !== \"toString\") {\n params.append(para, String(this[para]));\n }\n }\n return params.toString();\n } catch (e) {\n // Fallback to manual encoding\n }\n }\n \n // Fallback to manual encoding\n let paras = [];\n for (let para in this) {\n if (this.hasOwnProperty(para) && para !== \"toString\") {\n const value = String(this[para]);\n paras.push(encodeURIComponent(para) + \"=\" + encodeURIComponent(value));\n }\n }\n return paras.join(\"&\");\n };\n }\n }\n\n toString() {\n let str = \"\";\n \n // Build absolute URL part if present\n if (this.protocol && this.fqdn) {\n // Absolute URL - use standard URL API when available for proper encoding\n if (typeof window !== 'undefined' && window.URL) {\n try {\n const baseUrl = this.protocol + \"://\" + this.fqdn + (this.port ? \":\" + this.port : \"\");\n const url = new window.URL(this.path || \"/\", baseUrl);\n \n // Set query parameters\n if (this.parameters && Object.keys(this.parameters).length > 0) {\n Object.getOwnPropertyNames(this.parameters).forEach(key => {\n if (key !== \"toString\") {\n url.searchParams.set(key, this.parameters[key]);\n }\n });\n }\n \n // Set fragment\n if (this.fragment) {\n url.hash = this.fragment;\n }\n \n return url.toString();\n } catch (e) {\n // Fallback to manual construction if URL API fails\n }\n }\n \n // Manual construction for absolute URLs\n str += this.protocol + \"://\" + this.fqdn;\n if (this.port) {\n str += \":\" + this.port;\n }\n }\n\n // Add path (for both absolute and relative URLs)\n if (this.path) {\n str += this.path;\n }\n \n // Add query parameters\n if (this.parameters && Object.keys(this.parameters).length > 0) {\n str += \"?\" + this.parameters.toString();\n }\n \n // Add fragment\n if (this.fragment) {\n str += \"#\" + this.fragment;\n }\n \n return str;\n }\n}\n\n/**\n * Factory function for backward compatibility\n */\nexport function createURL(url) {\n return new URL(url);\n}\n", "import { parseOptions } from './utils.js';\nimport { KViewsHttpError, KViewsNetworkError } from './errors.js';\nimport { apiBaseConfig, resolveRequestUrl } from './apiBase.js';\n\n/**\n * Storage class for HTTP operations\n */\nexport class Storage {\n constructor(options = {}) {\n let defaultOptions = {\n url: null,\n method: \"GET\"\n };\n\n options = parseOptions(options);\n Object.assign(defaultOptions, options);\n this.defaultOptions = defaultOptions;\n }\n\n /**\n * Base sync method - uses Fetch API\n */\n sync(options) {\n // Ensure URL is a string (convert URL objects)\n if (options.url && typeof options.url === \"object\" && options.url.toString) {\n options.url = options.url.toString();\n }\n \n options.url = resolveRequestUrl(options.url);\n options = Object.assign(\n Object.assign({}, this.defaultOptions),\n parseOptions(options)\n );\n\n // Merge headers: global (KViews.defaultHeaders) < Storage defaults < this sync call\n const globalHeaders =\n apiBaseConfig.defaultHeaders && typeof apiBaseConfig.defaultHeaders === \"object\"\n ? apiBaseConfig.defaultHeaders\n : {};\n const defaultHeaders =\n this.defaultOptions.headers && typeof this.defaultOptions.headers === \"object\"\n ? this.defaultOptions.headers\n : {};\n const requestHeaders =\n options.headers && typeof options.headers === \"object\" ? options.headers : {};\n options.headers = Object.assign({}, globalHeaders, defaultHeaders, requestHeaders);\n\n if (!options.hasOwnProperty(\"url\")) {\n throw new Error(\"No URL provided\");\n }\n \n // Final check - ensure URL is a string\n if (options.url && typeof options.url === \"object\" && options.url.toString) {\n options.url = options.url.toString();\n }\n\n // Build fetch options\n const fetchOptions = {\n method: options.method || \"GET\",\n headers: {}\n };\n\n // Set headers\n if (options.headers) {\n Object.assign(fetchOptions.headers, options.headers);\n }\n\n // Set Content-Type header\n if (options.contentType) {\n fetchOptions.headers['Content-Type'] = options.contentType;\n }\n\n // Set request body for methods that support it\n if (options.data && ['POST', 'PUT', 'PATCH'].includes(fetchOptions.method)) {\n fetchOptions.body = options.data;\n }\n\n // Make the request using Fetch API\n return fetch(options.url, fetchOptions)\n .catch(fetchError => {\n // Network/fetch failure (not HTTP error response)\n // This is a network error, not an HTTP error\n throw new KViewsNetworkError(\n fetchError instanceof Error ? fetchError.message : String(fetchError),\n {\n originalError: fetchError instanceof Error ? fetchError : new Error(String(fetchError)),\n url: options.url,\n options: options\n }\n );\n })\n .then(async response => {\n // Create a response object that mimics jQuery's jqXHR structure\n const jqXHR = {\n status: response.status,\n statusText: response.statusText,\n responseText: null,\n responseJSON: null,\n getAllResponseHeaders: () => {\n const headers = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return Object.entries(headers)\n .map(([key, value]) => `${key}: ${value}`)\n .join('\\r\\n');\n },\n getResponseHeader: (name) => {\n return response.headers.get(name);\n }\n };\n\n // Read response body once (can only be read once)\n const text = await response.text();\n \n // Try to parse as JSON\n let data = text;\n try {\n data = JSON.parse(text);\n } catch (e) {\n // Not JSON, use text as-is\n }\n \n jqXHR.responseText = text;\n jqXHR.responseJSON = typeof data === 'object' ? data : null;\n\n // Check if response is ok (status 200-299)\n if (!response.ok) {\n const error = new KViewsHttpError(\n `HTTP ${response.status}: ${response.statusText}`,\n {\n status: response.status,\n statusText: response.statusText,\n responseText: text,\n responseJSON: typeof data === 'object' ? data : null,\n jqXHR: jqXHR,\n options: options,\n errorThrown: new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n );\n // Add textStatus for backward compatibility\n error.textStatus = 'error';\n throw error;\n }\n\n // Successful response\n return {\n data: data,\n textStatus: 'success',\n jqXHR: jqXHR\n };\n })\n .catch(error => {\n // Handle errors from response processing or network failures\n \n // If already a KViews error, re-throw it\n if (error instanceof KViewsHttpError || error instanceof KViewsNetworkError) {\n throw error;\n }\n \n // If error was from fetch() itself (network error), it should have been caught above\n // This catch handles errors from response processing\n // For backward compatibility, wrap unexpected errors as HTTP errors\n // but log that this is unusual\n const jqXHR = {\n status: 0,\n statusText: 'error',\n responseText: null,\n responseJSON: null,\n getAllResponseHeaders: () => '',\n getResponseHeader: () => null\n };\n\n const httpError = new KViewsHttpError(\n error instanceof Error ? error.message : String(error),\n {\n status: 0,\n statusText: 'error',\n responseText: null,\n responseJSON: null,\n jqXHR: jqXHR,\n options: options,\n errorThrown: error instanceof Error ? error : new Error(String(error))\n }\n );\n // Add textStatus for backward compatibility\n httpError.textStatus = 'error';\n throw httpError;\n });\n }\n\n /**\n * Create (POST) operation\n */\n create(ctx, url, opts, data) {\n let options = {\n context: ctx,\n url: url,\n method: \"POST\",\n data: data\n };\n Object.assign(options, opts);\n return this.sync(options);\n }\n\n /**\n * Read (GET) operation\n */\n read(ctx, url, opts) {\n let options = {\n context: ctx,\n url: url,\n method: \"GET\"\n };\n Object.assign(options, opts);\n return this.sync(options);\n }\n\n /**\n * Delete (DELETE) operation\n */\n delete(ctx, url, opts) {\n let options = {\n context: ctx,\n url: url,\n method: \"DELETE\"\n };\n Object.assign(options, opts);\n return this.sync(options);\n }\n\n /**\n * Update (PATCH) operation\n */\n update(ctx, url, opts, data) {\n let options = {\n context: ctx,\n url: url,\n method: \"PATCH\",\n contentType: \"application/vnd.api+json\",\n data: data\n };\n Object.assign(options, opts);\n return this.sync(options);\n }\n}\n", "import { deepmerge } from './utils.js';\nimport { createURL } from './URL.js';\nimport { KViewsParseError } from './errors.js';\n\n/**\n * JSON:API Document Parser and Hydration Layer\n * \n * Purpose: Parse JSON:API documents and hydrate relationship references\n * by replacing {type, id} references with actual resource objects from\n * the same document's included resources.\n * \n * Flow:\n * 1. Extract included resources from document (supports both 'included' and legacy 'includes')\n * 2. Build resource index (type/id -> resource object)\n * 3. Hydrate primary data by replacing relationship references with actual objects\n * 4. Return hydrated resources ready for Collection/Item loading\n */\n\n/**\n * Get included resources from JSON:API document\n * \n * Supports both standard 'included' and legacy 'includes' fields.\n * Returns array of all included resource objects.\n * \n * @param {Object} doc - JSON:API document\n * @returns {Array} Array of included resource objects\n */\nexport function getIncludedResources(doc) {\n if (!doc || typeof doc !== 'object') {\n return [];\n }\n\n // Support both 'included' (JSON:API standard) and 'includes' (legacy)\n const includedData = doc.hasOwnProperty('included')\n ? doc.included\n : (doc.hasOwnProperty('includes') ? doc.includes : null);\n\n if (!includedData) {\n return [];\n }\n\n if (!Array.isArray(includedData)) {\n return [];\n }\n\n return includedData;\n}\n\n/**\n * Build resource index from JSON:API document\n * \n * Creates a map of type/id -> resource object for fast lookup.\n * Indexes both primary data and included resources.\n * \n * @param {Object} doc - JSON:API document\n * @returns {Map} Map with keys like \"type/id\" -> resource object\n */\nexport function buildResourceIndex(doc) {\n const index = new Map();\n\n if (!doc || typeof doc !== 'object') {\n return index;\n }\n\n /**\n * Index a single resource\n */\n function indexResource(resource) {\n if (!resource || typeof resource !== 'object') {\n return;\n }\n\n if (!resource.type || !resource.id) {\n return;\n }\n\n const key = `${resource.type}/${resource.id}`;\n if (!index.has(key)) {\n index.set(key, resource);\n }\n }\n\n // Index primary data\n if (doc.data) {\n if (Array.isArray(doc.data)) {\n doc.data.forEach(indexResource);\n } else if (typeof doc.data === 'object') {\n indexResource(doc.data);\n }\n }\n\n // Index included resources\n const included = getIncludedResources(doc);\n included.forEach(indexResource);\n\n return index;\n}\n\n/**\n * Get resource from index by type/id reference\n * \n * @param {Object|string} typeOrRef - Either {type, id} object or type string\n * @param {string} id - ID (if first param is type string)\n * @param {Map} resourceIndex - Resource index\n * @returns {Object|null} Resource object or null if not found\n */\nfunction getResourceFromIndex(typeOrRef, id, resourceIndex) {\n let type, resourceId;\n\n if (typeof typeOrRef === 'object' && typeOrRef !== null) {\n type = typeOrRef.type;\n resourceId = typeOrRef.id;\n } else {\n type = typeOrRef;\n resourceId = id;\n }\n\n if (!type || !resourceId) {\n return null;\n }\n\n const key = `${type}/${resourceId}`;\n return resourceIndex.get(key) || null;\n}\n\n/**\n * Hydrate a single resource's relationships recursively\n * \n * Replaces relationship references {type, id} with actual resource objects\n * from the index. Handles both to-one and to-many relationships.\n * Prevents infinite recursion with visited set.\n * \n * IMPORTANT: Uses resources directly from index (no cloning) to ensure\n * that multiple references to the same resource share the same object instance.\n * \n * @param {Object} resource - Resource object to hydrate\n * @param {Map} resourceIndex - Resource index\n * @param {Set} visited - Set of already visited resource keys (for cycle detection)\n * @returns {Object} Hydrated resource (mutates original)\n */\nexport function hydrateResource(resource, resourceIndex, visited = new Set()) {\n if (!resource || typeof resource !== 'object') {\n return resource;\n }\n\n // Skip if no relationships\n if (!resource.relationships) {\n return resource;\n }\n\n // Create key for cycle detection\n const resourceKey = resource.type && resource.id \n ? `${resource.type}/${resource.id}` \n : null;\n\n // Prevent infinite recursion\n if (resourceKey && visited.has(resourceKey)) {\n return resource;\n }\n\n if (resourceKey) {\n visited.add(resourceKey);\n }\n\n // Hydrate each relationship\n Object.keys(resource.relationships).forEach(relName => {\n const rel = resource.relationships[relName];\n\n // Skip null relationships\n if (rel === null) {\n return;\n }\n\n // Handle relationship data object\n if (rel.data !== undefined) {\n if (rel.data === null) {\n // Null to-one relationship\n resource.relationships[relName] = null;\n } else if (Array.isArray(rel.data)) {\n // To-many relationship: array of {type, id}\n resource.relationships[relName] = rel.data\n .map(ref => {\n const hydrated = getResourceFromIndex(ref, null, resourceIndex);\n if (hydrated) {\n // Use resource directly from index (no clone)\n // Recursively hydrate nested relationships\n return hydrateResource(\n hydrated, // Use same object instance from index\n resourceIndex,\n new Set(visited) // New visited set for each branch\n );\n }\n return ref; // Keep reference if not found\n })\n .filter(r => r !== null);\n } else if (typeof rel.data === 'object' && rel.data.type && rel.data.id) {\n // To-one relationship: {type, id}\n const hydrated = getResourceFromIndex(rel.data, null, resourceIndex);\n if (hydrated) {\n // Use resource directly from index (no clone)\n // Recursively hydrate nested relationships\n resource.relationships[relName] = hydrateResource(\n hydrated, // Use same object instance from index\n resourceIndex,\n new Set(visited) // New visited set for each branch\n );\n } else {\n // Keep original reference if not found\n resource.relationships[relName] = rel.data;\n }\n } else {\n // Already hydrated or invalid format\n resource.relationships[relName] = rel.data;\n }\n } else {\n // Relationship without data field (already hydrated or invalid)\n resource.relationships[relName] = rel;\n }\n });\n\n return resource;\n}\n\n/**\n * Hydrate primary data in a JSON:API document\n * \n * Builds resource index and hydrates all primary data resources\n * by replacing relationship references with actual objects.\n * \n * IMPORTANT: Mutates the original document to ensure that multiple\n * references to the same resource share the same object instance.\n * Resources are not cloned - they are unique objects from the index.\n * \n * @param {Object} doc - JSON:API document (will be mutated)\n * @returns {Object|Array} Hydrated primary data (single resource or array)\n */\nexport function hydrateDocumentData(doc) {\n if (!doc || typeof doc !== 'object') {\n throw new KViewsParseError('Invalid document: must be an object');\n }\n\n // Build resource index (indexes resources from original document)\n const resourceIndex = buildResourceIndex(doc);\n\n if (!doc.data) {\n return null;\n }\n\n // Use original data directly (no cloning) to ensure shared object instances\n const data = doc.data;\n\n if (Array.isArray(data)) {\n // Collection: hydrate each resource (mutates original)\n data.forEach(resource => hydrateResource(resource, resourceIndex));\n return data;\n } else if (typeof data === 'object') {\n // Single resource: hydrate it (mutates original)\n return hydrateResource(data, resourceIndex);\n }\n\n return data;\n}\n\n/**\n * Parse item data from JSON:API document\n * \n * Hydrates relationships and extracts item data ready for Item.loadFromData().\n * Handles both single item responses and item data within collection responses.\n * \n * IMPORTANT: This function preserves object identity. The returned resource\n * is the same runtime object from the hydrated graph, not a copy. This ensures\n * that multiple references to the same resource share the same object instance.\n * \n * The returned object is a hydrated resource with relationships resolved to\n * actual runtime objects (not JSON:API relationship wrappers). If document\n * links.self exists, the url property is attached directly to the resource object.\n * \n * @param {Object} data - JSON:API document or already-hydrated resource object\n * @param {Object} options - Options (legacy db parameter for backward compatibility)\n * @returns {Object} The hydrated resource object (same instance, not a copy)\n */\nexport function parseItemData(data, options = {}) {\n let hydratedResource;\n let doc = data;\n\n // If data is already a hydrated resource (from hydrateDocumentData), use it directly\n if (data && typeof data === 'object' && data.type && data.id && !data.data) {\n hydratedResource = data;\n } else if (data && data.data) {\n // JSON:API document format - hydrate it\n doc = data;\n hydratedResource = hydrateDocumentData(doc);\n } else {\n // Fallback: assume it's already hydrated or plain object\n hydratedResource = data;\n }\n\n if (!hydratedResource || typeof hydratedResource !== 'object') {\n throw new KViewsParseError('Invalid item data: must be an object');\n }\n\n // Attach URL from document links directly to the resource object (preserves identity)\n // Only attach if not already present to avoid overwriting existing url\n if (doc && doc.links && doc.links.self && !hydratedResource.url) {\n hydratedResource.url = createURL(doc.links.self);\n }\n\n // Return the original hydrated resource object (not a copy)\n // This preserves object identity across the entire hydrated graph\n return hydratedResource;\n}\n\n/**\n * Parse collection data from JSON:API document\n * \n * Hydrates relationships and extracts array of item data ready for Collection.loadFromData().\n * \n * @param {Object} doc - JSON:API document\n * @returns {Array} Array of hydrated resource objects\n */\nexport function parseCollectionData(doc) {\n if (!doc || typeof doc !== 'object') {\n return [];\n }\n\n const hydratedData = hydrateDocumentData(doc);\n\n if (!hydratedData) {\n return [];\n }\n\n if (!Array.isArray(hydratedData)) {\n // Single resource in collection response - wrap in array\n return [hydratedData];\n }\n\n return hydratedData;\n}\n\n/**\n * Build database from JSON API data (LEGACY - for backward compatibility)\n * \n * @deprecated Use buildResourceIndex() and hydrateDocumentData() instead\n * This function is kept for backward compatibility but may be removed in future versions.\n */\nexport function buildDb(data) {\n // Build index\n const index = buildResourceIndex(data);\n\n // Convert Map to legacy db format for backward compatibility\n const db = {\n __get: function (resName, keyId) {\n if (!resName) {\n return null;\n }\n\n if (resName.constructor === Object && resName.hasOwnProperty('id') && resName.hasOwnProperty('type')) {\n keyId = resName.id;\n resName = resName.type;\n }\n\n const resource = getResourceFromIndex(resName, keyId, index);\n return resource || null;\n },\n __add: function (resName, keyId, data) {\n // Legacy method - not used in new hydration flow\n return null;\n }\n };\n\n // Hydrate document data (mutates index entries)\n if (data && data.data) {\n hydrateDocumentData(data);\n }\n\n return db;\n}\n\n/**\n * Flatten document data (LEGACY - kept for backward compatibility)\n * \n * @deprecated This function is no longer needed with the new hydration approach.\n * It's kept for backward compatibility but may be removed in future versions.\n */\nexport function flattenDoc(doc) {\n // Return array of all resources (primary + included) for legacy compatibility\n const resources = [];\n\n if (doc && doc.data) {\n if (Array.isArray(doc.data)) {\n resources.push(...doc.data);\n } else if (typeof doc.data === 'object') {\n resources.push(doc.data);\n }\n }\n\n const included = getIncludedResources(doc);\n resources.push(...included);\n\n return resources;\n}\n\n/**\n * Parse data for insert or update\n * \n * Converts plain object data into JSON:API format for POST/PUT requests.\n * This is the inverse of parsing - it serializes data to JSON:API format.\n */\nexport function parseDataForInsertOrUpdate(itemData) {\n if (itemData === null) {\n return null;\n }\n\n if (typeof itemData !== 'object') {\n throw new Error('Invalid item data: ' + itemData);\n }\n\n if (itemData.constructor === Array || (itemData.hasOwnProperty('items') && itemData.hasOwnProperty('length'))) {\n let resource = [];\n itemData.forEach(function (item) {\n resource.push(parseDataForInsertOrUpdate(item));\n });\n return resource;\n }\n\n if (itemData.constructor !== Object) {\n throw new Error('Invalid case');\n }\n\n let resource = {};\n\n if (!itemData.hasOwnProperty('attributes')) {\n let tmp = { attributes: {} };\n if (itemData.hasOwnProperty('type')) {\n tmp.type = itemData.type;\n }\n Object.assign(tmp.attributes, itemData);\n itemData = tmp;\n }\n\n Object.getOwnPropertyNames(itemData.attributes).forEach(function (attr) {\n if (itemData.attributes[attr] && typeof itemData.attributes[attr] === 'object') {\n if (!resource.relationships) {\n resource.relationships = {};\n }\n resource.relationships[attr] = {\n data: parseDataForInsertOrUpdate(itemData.attributes[attr])\n };\n return;\n }\n if (!resource.attributes) {\n resource.attributes = {};\n }\n resource.attributes[attr] = itemData.attributes[attr];\n });\n\n return resource;\n}\n", "import {\n parseCollectionData,\n parseItemData,\n parseDataForInsertOrUpdate,\n} from '../dataParser.js';\n\n/**\n * JSON:API data adapter \u2014 default wire format for KViews.\n *\n * Handles document parsing/hydration, metadata extraction, list query params,\n * and create/update payload serialization for JSON:API backends.\n */\nexport class JsonApiAdapter {\n /** @type {string} */\n name = 'jsonapi';\n\n /**\n * Whether a remote response represents a single resource (not a collection).\n *\n * @param {object} data - Raw HTTP response body\n * @returns {boolean}\n */\n isSingleItemResponse(data) {\n return !!(data\n && data.data\n && typeof data.data === 'object'\n && !Array.isArray(data.data));\n }\n\n /**\n * Extract pagination metadata from a remote document.\n *\n * @param {object} data - Raw HTTP response body\n * @returns {{ totalRecords?: number, offset?: number }}\n */\n extractMetadata(data) {\n const meta = {};\n\n if (!data || !data.hasOwnProperty('meta') || typeof data.meta !== 'object') {\n return meta;\n }\n\n if (data.meta.hasOwnProperty('totalRecords')) {\n meta.totalRecords = data.meta.totalRecords * 1;\n }\n\n if (data.meta.hasOwnProperty('offset')) {\n meta.offset = data.meta.offset;\n }\n\n return meta;\n }\n\n /**\n * Apply extracted metadata to a Collection instance.\n *\n * @param {object} collection - Collection instance\n * @param {{ totalRecords?: number, offset?: number }} meta\n */\n applyMetadata(collection, meta) {\n if (meta.totalRecords !== undefined) {\n collection.total = meta.totalRecords;\n }\n if (meta.offset !== undefined) {\n collection.offset = meta.offset;\n }\n }\n\n /**\n * Parse a single-item remote document into a canonical resource object.\n *\n * @param {object} data - Raw HTTP response body\n * @param {object} [options]\n * @returns {object} Hydrated resource ready for Item.loadFromData()\n */\n parseItemResponse(data, options = {}) {\n this.validateItemRemoteDoc(data, options);\n return parseItemData(data, options);\n }\n\n /**\n * Validate that a remote document is suitable for a single Item load.\n *\n * @param {object} data - Raw HTTP response body\n * @param {object} [options]\n * @param {object} [options.collection] - Parent collection (for type inference)\n */\n validateItemRemoteDoc(data) {\n if (data?.data?.constructor === Array) {\n throw new Error('Invalid configuration: resource type is item but server response is collection');\n }\n }\n\n /**\n * Infer resource type from a single-item remote document.\n *\n * @param {object} data - Raw HTTP response body\n * @returns {string|undefined}\n */\n inferItemType(data) {\n return data?.data?.type;\n }\n\n /**\n * Parse a collection remote document into canonical resource objects.\n *\n * @param {object} doc - Raw HTTP response body\n * @returns {{ items: Array<object>, meta: object }}\n */\n parseCollectionResponse(doc) {\n const items = parseCollectionData(doc);\n const meta = this.extractMetadata(doc);\n return { items, meta };\n }\n\n /**\n * Apply list query parameters to a URL object before a collection fetch.\n *\n * @param {import('../URL.js').URL} url - Collection URL\n * @param {{ type?: string, offset?: number, pageSize?: number }} params\n */\n applyListQuery(url, params) {\n const { type, offset, pageSize } = params;\n\n if (typeof offset !== 'undefined' && offset !== null && type) {\n url.parameters[`page[${type}][offset]`] = offset;\n }\n\n if (typeof pageSize !== 'undefined' && pageSize !== null && type) {\n url.parameters[`page[${type}][limit]`] = pageSize;\n }\n }\n\n /**\n * Serialize plain item data for a create (POST) request.\n *\n * @param {object|Array} itemData - Single item or array of items\n * @param {{ type?: string }} [context]\n * @returns {{ body: string, contentType: string, headers?: object }}\n */\n serializeForCreate(itemData, context = {}) {\n const doc = { data: parseDataForInsertOrUpdate(itemData) };\n\n if (context.type) {\n doc.type = context.type;\n }\n\n return {\n body: JSON.stringify(doc),\n contentType: 'application/vnd.api+json',\n };\n }\n\n /**\n * Serialize changed fields for an update (PATCH) request.\n *\n * @param {object} toUpdate - Resource patch with id, type, attributes, relationships\n * @returns {{ body: string, contentType: string }}\n */\n serializeForUpdate(toUpdate) {\n return {\n body: JSON.stringify({ data: toUpdate }),\n contentType: 'application/vnd.api+json',\n };\n }\n\n /**\n * Serialize a runtime relationship value to JSON:API wire format.\n *\n * @param {object|Array|null} rel - Runtime relationship value\n * @returns {object} JSON:API relationship: { data: ... }\n */\n serializeRelationship(rel) {\n if (rel === null) {\n return { data: null };\n }\n\n if (rel && typeof rel === 'object' && !Array.isArray(rel)) {\n if (rel.id) {\n const result = { data: { id: rel.id } };\n if (rel.type) {\n result.data.type = rel.type;\n }\n return result;\n }\n\n if (rel.hasOwnProperty('toJSON')) {\n const json = rel.toJSON();\n const result = { data: { id: json.id } };\n if (json.type) {\n result.data.type = json.type;\n }\n return result;\n }\n\n return { data: null };\n }\n\n if (Array.isArray(rel)) {\n return {\n data: rel.map((item) => {\n if (item && typeof item === 'object') {\n if (item.type && item.id) {\n const result = { id: item.id };\n if (item.type) {\n result.type = item.type;\n }\n return result;\n }\n\n if (item.hasOwnProperty('toJSON')) {\n const json = item.toJSON();\n const result = { id: json.id };\n if (json.type) {\n result.type = json.type;\n }\n return result;\n }\n }\n return item;\n }).filter((item) => item && item.id),\n };\n }\n\n return { data: null };\n }\n}\n", "/**\n * Read a nested value using dot notation (e.g. \"meta.totalRecords\").\n *\n * @param {object} obj\n * @param {string|null|undefined} path\n * @returns {*}\n */\nexport function getPath(obj, path) {\n if (!obj || !path || typeof path !== 'string') {\n return undefined;\n }\n\n return path.split('.').reduce((current, key) => {\n if (current == null || typeof current !== 'object') {\n return undefined;\n }\n return current[key];\n }, obj);\n}\n\n/**\n * Resolve the array of rows from a plain REST collection response.\n *\n * @param {object|Array} doc\n * @param {string|null} itemsPath\n * @returns {Array<object>}\n */\nexport function extractCollectionRows(doc, itemsPath) {\n if (Array.isArray(doc)) {\n return doc;\n }\n\n if (!doc || typeof doc !== 'object') {\n return [];\n }\n\n if (itemsPath) {\n const rows = getPath(doc, itemsPath);\n return Array.isArray(rows) ? rows : [];\n }\n\n if (Array.isArray(doc.data)) {\n return doc.data;\n }\n\n if (Array.isArray(doc.items)) {\n return doc.items;\n }\n\n if (Array.isArray(doc.results)) {\n return doc.results;\n }\n\n return [];\n}\n\n/**\n * Detect total record count from common plain REST response shapes.\n *\n * @param {object} doc\n * @param {string|null} totalPath\n * @returns {number|undefined}\n */\nexport function extractTotalRecords(doc, totalPath) {\n if (!doc || typeof doc !== 'object') {\n return undefined;\n }\n\n if (totalPath) {\n const value = getPath(doc, totalPath);\n return value != null ? value * 1 : undefined;\n }\n\n for (const path of ['total', 'count', 'totalCount', 'meta.totalRecords']) {\n const value = getPath(doc, path);\n if (value != null) {\n return value * 1;\n }\n }\n\n return undefined;\n}\n\n/**\n * Detect list offset from common plain REST response shapes.\n *\n * @param {object} doc\n * @param {string|null} offsetPath\n * @returns {number|undefined}\n */\nexport function extractOffset(doc, offsetPath) {\n if (!doc || typeof doc !== 'object') {\n return undefined;\n }\n\n if (offsetPath) {\n const value = getPath(doc, offsetPath);\n return value != null ? value : undefined;\n }\n\n for (const path of ['offset', 'meta.offset']) {\n const value = getPath(doc, path);\n if (value != null) {\n return value;\n }\n }\n\n return undefined;\n}\n", "import {\n getPath,\n extractCollectionRows,\n extractTotalRecords,\n extractOffset,\n} from './plainUtils.js';\n\n/**\n * Plain REST data adapter for flat JSON APIs.\n *\n * Supports common response shapes:\n * - Collection: `[{ id, ... }]` or `{ data|items|results: [...], total?, offset? }`\n * - Item: `{ id, ... }` or `{ data: { id, ... } }`\n *\n * Wire format uses `application/json` with flat objects (no JSON:API envelope).\n */\nexport class PlainRestAdapter {\n /** @type {string} */\n name = 'plain';\n\n /**\n * @param {object} [opts]\n * @param {string|null} [opts.itemsPath] - Dot path to item array (null = auto-detect)\n * @param {string|null} [opts.itemPath] - Dot path to single item in a wrapper document\n * @param {string|null} [opts.totalPath] - Dot path to total count (null = auto-detect)\n * @param {string|null} [opts.offsetPath] - Dot path to offset (null = auto-detect)\n * @param {string} [opts.idField] - Primary key field name\n * @param {string|null} [opts.typeField] - Resource type field on wire objects\n * @param {'offset'|'page'} [opts.paginationStyle] - Query param style for list fetches\n * @param {string} [opts.offsetParam] - Offset query parameter name\n * @param {string} [opts.limitParam] - Page size query parameter name\n * @param {string} [opts.pageParam] - Page number query parameter name (1-based)\n * @param {boolean} [opts.embedRelationships] - Embed nested objects on write (default: id stub)\n */\n constructor(opts = {}) {\n this.itemsPath = opts.itemsPath ?? null;\n this.itemPath = opts.itemPath ?? null;\n this.totalPath = opts.totalPath ?? null;\n this.offsetPath = opts.offsetPath ?? null;\n this.idField = opts.idField ?? 'id';\n this.typeField = opts.typeField ?? 'type';\n this.paginationStyle = opts.paginationStyle ?? 'offset';\n this.offsetParam = opts.offsetParam ?? 'offset';\n this.limitParam = opts.limitParam ?? 'limit';\n this.pageParam = opts.pageParam ?? 'page';\n this.embedRelationships = opts.embedRelationships ?? false;\n }\n\n /**\n * @param {object|Array} data\n * @returns {boolean}\n */\n isSingleItemResponse(data) {\n if (!data || typeof data !== 'object' || Array.isArray(data)) {\n return false;\n }\n\n if (this.itemPath) {\n const item = getPath(data, this.itemPath);\n if (Array.isArray(item)) {\n return false;\n }\n if (item && typeof item === 'object') {\n return item[this.idField] != null;\n }\n return false;\n }\n\n const rows = extractCollectionRows(data, this.itemsPath);\n if (rows.length > 0) {\n return false;\n }\n\n if (data.data && Array.isArray(data.data)) {\n return false;\n }\n\n if (data.data && typeof data.data === 'object' && data.data[this.idField] != null) {\n return true;\n }\n\n return data[this.idField] != null;\n }\n\n /**\n * @param {object} data\n * @returns {{ totalRecords?: number, offset?: number }}\n */\n extractMetadata(data) {\n const meta = {};\n const totalRecords = extractTotalRecords(data, this.totalPath);\n\n if (totalRecords !== undefined) {\n meta.totalRecords = totalRecords;\n }\n\n const offset = extractOffset(data, this.offsetPath);\n if (offset !== undefined) {\n meta.offset = offset;\n }\n\n return meta;\n }\n\n /**\n * @param {object} collection\n * @param {{ totalRecords?: number, offset?: number }} meta\n */\n applyMetadata(collection, meta) {\n if (meta.totalRecords !== undefined) {\n collection.total = meta.totalRecords;\n }\n if (meta.offset !== undefined) {\n collection.offset = meta.offset;\n }\n }\n\n /**\n * @param {object} data\n * @param {object} [options]\n * @returns {object}\n */\n parseItemResponse(data, options = {}) {\n this.validateItemRemoteDoc(data, options);\n const raw = this.extractRawItem(data);\n const defaultType = options.collection?.type ?? options.type;\n return this.normalize(raw, defaultType);\n }\n\n /**\n * @param {object} data\n */\n validateItemRemoteDoc(data) {\n if (Array.isArray(data)) {\n throw new Error('Invalid configuration: resource type is item but server response is collection');\n }\n\n if (this.itemPath) {\n const item = getPath(data, this.itemPath);\n if (Array.isArray(item)) {\n throw new Error('Invalid configuration: resource type is item but server response is collection');\n }\n return;\n }\n\n if (data?.data && Array.isArray(data.data)) {\n throw new Error('Invalid configuration: resource type is item but server response is collection');\n }\n }\n\n /**\n * @param {object} data\n * @returns {string|undefined}\n */\n inferItemType(data) {\n const raw = this.extractRawItem(data);\n if (!raw || typeof raw !== 'object') {\n return undefined;\n }\n return raw[this.typeField];\n }\n\n /**\n * @param {object|Array} doc\n * @param {object} [options]\n * @returns {{ items: Array<object>, meta: object }}\n */\n parseCollectionResponse(doc, options = {}) {\n const rows = extractCollectionRows(doc, this.itemsPath);\n const defaultType = options.type;\n const items = rows.map((row) => this.normalize(row, defaultType));\n const meta = this.extractMetadata(doc);\n return { items, meta };\n }\n\n /**\n * @param {import('../URL.js').URL} url\n * @param {{ offset?: number, pageSize?: number }} params\n */\n applyListQuery(url, params) {\n const { offset, pageSize } = params;\n\n if (typeof pageSize === 'undefined' || pageSize === null) {\n return;\n }\n\n if (this.paginationStyle === 'page') {\n const safeOffset = typeof offset === 'undefined' || offset === null ? 0 : offset;\n const page = Math.floor(safeOffset / pageSize) + 1;\n url.parameters[this.pageParam] = page;\n url.parameters[this.limitParam] = pageSize;\n return;\n }\n\n if (typeof offset !== 'undefined' && offset !== null) {\n url.parameters[this.offsetParam] = offset;\n }\n\n url.parameters[this.limitParam] = pageSize;\n }\n\n /**\n * @param {object|Array} itemData\n * @param {object} [context]\n * @returns {{ body: string, contentType: string }}\n */\n serializeForCreate(itemData, context = {}) {\n const defaultType = context.type;\n let payload;\n\n if (Array.isArray(itemData)) {\n payload = itemData.map((item) => this.flattenForWire(this.coerceToCanonical(item, defaultType)));\n } else {\n payload = this.flattenForWire(this.coerceToCanonical(itemData, defaultType));\n }\n\n return {\n body: JSON.stringify(payload),\n contentType: 'application/json',\n };\n }\n\n /**\n * @param {object} toUpdate\n * @returns {{ body: string, contentType: string }}\n */\n serializeForUpdate(toUpdate) {\n const relationships = {};\n\n Object.entries(toUpdate.relationships || {}).forEach(([name, rel]) => {\n relationships[name] = this.unwrapRelationship(rel);\n });\n\n const payload = this.flattenForWire({\n id: toUpdate.id,\n type: toUpdate.type,\n attributes: toUpdate.attributes,\n relationships,\n });\n\n return {\n body: JSON.stringify(payload),\n contentType: 'application/json',\n };\n }\n\n /**\n * @param {object|Array|null} rel\n * @returns {object|Array|null|undefined}\n */\n serializeRelationship(rel) {\n return this.unwrapRelationship(rel);\n }\n\n /**\n * @param {object} data\n * @returns {object}\n * @private\n */\n extractRawItem(data) {\n if (this.itemPath) {\n return getPath(data, this.itemPath);\n }\n\n if (data?.data && typeof data.data === 'object' && !Array.isArray(data.data)) {\n return data.data;\n }\n\n return data;\n }\n\n /**\n * @param {object} row\n * @param {string|undefined} defaultType\n * @returns {object}\n */\n normalize(row, defaultType) {\n if (!row || typeof row !== 'object' || Array.isArray(row)) {\n throw new Error('Invalid item data: must be an object');\n }\n\n if (row.attributes && typeof row.attributes === 'object') {\n const relationships = {};\n\n Object.entries(row.relationships || {}).forEach(([name, value]) => {\n if (value === null) {\n relationships[name] = null;\n } else if (Array.isArray(value)) {\n relationships[name] = value.map((entry) => this.normalize(entry, defaultType));\n } else {\n relationships[name] = this.normalize(value, defaultType);\n }\n });\n\n const normalized = {\n attributes: { ...row.attributes },\n relationships,\n };\n\n if (row.id != null) {\n normalized.id = String(row.id);\n }\n\n if (row.type ?? defaultType) {\n normalized.type = row.type ?? defaultType;\n }\n\n return normalized;\n }\n\n const attributes = {};\n const relationships = {};\n let id;\n let type;\n\n Object.entries(row).forEach(([key, value]) => {\n if (key === this.idField) {\n id = value;\n return;\n }\n\n if (key === this.typeField) {\n type = value;\n return;\n }\n\n if (value === null || value === undefined) {\n attributes[key] = value;\n return;\n }\n\n if (Array.isArray(value)) {\n if (value.length > 0 && value.every((entry) => this.isNestedResource(entry))) {\n relationships[key] = value.map((entry) => this.normalize(entry, defaultType));\n } else {\n attributes[key] = value;\n }\n return;\n }\n\n if (this.isNestedResource(value)) {\n relationships[key] = this.normalize(value, defaultType);\n return;\n }\n\n attributes[key] = value;\n });\n\n const normalized = { attributes, relationships };\n\n if (id != null) {\n normalized.id = String(id);\n }\n\n if (type ?? defaultType) {\n normalized.type = type ?? defaultType;\n }\n\n return normalized;\n }\n\n /**\n * @param {*} value\n * @returns {boolean}\n * @private\n */\n isNestedResource(value) {\n return value\n && typeof value === 'object'\n && !Array.isArray(value)\n && value[this.idField] != null;\n }\n\n /**\n * @param {object} data\n * @param {string|undefined} defaultType\n * @returns {object}\n * @private\n */\n coerceToCanonical(data, defaultType) {\n if (!data || typeof data !== 'object') {\n return data;\n }\n\n if (data.attributes || data.relationships) {\n return data;\n }\n\n return this.normalize(data, defaultType);\n }\n\n /**\n * @param {object} canonical\n * @returns {object}\n * @private\n */\n flattenForWire(canonical) {\n if (!canonical || typeof canonical !== 'object') {\n return canonical;\n }\n\n const result = { ...(canonical.attributes || {}) };\n\n if (canonical.id != null) {\n result[this.idField] = canonical.id;\n }\n\n if (canonical.type != null && this.typeField) {\n result[this.typeField] = canonical.type;\n }\n\n Object.entries(canonical.relationships || {}).forEach(([name, rel]) => {\n if (rel === null) {\n result[name] = null;\n return;\n }\n\n if (Array.isArray(rel)) {\n result[name] = rel.map((entry) => this.relationshipToWire(entry));\n return;\n }\n\n result[name] = this.relationshipToWire(rel);\n });\n\n return result;\n }\n\n /**\n * @param {object|null|undefined} rel\n * @returns {object|null|undefined}\n * @private\n */\n relationshipToWire(rel) {\n if (!rel) {\n return null;\n }\n\n if (this.embedRelationships && rel.attributes) {\n return this.flattenForWire(rel);\n }\n\n const stub = { [this.idField]: rel.id ?? rel[this.idField] };\n\n if ((rel.type ?? rel[this.typeField]) != null) {\n stub[this.typeField] = rel.type ?? rel[this.typeField];\n }\n\n return stub;\n }\n\n /**\n * @param {*} rel\n * @returns {object|Array|null|undefined}\n * @private\n */\n unwrapRelationship(rel) {\n if (rel == null) {\n return null;\n }\n\n if (rel.data !== undefined) {\n if (rel.data === null) {\n return null;\n }\n\n if (Array.isArray(rel.data)) {\n return rel.data.map((entry) => ({ ...entry }));\n }\n\n return { ...rel.data };\n }\n\n if (Array.isArray(rel)) {\n return rel.map((entry) => this.unwrapRelationship(entry));\n }\n\n if (typeof rel === 'object') {\n if (rel.attributes) {\n return rel;\n }\n\n return { ...rel };\n }\n\n return rel;\n }\n}\n", "import { JsonApiAdapter } from './JsonApiAdapter.js';\nimport { PlainRestAdapter } from './PlainRestAdapter.js';\n\n/** @type {Map<string, object>} */\nconst registry = new Map([\n ['jsonapi', new JsonApiAdapter()],\n ['plain', new PlainRestAdapter()],\n]);\n\n/** @type {string|import('./JsonApiAdapter.js').JsonApiAdapter} */\nlet defaultAdapter = 'jsonapi';\n\n/**\n * Register a named data adapter.\n *\n * @param {string} name - Adapter identifier (e.g. 'jsonapi', 'plain')\n * @param {object} adapter - Adapter instance implementing the DataAdapter interface\n */\nexport function registerAdapter(name, adapter) {\n if (!name || typeof name !== 'string') {\n throw new Error('Adapter name must be a non-empty string');\n }\n registry.set(name, adapter);\n}\n\n/**\n * Set the global default adapter used when none is specified on Collection/Item.\n *\n * @param {string|object} adapter - Adapter name or instance\n */\nexport function setDefaultAdapter(adapter) {\n defaultAdapter = adapter;\n}\n\n/**\n * Get the global default adapter name or instance.\n *\n * @returns {string|object}\n */\nexport function getDefaultAdapter() {\n return defaultAdapter;\n}\n\n/**\n * Resolve an adapter from a name, instance, or undefined (falls back to default).\n *\n * @param {string|object|undefined} adapter - Adapter name, instance, or omitted\n * @returns {object} Adapter instance\n */\nexport function resolveAdapter(adapter) {\n if (adapter && typeof adapter === 'object') {\n return adapter;\n }\n\n const name = typeof adapter === 'string' ? adapter : defaultAdapter;\n\n if (typeof name === 'object') {\n return name;\n }\n\n const resolved = registry.get(name);\n if (!resolved) {\n throw new Error(`Unknown data adapter: ${name}`);\n }\n\n return resolved;\n}\n\nexport { JsonApiAdapter, PlainRestAdapter };\n", "import { dbg, log, parseOptions, uid, getBoundObjects, template } from './utils.js';\n\n/**\n * ItemView class - handles rendering of individual items\n */\nexport class ItemView {\n constructor(params) {\n // params is actually an existing ItemView\n if (params && params.isView) {\n return params;\n }\n\n this.type = \"ItemView\";\n this.dataBindings = null;\n this.template = null;\n this.container = null;\n this.collectionView = null;\n this.item = null;\n this.el = null;\n this.id = uid();\n this.isView = true;\n\n this.callbacks = {};\n\n // Handle jQuery or DOM element\n if (params && (params.length || (params.nodeName && !params.jquery))) {\n dbg(\"params is actually a jquery object or an html node\", params);\n let $el = $(params);\n if ($el.data(\"view\")) {\n return $el.data(\"view\");\n }\n\n let tmp = $(\"<div>\").append($el.clone(true));\n let html = tmp.html()\n .replace(/<%/gi, '<%')\n .replace(/</gi, '<')\n .replace(/%>/gi, \"%>\")\n .replace(/>/gi, '>')\n .replace(/&/gi, \"&\");\n\n params = {\n template: template(html),\n el: $el\n };\n if ($el.attr(\"id\")) {\n params.id = $el.attr(\"id\");\n }\n tmp.remove();\n }\n\n try {\n params = parseOptions(params);\n } catch (e) {\n throw new Error(\"Error on ItemView\", this, e);\n }\n\n Object.assign(this, params);\n\n if (this.el !== null) {\n this.dataBindings = getBoundObjects(this.el);\n }\n }\n\n /**\n * Event listener registration\n */\n on(event, cb) {\n if (!this.callbacks[event]) {\n this.callbacks[event] = [];\n }\n this.callbacks[event].push(cb);\n return this;\n }\n\n /**\n * Unbind from item\n */\n unbind() {\n if (this.item) {\n this.item.unbindView(this);\n }\n }\n\n /**\n * Create element from template\n */\n createElementFromTemplate() {\n if (this.template == null) {\n dbg('Warning: no template defined. Nothing to render');\n return null;\n }\n\n if (!this.item) {\n dbg('Warning: no item bound to view. Cannot render template.');\n return null;\n }\n\n let el;\n try {\n // Use getRenderContext() to get safe render data without mutating item state\n const renderContext = this.item.getRenderContext();\n console.log(\"renderContext\",renderContext);\n \n let html = this.template(renderContext);\n el = $(html)\n .attr(\"data-type\", \"item\")\n .attr(\"id\", this.id)\n .data(\"view\", this)\n .data(\"instance\", this.item);\n } catch (e) {\n console.log(\"Error create view from template\", e, this.item);\n el = $(\"<div>Could not render view: <strong>\" + e.toString() + \"</strong></div>\");\n }\n \n return el;\n\n // this.dataBindings = this.dataBindings || (this.item && this.item.collection && this.item.collection.view ? this.item.collection.view.dataBindings : {});\n\n // // Set data bindings\n // if (typeof $ !== \"undefined\" && el.jquery) {\n // for (let key in this.dataBindings) {\n // el.data(key, this.dataBindings[key]);\n // el.find(\"*\").data(key, this.dataBindings[key]);\n // }\n // el.data(\"instance\", this.item);\n // }\n\n // return el;\n }\n\n /**\n * After render callback\n */\n afterrender() {\n \n if (!this.callbacks.afterrender) {\n return;\n }\n console.log(\"afterend of view\", this);\n this.callbacks.afterrender.forEach((cb) => cb(this));\n }\n\n /**\n * Render the view\n */\n render(doNotAttachToContainer = false, addontop = false) {\n log(\"ItemView.render called\", this.item, this.el);\n \n // Render element\n let renderedEl = this.createElementFromTemplate();\n // dbg(\"Rendered element:\", renderedEl, \"Original el:\", this.el);\n \n if (!renderedEl) {\n // dbg(\"No rendered element, returning null\");\n return null;\n }\n \n log(\"View item\", this.item);\n if (this.item && this.item.uievents ) {\n log(\"UI events\", this.item.uievents);\n this.item.uievents.forEach(action => {\n log(\"UI event\", action, renderedEl);\n if (action.selector && action.event && action.callback) {\n const actionEls = $(renderedEl).find(action.selector);\n log(\"UI event els\", action, renderedEl, actionEls);\n actionEls.on(action.event, (event) => {\n event.preventDefault();\n log(\"UIevent triggered\", event, this.item, this);\n action.callback(event,this.item, this);\n });\n }\n });\n }\n \n\n if (doNotAttachToContainer) {\n this.el = renderedEl;\n return this.el;\n }\n\n // Replace already rendered element\n if (this.el) {\n let oldEl = this.el;\n // Normalize to jQuery\n if (!oldEl.jquery) {\n oldEl = $(oldEl);\n }\n // Clean up event listeners from old element before removing\n oldEl.off();\n this.el = $(renderedEl).insertBefore(oldEl);\n oldEl.remove();\n this.afterrender();\n return this;\n }\n\n this.el = renderedEl;\n this.afterrender();\n\n if (!this.container) {\n return this;\n }\n\n // Append to container\n $(this.el).appendTo(this.container.el);\n\n return this;\n }\n\n /**\n * Render empty state\n */\n renderEmpty(returnView) {\n if (this.item && this.item.emptyview && this.el) {\n let emptyView = $(this.item.emptyview).clone(true).css(\"display\", \"block\");\n $(this.el).replaceWith(emptyView);\n }\n }\n\n /**\n * Remove view with animation\n */\n remove(idx) {\n return new Promise((resolve) => {\n if (this.item && this.item.collection) {\n this.item.collection._trigger('afterrender', this.item.collection);\n }\n\n if (this.el) {\n let $el = this.el.jquery ? this.el : $(this.el);\n $el.fadeOut({\n complete: () => {\n $el.remove();\n resolve();\n }\n });\n } else {\n resolve();\n }\n });\n }\n\n /**\n * Destroy view and clean up resources\n * \n * Removes event handlers, jQuery data, and DOM references\n */\n destroy() {\n // Clean up event handlers from element\n if (this.el) {\n const $el = this.el.jquery ? this.el : $(this.el);\n $el.off(); // Remove all jQuery event handlers\n $el.removeData(); // Remove jQuery data\n }\n\n // Clean up callbacks\n this.callbacks = {};\n\n // Unbind from item\n if (this.item) {\n this.item.unbindView(this);\n }\n\n // Clear references\n this.item = null;\n this.container = null;\n this.collectionView = null;\n this.el = null;\n this.template = null;\n this.dataBindings = null;\n\n return this;\n }\n}\n", "import { dbg, log, parseOptions, createOverlay } from './utils.js';\nimport { createURL } from './URL.js';\nimport { Storage } from './Storage.js';\nimport { resolveAdapter } from './adapters/index.js';\nimport { ItemView } from './ItemView.js';\n\n/**\n * Item class - represents a single resource item\n */\nexport class Item {\n constructor(options = {},data=null) {\n this.id = null;\n this.type = null;\n this.attributes = {};\n this.relationships = {};\n this.views = [];\n this.collection = null;\n this.url = null;\n this.updateUrl = null;\n this.deleteUrl = null;\n this.strict = false;\n this.shadow = null;\n this.syncOp = null;\n this.emptyview = null;\n this.uievents = [];\n this.callbacks = {};\n this.adapter = null;\n \n try {\n Object.assign(this, parseOptions(options));\n } catch (e) {\n throw new Error(\"Error on Item init\", e);\n }\n\n this.adapter = resolveAdapter(\n options.adapter ?? (options.collection && options.collection.adapter)\n );\n\n this.storage =\n options.storage ||\n new Storage(\n (() => {\n const storageOpts = Object.assign({}, options.ajaxOpts || {});\n if (options.headers && typeof options.headers === \"object\") {\n storageOpts.headers = Object.assign(\n {},\n storageOpts.headers || {},\n options.headers\n );\n }\n return storageOpts;\n })()\n );\n\n let render = false;\n // Load initial data if provided (before URL setup)\n if (data) {\n log(\"Loading data\",data);\n try {\n this.loadFromData(data);\n render = true;\n } catch (e) {\n console.error(\"Error loading data\",e);\n }\n }\n \n // Initialize URLs (after data is loaded)\n if (this.url) {\n this.setUrl(this.url);\n }\n if(this.deleteUrl) {\n log(\"deleteUrl\", this.deleteUrl);\n this.setUrl(this.deleteUrl, \"delete\");\n }\n if(this.updateUrl) {\n this.setUrl(this.updateUrl, \"update\");\n }\n if(this.insertUrl) {\n this.setUrl(this.insertUrl, \"insert\");\n }\n\n // Link views to this item\n this.views.forEach((view) => {\n view.item = this;\n });\n\n // Apply item listeners if provided in options (from collection)\n if (options.itemListeners && typeof options.itemListeners === \"object\") {\n Object.getOwnPropertyNames(options.itemListeners).forEach((eventName) => {\n log(\"apply item listener\", eventName, options.itemListeners[eventName]);\n this.on(eventName, options.itemListeners[eventName]);\n });\n }\n\n if(render) {\n log(\"Rendering data\",data);\n this.render();\n }\n }\n\n /**\n * Event listener registration\n */\n on(eventName, cb) {\n if (typeof this.callbacks[eventName] === \"undefined\") {\n this.callbacks[eventName] = [];\n }\n this.callbacks[eventName].push(cb);\n return this;\n }\n\n /**\n * Remove event listener(s)\n * @param {string} eventName - Event name\n * @param {Function} [cb] - Optional callback to remove. If not provided, removes all listeners for the event\n * @returns {Item} This instance for chaining\n */\n off(eventName, cb) {\n if (!eventName) {\n // Remove all listeners\n this.callbacks = {};\n return this;\n }\n \n if (!this.callbacks[eventName]) {\n return this;\n }\n\n if (cb) {\n // Remove specific callback\n const index = this.callbacks[eventName].indexOf(cb);\n if (index > -1) {\n this.callbacks[eventName].splice(index, 1);\n }\n // Clean up empty arrays\n if (this.callbacks[eventName].length === 0) {\n delete this.callbacks[eventName];\n }\n } else {\n // Remove all listeners for this event\n delete this.callbacks[eventName];\n }\n \n return this;\n }\n\n /**\n * Register a one-time event listener\n * @param {string} eventName - Event name\n * @param {Function} cb - Callback function\n * @returns {Item} This instance for chaining\n */\n once(eventName, cb) {\n const wrapper = (...args) => {\n cb(...args);\n this.off(eventName, wrapper);\n };\n return this.on(eventName, wrapper);\n }\n\n /**\n * Check if event has listeners\n * @param {string} eventName - Event name\n * @returns {boolean} True if event has listeners\n */\n hasListeners(eventName) {\n return this.callbacks[eventName] && Array.isArray(this.callbacks[eventName]) && this.callbacks[eventName].length > 0;\n }\n\n /**\n * Trigger an event (internal helper)\n * @private\n * @param {string} eventName - Event name\n * @param {...any} args - Arguments to pass to callbacks\n */\n _trigger(eventName, ...args) {\n if (this.callbacks[eventName] && Array.isArray(this.callbacks[eventName])) {\n this.callbacks[eventName].forEach(cb => {\n if (typeof cb === 'function') {\n cb(...args);\n }\n });\n }\n }\n\n /**\n * Emit/trigger an event manually\n * @param {string} eventName - Event name\n * @param {...any} args - Arguments to pass to callbacks\n * @returns {Item} This instance for chaining\n */\n emit(eventName, ...args) {\n this._trigger(eventName, ...args);\n return this;\n }\n\n /**\n * Set URL for this item\n */\n setUrl(url,type) {\n switch(type) {\n case \"delete\":\n this.deleteUrl = createURL(url);\n break;\n case \"update\":\n this.updateUrl = createURL(url);\n break;\n case \"insert\":\n this.insertUrl = createURL(url);\n break;\n default:\n this.url = createURL(url);\n this.deleteUrl = typeof this.deleteUrl == \"string\" ? createURL(this.deleteUrl) : (this.deleteUrl ?? createURL(this.url));\n this.updateUrl = typeof this.updateUrl == \"string\" ? createURL(this.updateUrl) : (this.updateUrl ?? createURL(this.url));\n break;\n }\n return this;\n }\n\n /**\n * Load from remote\n * \n * Canonical method for loading item data from API\n */\n loadFromRemote() {\n return this.loadFromDataSource();\n }\n\n load(data) {\n return data ? this.loadFromData(data):this.loadFromRemote();\n }\n\n /**\n * Load from data source (internal implementation)\n * @private\n */\n loadFromDataSource() {\n let loaders = [];\n const overlay = createOverlay(this);\n\n this.views.forEach((itemView) => {\n if (itemView.el) {\n let $el = $(itemView.el);\n let loader = overlay.clone();\n loader.insertBefore(itemView.el)\n .width($el.width())\n .height($el.height());\n loaders.push(loader);\n }\n });\n\n return new Promise((resolve, reject) => {\n if (!this.url) {\n reject(new Error(\"No valid URL provided\"));\n return;\n }\n\n this._trigger('beforeload', this);\n\n // Convert URL object to string for Storage\n let urlString = this.url.toString ? this.url.toString() : this.url;\n \n this.storage.read(this, urlString, {})\n .then((resp) => {\n let data = resp.data;\n this.loadFromRemoteDoc(data).render();\n this._trigger('load', this);\n loaders.forEach((loader) => {\n loader.remove();\n });\n resolve(this);\n })\n .catch((error) => {\n dbg(\"fail to load item resource\", this.url, error);\n // Handle both old error format and new Error instances\n // KViewsHttpError has jqXHR, textStatus, errorThrown properties\n if (error instanceof Error && error.jqXHR) {\n // New error format (KViewsHttpError)\n this.fail(error.jqXHR, error.textStatus || 'error', error.errorThrown || error);\n reject(error);\n } else if (error && error.jqXHR) {\n // Old error format (backward compatibility - plain object)\n this.fail(error.jqXHR, error.textStatus, error.errorThrown);\n reject(error);\n } else {\n // Plain Error instance or other error\n this.fail(null, 'error', error);\n reject(error);\n }\n });\n });\n }\n\n /**\n * @deprecated Use loadFromRemote() instead\n * Alias for backward compatibility\n */\n refresh() {\n return this.loadFromRemote();\n }\n\n /**\n * @deprecated Use loadFromRemote() instead\n * Alias for backward compatibility\n */\n reload() {\n return this.loadFromRemote();\n }\n\n /**\n * @deprecated Use loadFromRemote() instead\n * Internal method, use loadFromRemote() for public API\n * @private\n */\n load_from_data_source() {\n return this.loadFromDataSource();\n }\n\n /**\n * Unbind a view from this item\n */\n unbindView(view) {\n let found = false;\n for (let i = 0; i < this.views.length; i++) {\n if (this.views[i] === view) {\n found = i;\n }\n }\n if (found !== false) {\n this.views.splice(found, 1);\n }\n }\n\n /**\n * Bind a view to this item\n */\n bindView(view, returnView) {\n // Handle jQuery or DOM element\n let $el = $(view);\n if ($el.length === 0) {\n throw new Error(\"Nothing to bind to: empty view element\");\n }\n\n if (!(view instanceof ItemView)) {\n view = new ItemView(view);\n }\n\n let bound = false;\n this.views.forEach((v) => {\n dbg(\"bind to existing view\", v.el);\n if (v === view) {\n bound = true;\n }\n });\n\n if (bound) {\n return returnView ? view : this;\n }\n\n view.item = this;\n this.views.push(view);\n return returnView ? view : this;\n }\n\n /**\n * Load from a remote API document (format determined by adapter).\n *\n * @param {object} data - Raw HTTP response body\n * @returns {Item} This instance for chaining\n */\n loadFromRemoteDoc(data) {\n dbg(\"Load from remote doc\", data);\n\n if (this.collection && !this.collection.type) {\n const inferredType = this.adapter.inferItemType(data);\n if (inferredType) {\n this.type = inferredType;\n }\n }\n\n this.adapter.validateItemRemoteDoc(data, { collection: this.collection });\n\n const parsedData = this.adapter.parseItemResponse(data, { collection: this.collection });\n Object.assign(this, parsedData);\n if (this.url) {\n this.url = createURL(this.url);\n }\n return this;\n }\n\n /**\n * @deprecated Use loadFromRemoteDoc() instead\n * @param {object} data - Raw HTTP response body\n * @returns {Item} This instance for chaining\n */\n loadFromJSONAPIDoc(data) {\n return this.loadFromRemoteDoc(data);\n }\n\n /**\n * Load from data object\n */\n loadFromData(data, render=false) {\n if (data === null || typeof data !== \"object\" || data.constructor !== Object) {\n dbg(\"cannot load \", data, \" into \", this);\n throw new Error(\"Cannot load data into item\");\n }\n\n // Normalize data if not delivered in standard JSONAPI structure\n if (!data.hasOwnProperty(\"attributes\") && !data.hasOwnProperty(\"id\") && !data.hasOwnProperty(\"type\")) {\n dbg(\"need to normalize data\", data);\n\n let attributes = {};\n let relationships = {};\n\n Object.getOwnPropertyNames(data).forEach((propName) => {\n if (data[propName] && data[propName].constructor === Object) {\n relationships[propName] = new Item().loadFromData(data[propName]);\n return;\n }\n if (data[propName] && data[propName].constructor === Array) {\n // Note: Collection import would cause circular dependency\n // This should be handled at a higher level\n relationships[propName] = data[propName]; // Store as-is for now\n return;\n }\n\n attributes[propName] = data[propName];\n });\n\n data = {\n attributes: attributes,\n };\n\n if (Object.getOwnPropertyNames(relationships).length) {\n data.relationships = relationships;\n }\n }\n\n Object.assign(this, data);\n this._trigger('load', this);\n if(render) {\n this.render();\n }\n return this;\n }\n\n /**\n * Handle failure\n */\n fail(xhr, statusText, error) {\n dbg(\"item.fail\", xhr, statusText, error);\n this.views.forEach((view) => {\n if (xhr && xhr.status === 404) {\n view.renderEmpty();\n }\n });\n }\n\n /**\n * Get render context - safe view model for templates\n * \n * RENDER CONTEXT CONTRACT:\n * \n * Returns a template-friendly object where:\n * - Attributes are exposed directly (e.g., {{title}} not {{attributes.title}})\n * - Relationships are flattened to plain objects with attributes, id, type\n * - All data is shallow-copied to prevent mutation of internal state\n * \n * Relationship representation strategy:\n * - To-one: { id, type, ...attributes } (flattened plain object)\n * - To-many: Array of { id, type, ...attributes } (array of flattened objects)\n * - Null relationships: null\n * \n * This ensures Handlebars templates can access data directly:\n * {{title}} - item attribute\n * {{author.name}} - relationship attribute\n * {{#each tags}}{{name}}{{/each}} - relationship array\n * \n * @returns {Object} Render context object safe for template rendering\n */\n getRenderContext() {\n \n function deepCloneStatic(value, seen = new WeakMap()) {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n if (seen.has(value)) {\n return seen.get(value);\n }\n\n if (Array.isArray(value)) {\n const clonedArray = [];\n seen.set(value, clonedArray);\n value.forEach((item) => clonedArray.push(deepCloneStatic(item, seen)));\n return clonedArray;\n }\n\n const clonedObject = {};\n seen.set(value, clonedObject);\n Object.keys(value).forEach((key) => {\n clonedObject[key] = deepCloneStatic(value[key], seen);\n });\n return clonedObject;\n }\n\n function isResourceNode(obj) {\n return obj instanceof Item\n || (obj.attributes != null && typeof obj.attributes === 'object');\n }\n\n function isReferenceStub(obj) {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj) || isResourceNode(obj)) {\n return false;\n }\n if (obj.id == null) {\n return false;\n }\n return Object.keys(obj).every((key) => key === 'id' || key === 'type');\n }\n\n function copyntransform(obj, cache = new WeakMap()) {\n if (!obj) {\n return null;\n }\n\n if (typeof obj !== 'object') {\n return obj;\n }\n\n if (cache.has(obj)) {\n return cache.get(obj);\n }\n\n if (isReferenceStub(obj)) {\n const stub = { id: obj.id };\n cache.set(obj, stub);\n return stub;\n }\n\n if (!isResourceNode(obj)) {\n if (obj.id != null) {\n const flat = { id: obj.id };\n Object.keys(obj).forEach((key) => {\n if (key === 'id' || key === 'type' || key === 'relationships' || key === 'attributes') {\n return;\n }\n flat[key] = deepCloneStatic(obj[key]);\n });\n cache.set(obj, flat);\n return flat;\n }\n const cloned = deepCloneStatic(obj);\n cache.set(obj, cloned);\n return cloned;\n }\n\n const result = { id: obj.id };\n cache.set(obj, result);\n\n Object.assign(result, deepCloneStatic(obj.attributes ?? {}));\n\n Object.keys(obj.relationships ?? {}).forEach((relName) => {\n if (Array.isArray(obj.relationships[relName])) {\n result[relName] = obj.relationships[relName].map((item) => copyntransform(item, cache));\n } else {\n result[relName] = copyntransform(obj.relationships[relName], cache);\n }\n });\n return result;\n }\n\n return copyntransform(this);\n }\n\n /**\n * Convert to JSON:API format\n * \n * Serializes item to JSON:API format for API requests.\n * This method is side-effect free - it does not mutate this.relationships.\n * \n * Runtime relationships (hydrated objects) are converted to JSON:API\n * relationship format: { data: { type, id } } or { data: [{ type, id }, ...] }\n * \n * @returns {Object} JSON:API formatted object\n */\n toJSON() {\n let json = {\n type: this.type,\n attributes: this.attributes || {}\n };\n \n if (this.id) {\n json.id = this.id;\n }\n\n // Serialize relationships to JSON:API format (side-effect free)\n if (this.relationships && Object.keys(this.relationships).length > 0) {\n json.relationships = {};\n\n for (let relName in this.relationships) {\n if (!this.relationships.hasOwnProperty(relName)) {\n continue;\n }\n\n const rel = this.relationships[relName];\n\n // Null relationship\n if (rel === null) {\n json.relationships[relName] = { data: null };\n continue;\n }\n\n // To-one relationship: runtime object -> { data: { type, id } }\n if (rel && typeof rel === 'object' && !Array.isArray(rel)) {\n if (rel.type && rel.id) {\n // Runtime object with type/id\n json.relationships[relName] = {\n data: {\n type: rel.type,\n id: rel.id\n }\n };\n } else if (rel.hasOwnProperty('toJSON')) {\n // Item instance - use its toJSON\n json.relationships[relName] = {\n data: rel.toJSON()\n };\n } else {\n // Unknown format - skip (don't mutate original)\n continue;\n }\n continue;\n }\n\n // To-many relationship: array of runtime objects -> { data: [{ type, id }, ...] }\n if (Array.isArray(rel)) {\n json.relationships[relName] = {\n data: rel.map(item => {\n if (item && typeof item === 'object') {\n if (item.type && item.id) {\n // Runtime object with type/id\n return {\n type: item.type,\n id: item.id\n };\n } else if (item.hasOwnProperty('toJSON')) {\n // Item instance - use its toJSON\n return item.toJSON();\n }\n }\n // Fallback: use as-is\n return item;\n })\n };\n continue;\n }\n\n // Invalid format - skip (don't mutate original)\n continue;\n }\n }\n \n dbg(\"item.json\", json);\n return json;\n }\n\n /**\n * Serialize a single relationship to JSON:API wire format\n * \n * Converts runtime relationship state (hydrated objects, arrays, null) to\n * JSON:API relationship format for wire transmission.\n * \n * IMPORTANT: This is a serialization function - it does NOT mutate runtime state.\n * Runtime relationships remain as hydrated objects/arrays/null.\n * \n * @param {Object|Array|null} rel - Runtime relationship value\n * @returns {Object} JSON:API relationship format: { data: { type, id } } or { data: [{ type, id }, ...] } or { data: null }\n */\n _serializeRelationshipToWireFormat(rel) {\n return this.adapter.serializeRelationship(rel);\n }\n\n /**\n * Sync pending operations\n */\n sync() {\n if (this.syncOp) {\n let syncOp = this.syncOp;\n dbg(\"Syncing\", this, syncOp);\n this.syncOp = null;\n return syncOp();\n } else {\n dbg(\"Nothing to sync on\", this);\n }\n }\n\n /**\n * Perform update operation\n * \n * Builds PATCH payload with changed attributes and relationships.\n * \n * IMPORTANT: Runtime relationship state (hydrated objects/arrays/null) is serialized\n * to JSON:API wire format ({ data: { type, id } }) for transmission. Runtime state\n * remains unchanged - this is a serialization layer, not a state mutation.\n */\n perform_update(opts) {\n let options = {\n rerender: true\n };\n Object.assign(options, opts);\n\n return new Promise((resolve, reject) => {\n let toUpdate = {\n id: this.id,\n attributes: {},\n relationships: {}\n };\n\n if (this.type) {\n toUpdate.type = this.type;\n }\n\n // Collect changed attributes\n Object.getOwnPropertyNames(this.attributes).forEach((attrName) => {\n if (this.shadow && this.shadow.attributes[attrName] !== this.attributes[attrName]) {\n toUpdate.attributes[attrName] = this.attributes[attrName];\n }\n });\n\n // Collect changed relationships and serialize to JSON:API wire format\n // Runtime state (hydrated objects) -> JSON:API format ({ data: { type, id } })\n Object.getOwnPropertyNames(this.relationships).forEach((relaName) => {\n if (this.shadow && this.shadow.relationships[relaName] !== this.relationships[relaName]) {\n const runtimeRel = this.relationships[relaName];\n // Serialize runtime relationship to JSON:API wire format\n toUpdate.relationships[relaName] = this._serializeRelationshipToWireFormat(runtimeRel);\n }\n });\n\n // Nothing to update\n if (!Object.getOwnPropertyNames(toUpdate.attributes).length\n && !Object.getOwnPropertyNames(toUpdate.relationships).length) {\n this.syncOp = null;\n resolve(this);\n return;\n }\n\n const payload = this.adapter.serializeForUpdate(toUpdate);\n\n if (opts && opts.justSimulate) {\n dbg(payload.body);\n resolve(this);\n return;\n }\n\n // Convert URL object to string for Storage\n let updateUrlString = this.updateUrl.toString ? this.updateUrl.toString() : this.updateUrl;\n \n this.storage\n .update(this, updateUrlString, { contentType: payload.contentType }, payload.body)\n .then((resp) => {\n let newData = this.adapter.parseItemResponse(resp.data);\n Object.assign(this, newData);\n this.shadow = null;\n\n if (options.rerender) {\n this.views.forEach((view) => {\n view.render();\n this._trigger('afterrender', this,view); \n });\n }\n\n this._trigger('update', this);\n\n if (this.collection) {\n this.collection.onupdate();\n }\n resolve(this);\n })\n .catch((error) => {\n dbg(\"Update NOK\", this.updateUrl, patchData, error);\n // Handle both old error format and new Error instances\n if (error instanceof Error && error.jqXHR) {\n reject(error);\n } else if (error.jqXHR) {\n reject(error);\n } else {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n });\n }\n\n /**\n * Update item\n */\n update(updateData, opts) {\n if (!updateData || updateData.constructor !== Object) {\n return;\n }\n\n let updateOptions = {\n sync: true,\n rerender: true,\n };\n\n if (opts && opts.constructor === Object) {\n Object.assign(updateOptions, opts);\n }\n\n if (!this.shadow) {\n this.shadow = { attributes: {}, relationships: {} };\n Object.assign(this.shadow.attributes, this.attributes);\n Object.assign(this.shadow.relationships, this.relationships);\n }\n\n /**\n * Update relationship value\n * \n * Maintains runtime relationship shape: hydrated objects, arrays, or null.\n * Does NOT reintroduce JSON:API wrapper format like { data: { id } }.\n * \n * @param {Object|Array|null} rel - Current relationship value (runtime object/array/null)\n * @param {*} data - New relationship data (can be object, id string, or null)\n * @returns {Object|Array|null} Updated relationship value (runtime format)\n */\n const updateRelation = (rel, data) => {\n dbg(\"update relation\", rel, data);\n\n // Handle null\n if (data === null) {\n return null;\n }\n\n // rel is to-many (array)\n if (rel && Array.isArray(rel)) {\n // For arrays, keep as array (don't convert to single object)\n // If data is array, replace; if single object/id, wrap in array\n if (Array.isArray(data)) {\n // Replace array with new array of runtime objects\n return data.map(item => {\n if (typeof item === 'object' && item !== null) {\n return new Item().loadFromData(item);\n }\n // If it's an id, find existing item or create placeholder\n return item;\n });\n }\n // Single item - add to array or replace? For now, keep existing behavior\n dbg(\"to fix: array relationship update\");\n return rel;\n }\n\n // rel is to-one (object or null)\n if (typeof data === \"object\" || data === null) {\n // Data is object - load as Item instance (runtime object)\n dbg(\"Update 1:1 relation\");\n let item = new Item().loadFromData(data);\n dbg(\"relation\", item);\n return item;\n }\n\n // Data is id string\n if (typeof data === \"string\" || typeof data === \"number\") {\n dbg(\"Update 1:1 relation with id\", data);\n // If current rel matches id, keep it\n if (rel && rel.id && (rel.id === data || String(rel.id) === String(data))) {\n return rel;\n }\n \n // Otherwise, create a minimal runtime object with just id\n // (type will be inferred or set elsewhere)\n // This maintains runtime format, not JSON:API wrapper format\n const newRel = {\n id: String(data),\n }\n if(rel && rel.type) {\n newRel.type = rel.type;\n }\n return newRel;\n }\n\n // Unknown format - return as-is\n return rel;\n };\n\n // Update relationships\n Object.getOwnPropertyNames(this.relationships).forEach((relName) => {\n if (!updateData.hasOwnProperty(relName)) {\n return;\n }\n if (updateData[relName] === null) {\n this.relationships[relName] = null;\n return;\n }\n this.relationships[relName] = updateRelation(this.relationships[relName], updateData[relName]);\n delete updateData[relName];\n });\n\n // Check attributes\n Object.getOwnPropertyNames(updateData).forEach((attrName) => {\n if (updateData[attrName] && typeof updateData[attrName] === \"object\") {\n if (!this.strict && typeof this.relationships[attrName] === \"undefined\") {\n this.relationships[attrName] = updateRelation(this.relationships[attrName], updateData[attrName]);\n }\n return;\n }\n\n if (!this.shadow.attributes.hasOwnProperty(attrName)) {\n if (!this.strict) {\n this.attributes[attrName] = updateData[attrName];\n }\n return;\n }\n\n // Update only if different from prev value\n if (updateData[attrName] !== this.shadow.attributes[attrName]) {\n this.attributes[attrName] = updateData[attrName];\n }\n });\n\n dbg(\"updateOptions\", updateOptions);\n\n if (updateOptions.sync) {\n return this.perform_update(updateOptions);\n }\n\n return new Promise((resolve) => {\n this.syncOp = () => this.perform_update(updateOptions);\n this.views.forEach((view) => {\n if (updateOptions.rerender) {\n view.render();\n }\n });\n resolve();\n });\n }\n\n /**\n * Remove item\n */\n remove() {\n return new Promise((resolve, reject) => {\n let ps = [];\n for (let i = this.views.length - 1; i >= 0; i--) {\n ps.push(this.views[i].remove());\n }\n\n let collection = this.collection;\n if (collection) {\n ps.push(collection.removeItem(this));\n }\n\n Promise.all(ps)\n .then(() => {\n this._trigger('remove', this);\n // Trigger collection update event once (removeItem() no longer triggers it)\n if (collection) {\n console.log(\"removed\");\n \n collection.onupdate();\n }\n })\n .finally(() => resolve());\n });\n }\n\n /**\n * Delete item\n */\n async delete(ops) {\n if(!this.deleteUrl) {\n return this.remove();\n }\n\n let deleteOps = {\n sync: true,\n };\n\n if (ops && ops.constructor === Object) {\n Object.assign(deleteOps, ops);\n }\n\n try {\n // Convert URL object to string for Storage\n log(\"delete\", this.deleteUrl.toString());\n await this.storage.delete(this, this.deleteUrl.toString(), {});\n await this.remove();\n } catch (error) {\n dbg(\"Error deleting item\", error);\n throw error;\n }\n }\n\n /**\n * Render item\n */\n render(collectionView, addontop = false) {\n dbg(\"Render from item\", this);\n this.views.forEach((view) => {\n if (typeof collectionView === \"undefined\") {\n dbg(\"collectionView is undefined so render view\");\n view.render();\n \n }\n else if (view.container === collectionView) {\n dbg(\"collectionView matches view container so render view\");\n view.render(false, addontop);\n }\n dbg(\"trigger afterrender\", this,view,view.el);\n this._trigger('afterrender', this,view);\n });\n \n return this;\n }\n\n /**\n * Destroy item and clean up resources\n * \n * Removes event handlers, views, and clears references.\n * Safe to call multiple times.\n * \n * @returns {Item} This instance for chaining\n */\n destroy() {\n // Create shallow copy to avoid mutation during iteration\n const viewsToDestroy = this.views ? [...this.views] : [];\n \n // Destroy all views (iterate over copy, not live array)\n viewsToDestroy.forEach(view => {\n if (view && typeof view.destroy === 'function') {\n view.destroy();\n }\n });\n \n // Clear views array after iteration\n this.views = [];\n\n // Clean up callbacks\n this.callbacks = {};\n\n // Remove from collection if part of one\n if (this.collection) {\n // Note: collection.removeItem() will handle cleanup\n // but we clear the reference here\n this.collection = null;\n }\n\n // Clear storage reference\n this.storage = null;\n\n // Clear URLs\n this.url = null;\n this.updateUrl = null;\n this.deleteUrl = null;\n\n // Clear data\n this.attributes = {};\n this.relationships = {};\n this.shadow = null;\n\n // Clear views array\n this.views = [];\n\n return this;\n }\n}\n", "import { dbg, parseOptions, getBoundObjects } from './utils.js';\n\n/**\n * CollectionView class - handles rendering of collections\n */\nexport class CollectionView {\n constructor(options = {}) {\n this.el = null;\n this.type = \"CollectionView\";\n this.container = null;\n this.collection = null;\n this.itemsContainer = null;\n this.allowempty = true;\n\n try {\n Object.assign(this, parseOptions(options));\n } catch (e) {\n throw new Error(\"Error on CollectionView init\", e);\n }\n\n this.dataBindings = getBoundObjects(this.el);\n }\n\n /**\n * Reset the view\n */\n reset(force) {\n if (this.allowempty || force) {\n if (this.el) {\n $(this.el).empty();\n }\n }\n return this;\n }\n\n /**\n * Render the collection view\n */\n render() {\n dbg(\"Render _collectionView\", this.collection);\n\n if (this.collection && this.collection.navtype === \"page\") {\n this.reset();\n }\n\n if (this.collection && this.collection.items.length === 0) {\n this.renderEmpty();\n return this;\n }\n\n if (this.collection) {\n this.collection.items.forEach((item) => {\n item.render(this);\n });\n }\n\n return this;\n }\n\n /**\n * Render empty state\n */\n renderEmpty() {\n if (!this.collection || !this.collection.emptyview) {\n return this;\n }\n\n this.reset();\n $(this.el).append(this.collection.emptyview);\n return this;\n }\n\n /**\n * Destroy view and clean up resources\n */\n destroy() {\n // Clean up DOM\n if (this.el) {\n const $el = $(this.el);\n $el.empty();\n $el.removeData();\n }\n\n // Clear references\n this.collection = null;\n this.el = null;\n this.container = null;\n this.itemsContainer = null;\n this.dataBindings = null;\n\n return this;\n }\n}\n", "import { dbg, log } from './utils.js';\n\n/**\n * Paging class - handles pagination UI for collections\n */\nexport class Paging {\n constructor(pagingEl, collection) {\n this.collection = collection;\n this.el = $(pagingEl);\n\n\n // Link paging to collection\n this.collection.paging = this;\n\n // Initialize offset\n this.iniOffset = (this.collection.offset ? this.collection.offset : 0) * 1;\n\n // Default page size\n this.defaultPageSize = 20;\n this.pageSize = this.collection.pageSize;\n\n // Setup page size input\n this.setupPageSizeInput();\n\n // Setup offset input\n this.setupOffsetInput();\n\n // Extract button templates\n this.buttons = this.extractButtons();\n log(\"buttons\", this.buttons);\n\n // Get total count element\n this.setupTotalCount();\n\n // Clear and prepare container\n this.render();\n }\n\n /**\n * Setup page size input handler\n */\n setupPageSizeInput() {\n let pageSizeInp = $(this.collection.pagesizeinp);\n if (pageSizeInp.length) {\n this.collection.setPageSize(pageSizeInp.val());\n pageSizeInp.off(\"change\").on(\"change\", () => {\n if (this.collection.setPageSize(pageSizeInp.val())) {\n this.collection.loadFromRemote();\n }\n });\n }\n }\n\n /**\n * Setup offset input handler\n */\n setupOffsetInput() {\n let offsetInp = $(this.collection.offsetinp);\n if (offsetInp.length) {\n this.collection.setOffset(offsetInp.val());\n offsetInp.off(\"change\").on(\"change\", () => {\n if (this.collection.setOffset(offsetInp.val())) {\n this.collection.loadFromRemote();\n }\n });\n }\n }\n\n /**\n * Extract button templates from container\n */\n extractButtons() {\n let buttons = {};\n\n // Clone and remove from DOM\n const pageBtn = $(this.el).find(\"[name=page]\");\n if (pageBtn.length) {\n buttons.page = pageBtn.clone();\n pageBtn.remove();\n }\n\n const prevBtn = $(this.el).find(\"[name=prev]\");\n if (prevBtn.length) {\n buttons.prev = prevBtn.clone();\n prevBtn.remove();\n }\n\n const nextBtn = $(this.el).find(\"[name=next]\");\n if (nextBtn.length) {\n buttons.next = nextBtn.clone();\n nextBtn.remove();\n }\n\n const firstBtn = $(this.el).find(\"[name=first]\");\n if (firstBtn.length) {\n buttons.first = firstBtn.clone();\n firstBtn.remove();\n }\n\n const lastBtn = $(this.el).find(\"[name=last]\");\n if (lastBtn.length) {\n buttons.last = lastBtn.clone();\n lastBtn.remove();\n }\n\n return buttons;\n }\n\n /**\n * Setup total count element\n */\n setupTotalCount() {\n this.$totalCount = $(this.collection.totalrecscount);\n }\n\n /**\n * Clear container\n */\n clearContainer() {\n $(this.el).empty();\n $(this.el).find(\"[data-type=pages]\").empty();\n }\n\n /**\n * Update total count display\n */\n updateTotalCount(total) {\n if (this.$totalCount && this.$totalCount.length) {\n if (this.$totalCount[0].tagName === \"INPUT\") {\n this.$totalCount.val(total);\n } else {\n this.$totalCount.text(total);\n }\n }\n }\n\n /**\n * Create and append button element\n */\n appendButton(button, clickHandler, title) {\n let btn = button.clone();\n if (title !== undefined) {\n btn.attr(\"title\", title);\n }\n btn.on(\"click\", clickHandler);\n $(this.el).append(btn);\n return btn;\n }\n\n /**\n * Render pagination controls\n */\n render() {\n const pagesToShow = 5;\n const total = this.collection.total;\n\n log(\"Paging render\", total, this.buttons);\n // Update total count\n this.updateTotalCount(total);\n\n // Clear container\n this.clearContainer();\n\n // Update initial offset\n this.iniOffset = this.collection.offset * 1;\n\n // Determine page size\n if (this.collection.pageSize) {\n this.pageSize = this.collection.pageSize;\n } else if (total - this.iniOffset - this.collection.items.length > 0) {\n this.pageSize = this.collection.items.length;\n } else {\n this.pageSize = this.defaultPageSize;\n }\n\n this.pageSize = this.pageSize * 1;\n log(\"Paging obj\",this,this.pageSize,total)\n // Don't render if page size is larger than total\n if (this.pageSize > total) {\n return;\n }\n \n\n // Render first and prev buttons\n if (this.iniOffset > 0) {\n if (this.buttons.first) {\n this.appendButton(\n this.buttons.first,\n () => {\n this.collection.setOffset(0);\n this.collection.loadFromRemote();\n },\n 0\n );\n }\n\n if (this.buttons.prev) {\n this.appendButton(\n this.buttons.prev,\n () => {\n this.collection.setOffset(this.iniOffset - this.pageSize);\n this.collection.loadFromRemote();\n },\n this.iniOffset - this.pageSize\n );\n }\n }\n\n // Calculate page range to show\n let lowerLimit = Math.floor(this.iniOffset / this.pageSize) - Math.floor(pagesToShow / 2);\n lowerLimit = lowerLimit < 0 ? 0 : lowerLimit;\n\n let upperLimit = Math.floor(this.iniOffset / this.pageSize) + Math.ceil(pagesToShow / 2);\n upperLimit = upperLimit * this.pageSize < total ? upperLimit : Math.ceil(total / this.pageSize);\n\n // Render page number buttons\n for (let i = lowerLimit; i < upperLimit; i++) {\n if (!this.buttons.page) {\n continue;\n }\n\n const pageOffset = i * this.pageSize;\n const isActive = Math.floor(this.iniOffset / this.pageSize) === i;\n\n let pageBtn = this.buttons.page.clone();\n pageBtn.text(i + 1)\n .attr(\"title\", pageOffset)\n .on(\"click\", () => {\n this.collection.setOffset(pageOffset);\n this.collection.loadFromRemote();\n });\n if (isActive) {\n pageBtn.addClass(\"active\").off(\"click\");\n }\n $(this.el).append(pageBtn);\n }\n\n // Render next and last buttons\n const nxtOffset = this.iniOffset + this.pageSize;\n if (this.iniOffset + this.pageSize < total) {\n if (this.buttons.next) {\n this.appendButton(\n this.buttons.next,\n () => {\n this.collection.setOffset(nxtOffset);\n this.collection.loadFromRemote();\n },\n nxtOffset\n );\n }\n\n if (this.buttons.last) {\n const lastPageOffset = (Math.ceil(total / this.pageSize) - 1) * this.pageSize;\n log(\"last button\", total, lastPageOffset,this.pageSize,this.offset);\n if(lastPageOffset>this.iniOffset*1) {\n this.appendButton(\n this.buttons.last,\n () => {\n this.collection.setOffset(lastPageOffset);\n this.collection.loadFromRemote();\n },\n lastPageOffset\n );\n }\n }\n }\n\n // Update offset input value\n let offsetInp = $(this.collection.offsetinp);\n if (offsetInp.length) {\n offsetInp.val(this.iniOffset);\n }\n }\n\n /**\n * Destroy paging and clean up resources\n */\n destroy() {\n // Remove event handlers from page size input\n if (this.collection && this.collection.pagesizeinp) {\n const pageSizeInp = $(this.collection.pagesizeinp);\n pageSizeInp.off(\"change\");\n }\n\n // Remove event handlers from offset input\n if (this.collection && this.collection.offsetinp) {\n const offsetInp = $(this.collection.offsetinp);\n offsetInp.off(\"change\");\n }\n\n // Clean up container\n if (this.el) {\n const $el = $(this.el);\n $el.empty();\n $el.off(); // Remove any remaining event handlers\n $el.removeData();\n }\n\n // Clear references\n this.collection = null;\n this.el = null;\n this.buttons = null;\n this.$totalCount = null;\n\n return this;\n }\n}\n", "import { dbg, log, parseOptions, createOverlay, trace } from './utils.js';\nimport { createURL } from './URL.js';\nimport { Storage } from './Storage.js';\nimport { resolveAdapter } from './adapters/index.js';\nimport { Item } from './Item.js';\nimport { ItemView } from './ItemView.js';\nimport { CollectionView } from './CollectionView.js';\nimport { Paging } from './Paging.js';\n\n/**\n * Collection class - represents a collection of items\n */\nexport class Collection {\n constructor(opts = {}) {\n \n this.url = null;\n this.deleteUrl = null;\n this.insertUrl = null;\n this.updateUrl = null;\n this.paging = null;\n this.view = null;\n this.offset = 0;\n this.total = null;\n this.pageSize = 10;\n this.template = null;\n this.navtype = \"page\";\n this.type = null;\n this.emptyview = null;\n this.items = []; // Canonical storage - use this.items only\n this.addontop = false;\n this.uievents = [];\n this.setAttrAsId = null;\n this.itemListeners = null; // Listeners to apply to all items created in this collection\n this.adapter = null;\n\n this.callbacks = {};\n this.iterator = -1;\n\n trace(\"Collection init\", opts);\n try {\n opts = parseOptions(opts);\n } catch (e) {\n throw new Error(\"Error on Collection init\", e);\n }\n \n // Define length as getter (derived from items array)\n // This replaces manual length management and pseudo-array behavior\n Object.defineProperty(this, 'length', {\n get() {\n return this.items.length;\n },\n enumerable: true,\n configurable: true\n });\n\n let options = Object.assign({}, opts);\n \n Object.assign(this, options);\n\n if (options.hasOwnProperty(\"paging\") && $(options.paging).length) {\n this.paging = new Paging($(options.paging)[0], this);\n }\n\n if(this.url) {\n this.setUrl(this.url);\n }\n if(this.deleteUrl) {\n this.setUrl(this.deleteUrl, \"delete\");\n }\n if(this.updateUrl) {\n this.setUrl(this.updateUrl, \"update\");\n }\n if(this.insertUrl) {\n this.setUrl(this.insertUrl, \"insert\");\n }\n\n if (this.view) {\n this.view.collection = this;\n }\n\n if (this.total) {\n this.total = this.total * 1;\n }\n\n if ([\"page\", \"scroll\"].indexOf(this.navtype) === -1) {\n throw new Error(\"Invalid navigations type. Should be page or scroll\");\n }\n\n this.adapter = resolveAdapter(opts.adapter);\n\n this.storage = opts.hasOwnProperty(\"storage\")\n ? opts.storage\n : new Storage(\n (() => {\n const storageOpts = Object.assign({}, opts.ajaxOpts || {});\n if (opts.headers && typeof opts.headers === \"object\") {\n storageOpts.headers = Object.assign(\n {},\n storageOpts.headers || {},\n opts.headers\n );\n }\n return storageOpts;\n })()\n );\n\n if (typeof opts.listeners === \"object\") {\n for (let event in opts.listeners) {\n this.on(event, opts.listeners[event]);\n }\n }\n\n // Store item listeners if provided (via 'itemListeners' or 'itemOn' option)\n if (opts.itemListeners && typeof opts.itemListeners === \"object\") {\n this.itemListeners = opts.itemListeners;\n } else if (opts.itemOn && typeof opts.itemOn === \"object\") {\n this.itemListeners = opts.itemOn;\n }\n }\n\n /**\n * Event listener registration\n */\n on(eventName, cb) {\n if (typeof this.callbacks[eventName] === \"undefined\") {\n this.callbacks[eventName] = [];\n }\n this.callbacks[eventName].push(cb);\n return this;\n }\n\n /**\n * Remove event listener(s)\n * @param {string} eventName - Event name\n * @param {Function} [cb] - Optional callback to remove. If not provided, removes all listeners for the event\n * @returns {Collection} This instance for chaining\n */\n off(eventName, cb) {\n if (!eventName) {\n // Remove all listeners\n this.callbacks = {};\n return this;\n }\n \n if (!this.callbacks[eventName]) {\n return this;\n }\n\n if (cb) {\n // Remove specific callback\n const index = this.callbacks[eventName].indexOf(cb);\n if (index > -1) {\n this.callbacks[eventName].splice(index, 1);\n }\n // Clean up empty arrays\n if (this.callbacks[eventName].length === 0) {\n delete this.callbacks[eventName];\n }\n } else {\n // Remove all listeners for this event\n delete this.callbacks[eventName];\n }\n \n return this;\n }\n\n /**\n * Register a one-time event listener\n * @param {string} eventName - Event name\n * @param {Function} cb - Callback function\n * @returns {Collection} This instance for chaining\n */\n once(eventName, cb) {\n const wrapper = (...args) => {\n cb(...args);\n this.off(eventName, wrapper);\n };\n return this.on(eventName, wrapper);\n }\n\n /**\n * Check if event has listeners\n * @param {string} eventName - Event name\n * @returns {boolean} True if event has listeners\n */\n hasListeners(eventName) {\n return this.callbacks[eventName] && Array.isArray(this.callbacks[eventName]) && this.callbacks[eventName].length > 0;\n }\n\n /**\n * Trigger an event (internal helper)\n * @private\n * @param {string} eventName - Event name\n * @param {...any} args - Arguments to pass to callbacks\n */\n _trigger(eventName, ...args) {\n if (this.callbacks[eventName] && Array.isArray(this.callbacks[eventName])) {\n this.callbacks[eventName].forEach(cb => {\n if (typeof cb === 'function') {\n cb(...args);\n }\n });\n }\n }\n\n /**\n * Emit/trigger an event manually\n * @param {string} eventName - Event name\n * @param {...any} args - Arguments to pass to callbacks\n * @returns {Collection} This instance for chaining\n */\n emit(eventName, ...args) {\n this._trigger(eventName, ...args);\n return this;\n }\n\n /**\n * Show listeners (debug)\n */\n showlisteners() {\n dbg(this.callbacks);\n }\n\n \n\n /**\n * Remove item from collection\n * \n * Removes item from items array. Does NOT trigger update event\n * (that's handled by Item.remove() to avoid duplication).\n * \n * @param {Item} item - Item instance to remove\n * @returns {Promise} Resolves when item is removed\n */\n removeItem(item) {\n const index = this.items.findIndex(i => i === item || (i.id && item.id && i.id === item.id));\n if (index !== -1) {\n // Remove from items array (no pseudo-array manipulation)\n this.items.splice(index, 1);\n // Note: update event is triggered by Item.remove() to avoid duplication\n }\n // Return promise for consistency (item.remove() is async)\n return Promise.resolve();\n }\n\n /**\n * Set page size\n */\n setPageSize(val) {\n if (/^\\d+$/.test(val)) {\n this.pageSize = val;\n return true;\n }\n return false;\n }\n\n /**\n * Empty collection\n */\n empty() {\n return this.clear();\n }\n\n /**\n * Set offset\n */\n setOffset(val) {\n if (/^\\d+$/.test(val)) {\n this.offset = val;\n return true;\n }\n return false;\n }\n\n /**\n * Bulk update (not implemented)\n */\n update(data) {\n throw new Error(\"Not implemented... yet\");\n }\n setUrl(url,type) {\n if(!url)\n return this;\n switch(type) {\n case \"delete\":\n this.deleteUrl = createURL(url);\n break;\n case \"update\":\n this.updateUrl = createURL(url);\n break;\n case \"insert\":\n this.insertUrl = createURL(url);\n break;\n default:\n log(\"setUrl\", url);\n this.url = createURL(url);\n this.deleteUrl = typeof this.deleteUrl == \"string\" ? createURL(this.deleteUrl) : (this.deleteUrl ?? createURL(this.url));\n this.updateUrl = typeof this.updateUrl == \"string\" ? createURL(this.updateUrl) : (this.updateUrl ?? createURL(this.url));\n this.insertUrl = typeof this.insertUrl == \"string\" ? createURL(this.insertUrl) : (this.insertUrl ?? createURL(this.url));\n break;\n }\n return this;\n }\n \n\n /**\n * Receive remote data\n * \n * Processes JSON:API document by hydrating relationships and extracting data array.\n * Uses the new explicit hydration layer to replace relationship references with\n * actual resource objects from included resources.\n * \n * IMPORTANT: For single item responses (e.g., from append/create), uses parseItemData()\n * to avoid wrapping in array and triggering collection replacement behavior.\n */\n receiveRemoteData(data) {\n dbg(\"Remote data received\", data);\n\n if (this.adapter.isSingleItemResponse(data)) {\n const hydratedItem = this.adapter.parseItemResponse(data);\n this.adapter.applyMetadata(this, this.adapter.extractMetadata(data));\n\n if (this.items.length === 0) {\n this.view.reset(true);\n }\n dbg(\"Append single item to collection\");\n let newItem = this.loadItem(hydratedItem);\n newItem.render(this.view, this.addontop);\n this._trigger('afterrender', this);\n return newItem;\n }\n\n const { items, meta } = this.adapter.parseCollectionResponse(data, { type: this.type });\n this.adapter.applyMetadata(this, meta);\n\n if (items == null) {\n return;\n }\n\n if (items.constructor === Array) {\n log(\"Append multiple items to collection\");\n if (this.items.length === 0) {\n this.view.reset(true);\n }\n\n const loadedItems = [];\n items.forEach((item) => {\n const loadedItem = this.loadItem(item);\n if (loadedItem) {\n loadedItems.push(loadedItem);\n }\n });\n\n this.render();\n return loadedItems;\n }\n }\n\n /**\n * Extract metadata and data from JSON:API document\n * \n * Extracts metadata (totalRecords, offset) from JSON:API response meta object\n * and returns the hydrated data array. Data hydration is handled by\n * parseCollectionData() before this is called.\n * \n * @param {Object} data - JSON:API document (data property should already be hydrated)\n * @returns {Array} Array of hydrated item data objects\n */\n extractMetadataAndData(data) {\n dbg(\"extract metadata and data\", data);\n\n if (!data.hasOwnProperty(\"data\")) {\n return data;\n }\n\n this.adapter.applyMetadata(this, this.adapter.extractMetadata(data));\n return data.data;\n }\n\n /**\n * Parse collection data from JSON:API document (legacy alias)\n * \n * @deprecated Use extractMetadataAndData() instead\n * @param {Object} data - JSON:API document\n * @returns {Array} Array of hydrated item data objects\n */\n parse(data) {\n return this.extractMetadataAndData(data);\n }\n\n /**\n * Load from data\n */\n loadFromData(data) {\n dbg(\"collection load from data\", data);\n\n if (data === null || typeof data !== \"object\" || data.constructor !== Array) {\n dbg(\"cannot load \", data, \" into collection \", this);\n return this;\n }\n\n if (this.navtype === \"page\") {\n this.items = [];\n }\n\n data.forEach((item) => {\n this.loadItem(item);\n });\n\n if (this.view) {\n this.view.render();\n } else {\n dbg(\"collection does not have a view \", this);\n }\n\n this._trigger('load', this);\n return this;\n }\n\n /**\n * Next page\n */\n next() {\n this.offset = parseInt(this.offset) + parseInt(this.pageSize);\n this.loadFromRemote();\n }\n\n /**\n * Previous page\n */\n prev() {\n this.offset = parseInt(this.offset) - parseInt(this.pageSize);\n this.loadFromRemote();\n }\n\n /**\n * Clear collection\n * \n * Synchronously clears items array and renders empty state.\n * For async item cleanup, use destroy() instead.\n * \n * @returns {Collection} This instance for chaining\n */\n clear() {\n // Clear items array synchronously (no async remove calls)\n // If you need to cleanup item resources, call destroy() instead\n this.items = [];\n \n // Render empty state\n if (this.view) {\n this.view.render();\n }\n \n this._trigger('update', this);\n return this;\n }\n\n /**\n * Render collection\n */\n render() {\n if (this.view) {\n this.view.render();\n }\n\n this._trigger('afterrender', this);\n return this;\n }\n\n /**\n * Load from remote\n * \n * Canonical method for loading collection data from API\n */\n loadFromRemote() {\n return this.loadFromDataSource();\n }\n\n load(data) {\n return data ? this.loadFromData(data):this.loadFromRemote();\n }\n\n /**\n * Load from data source (internal implementation)\n * @private\n */\n loadFromDataSource() {\n const overlay = createOverlay(this);\n let loader = null;\n\n if (this.view && this.view.el) {\n loader = $(overlay).clone().insertBefore(this.view.el)\n .width($(this.view.el).width())\n .height($(this.view.el).height());\n }\n\n this._trigger('beforeload', this);\n\n return new Promise((resolve, reject) => {\n if (!this.url) {\n loader.remove();\n reject(new Error(\"No valid URL provided\"));\n return;\n }\n\n this.adapter.applyListQuery(this.url, {\n type: this.type,\n offset: this.offset,\n pageSize: this.pageSize,\n });\n\n // Convert URL object to string for Storage\n let urlString = this.url.toString ? this.url.toString() : this.url;\n \n this.storage.read(this, urlString, {})\n .then((res) => {\n // For page navigation, clear existing items (replace)\n // For scroll navigation, append to existing items\n if (this.navtype === \"page\") {\n this.items = [];\n }\n // receiveRemoteData() will load items into collection\n this.receiveRemoteData(res.data);\n this._trigger('load', this);\n if (loader) {\n $(loader).remove();\n }\n if(this.paging) {\n this.paging.render();\n }\n resolve(this);\n })\n .catch((error) => {\n // Handle both old error format and new Error instances\n // KViewsHttpError has jqXHR, textStatus, errorThrown properties\n if (error instanceof Error && error.jqXHR) {\n // New error format (KViewsHttpError)\n this.fail(error.jqXHR, error.textStatus || 'error', error.errorThrown || error);\n loader.remove();\n reject(error);\n } else if (error && error.jqXHR) {\n // Old error format (backward compatibility - plain object)\n this.fail(error.jqXHR, error.textStatus, error.errorThrown);\n loader.remove();\n reject(error);\n } else {\n // Plain Error instance or other error\n this.fail(null, 'error', error);\n loader.remove();\n reject(error);\n }\n });\n });\n }\n\n /**\n * Handle failure\n */\n fail(xhr, txt, err) {\n dbg(\"Fail to load collection\", xhr, txt, err, this);\n }\n\n /**\n * On update callback\n */\n onupdate() {\n console.log(\"onupdate\");\n this._trigger('update', this);\n return this;\n }\n\n /**\n * Insert a single new item into collection\n * \n * Creates a single item via POST request and adds it to the collection.\n * The server response should contain the created item in JSON:API format.\n * \n * @param {Object} itemData - Single item data object (not an array)\n * @returns {Promise<Item>} Promise resolving to the created Item instance\n * @throws {Error} If itemData is an array (use batchInsert() instead)\n */\n insert(itemData) {\n // Validate that itemData is not an array\n if (Array.isArray(itemData)) {\n throw new Error('insert() expects a single item object. Use batchInsert() for multiple items.');\n }\n\n const payload = this.adapter.serializeForCreate(itemData, { type: this.type });\n\n return new Promise((resolve, reject) => {\n if (!this.insertUrl) {\n this.insertUrl = this.url;\n }\n\n // Convert URL object to string for Storage\n let insertUrlString = this.insertUrl.toString ? this.insertUrl.toString() : this.insertUrl;\n\n this.storage\n .create(this, insertUrlString, { contentType: payload.contentType }, payload.body)\n .then((resp) => {\n let data = resp.data;\n let newItem = this.receiveRemoteData(data);\n log(\"newItem\", newItem);\n this.onupdate();\n resolve(newItem);\n })\n .catch((resp) => {\n dbg(\"fail to receive data\", resp);\n reject(resp);\n });\n });\n }\n\n /**\n * Batch insert multiple items into collection\n * \n * Creates multiple items via POST request and adds them to the collection.\n * The server response should contain an array of created items in JSON:API format.\n * \n * @param {Array} itemsData - Array of item data objects\n * @returns {Promise<Array<Item>>} Promise resolving to array of created Item instances\n * @throws {Error} If itemsData is not an array\n */\n batchInsert(itemsData) {\n // Validate that itemsData is an array\n if (!Array.isArray(itemsData)) {\n throw new Error('batchInsert() expects an array of items. Use insert() for a single item.');\n }\n\n if (itemsData.length === 0) {\n return Promise.resolve([]);\n }\n\n const payload = this.adapter.serializeForCreate(itemsData, { type: this.type });\n\n return new Promise((resolve, reject) => {\n if (!this.insertUrl) {\n this.insertUrl = this.url;\n }\n\n // Convert URL object to string for Storage\n let insertUrlString = this.insertUrl.toString ? this.insertUrl.toString() : this.insertUrl;\n\n this.storage\n .create(this, insertUrlString, { contentType: payload.contentType }, payload.body)\n .then((resp) => {\n let data = resp.data;\n // For batch insert, response should be a collection (array)\n const result = this.receiveRemoteData(data);\n \n // If result is collection (array was processed), return all new items\n // If result is single item, wrap in array for consistency\n const newItems = Array.isArray(result) ? result : (result ? [result] : []);\n \n log(\"batchInsert newItems\", newItems);\n this.onupdate();\n resolve(newItems);\n })\n .catch((resp) => {\n dbg(\"fail to receive batch data\", resp);\n reject(resp);\n });\n });\n }\n\n /**\n * @deprecated Use insert() for single items or batchInsert() for multiple items\n * This method is bivalent and will be removed in a future version.\n * Alias for backward compatibility - delegates to insert() or batchInsert() based on input type.\n */\n append(itemData) {\n if (Array.isArray(itemData)) {\n return this.batchInsert(itemData);\n } else {\n return this.insert(itemData);\n }\n }\n\n /**\n * @deprecated Use insert() instead\n * Alias for backward compatibility\n */\n createItem(itemData) {\n return this.insert(itemData);\n }\n\n /**\n * @deprecated Use insert() instead\n * Alias for backward compatibility\n */\n newItem(itemData) {\n return this.insert(itemData);\n }\n\n /**\n * Load item\n */\n loadItem(itemData) {\n log(\"loadItem from collection\", itemData);\n if (!itemData) {\n log(\"no item data\", itemData);\n return null;\n }\n\n let opts = {\n type: this.type,\n collection: this,\n uievents: this.uievents,\n storage: this.storage,\n adapter: this.adapter,\n };\n if(this.setAttrAsId && itemData.id==null) {\n log(\"set item id from attribute\", this.setAttrAsId, itemData);\n itemData.id = itemData.attributes[this.setAttrAsId];\n }\n\n if (itemData.id && this.url) {\n // Create new URL instances by cloning and modifying\n let tmp;\n \n const url = createURL(this.url.toString());\n url.path += \"/\" + itemData.id;\n opts.url = createURL(url.toString());\n\n const updateUrl = createURL(this.updateUrl.toString());\n updateUrl.path += \"/\" + itemData.id;\n opts.updateUrl = createURL(updateUrl.toString());\n\n const deleteUrl = createURL(this.deleteUrl.toString());\n deleteUrl.path += \"/\" + itemData.id;\n opts.deleteUrl = createURL(deleteUrl.toString());\n \n const insertUrl = createURL(this.insertUrl.toString());\n insertUrl.path += \"/\" + itemData.id;\n opts.insertUrl = createURL(insertUrl.toString());\n }\n\n // Apply item listeners before creating item (so they're active when loadFromData triggers events)\n if (this.itemListeners) {\n // Store listeners temporarily in opts so they're applied during Item construction\n opts.itemListeners = this.itemListeners;\n }\n\n let newItem = new Item(opts)\n .bindView(new ItemView({\n template: this.template,\n container: this.view\n }))\n .loadFromData(itemData);\n\n // Add to items array (no pseudo-array manipulation)\n if (this.addontop) {\n dbg(\"Add on top\");\n this.items.unshift(newItem);\n } else {\n this.items.push(newItem);\n }\n\n return newItem;\n }\n\n /**\n * Destroy collection and clean up resources\n * \n * Removes event handlers, destroys all items and views, clears references.\n * Safe to call multiple times.\n * \n * @returns {Collection} This instance for chaining\n */\n destroy() {\n // Create shallow copy to avoid mutation during iteration\n const itemsToDestroy = [...this.items];\n \n // Destroy all items (iterate over copy, not live array)\n itemsToDestroy.forEach(item => {\n if (item && typeof item.destroy === 'function') {\n item.destroy();\n }\n });\n \n // Clear items array after iteration\n this.items = [];\n\n // Destroy view\n if (this.view && typeof this.view.destroy === 'function') {\n this.view.destroy();\n }\n this.view = null;\n\n // Destroy filtering\n if (this.filtering && typeof this.filtering.destroy === 'function') {\n this.filtering.destroy();\n }\n this.filtering = null;\n\n // Destroy paging\n if (this.paging && typeof this.paging.destroy === 'function') {\n this.paging.destroy();\n }\n this.paging = null;\n\n // Clean up callbacks\n this.callbacks = {};\n\n // Clear storage reference\n this.storage = null;\n\n // Clear URLs\n this.url = null;\n this.deleteUrl = null;\n this.insertUrl = null;\n this.updateUrl = null;\n\n // Reset state\n this.items = []; // length is derived from items array (getter)\n this.total = null;\n this.offset = 0;\n\n return this;\n }\n\n}\n", "import { dbg } from './utils.js';\n\n/**\n * Filtering class - handles filter form submission\n */\nexport class Filtering {\n constructor(filterForm, collection) {\n this.collection = collection;\n this.el = filterForm;\n\n let $form = $(filterForm);\n $form.data(\"instance\", collection)\n .on(\"submit\", (e) => {\n dbg(\"Filter form was submitted\");\n e.preventDefault();\n this.handleSubmit($form[0]);\n })\n .on(\"reset\", () => {\n delete this.collection.url.parameters.filter;\n this.collection.loadFromRemote();\n dbg(\"filter form reset\");\n });\n }\n\n /**\n * Handle form submit\n */\n handleSubmit(form) {\n let filter = [];\n for (let i = 0; i < form.elements.length; i++) {\n let el = form.elements[i];\n let $el = $(el);\n let value = $el.val();\n let operator = $el.data(\"operator\");\n\n if (el.name && value) {\n filter.push(\n el.name + (operator ? operator : \"=\") + value\n );\n }\n }\n\n this.collection.offset = 0;\n if (filter.length) {\n this.collection.url.parameters.filter = filter.join(\",\");\n } else {\n delete this.collection.url.parameters.filter;\n }\n this.collection.loadFromRemote();\n }\n\n /**\n * Destroy filtering and clean up resources\n */\n destroy() {\n // Remove event handlers\n if (this.el) {\n const $form = $(this.el);\n $form.off(\"submit\");\n $form.off(\"reset\");\n // Remove jQuery data if available\n if (typeof $form.removeData === 'function') {\n $form.removeData(\"instance\");\n }\n }\n\n // Clear references\n this.collection = null;\n this.el = null;\n\n return this;\n }\n}\n", "// import { dbg } from './utils.js';\n\nexport class Sorting {\n constructor(sortHeader, collection) {\n this.el = sortHeader;\n this.collection = collection;\n\n const $sorts = sortHeader.find(\"[data-sortfld]\")\n .data(\"instance\",this.collection)\n .on(\"click\",this.sortNow.bind(this));\n\n }\n\n sortNow (ev) {\n let $lnk = $(ev.currentTarget);\n let fld = $lnk.data(\"sortfld\");\n let dir = $lnk.data(\"sortdir\");\n\n let inst = this.collection;\n let sort = inst.url.parameters.hasOwnProperty(\"sort\")?inst.url.parameters.sort:\"\";\n let sortArr = [];\n sort.split(\",\").forEach(function(item){\n let res = /^(-*)([a-z0-9\\-\\_]+)$/.exec(item.trim());\n if(!res)\n return;\n if(res[2]==fld)\n return;\n sortArr.push(item);\n });\n\n switch (dir) {\n case \"up\":\n sortArr.push(\"-\"+fld);\n $lnk.data(\"sortdir\",\"down\");\n $lnk.find(\".sort-up\").hide();\n $lnk.find(\".sort-down\").show();\n $lnk.find(\".sort-default\").hide();\n break;\n case \"down\":\n $lnk.data(\"sortdir\",null);\n\n $lnk.find(\".sort-up\").hide();\n $lnk.find(\".sort-down\").hide();\n $lnk.find(\".sort-default\").show();\n break;\n default:\n $lnk.data(\"sortdir\",\"up\");\n sortArr.push(fld);\n\n $lnk.find(\".sort-up\").show();\n $lnk.find(\".sort-down\").hide();\n $lnk.find(\".sort-default\").hide();\n }\n\n let nxtSort = sortArr.join(\",\");\n if(sort!==nxtSort) {\n inst.url.parameters.sort = nxtSort;\n inst.loadFromRemote();\n }\n }\n destroy() {\n if (this.el) {\n $(this.el).find(\"[data-sortfld]\").each(function(sort) {\n $(this).off(\"click\");\n $(this).removeData(\"instance\");\n });\n }\n return this;\n }\n \n}", "import { dbg } from './utils.js';\n\n/**\n * Utility functions for form handling and other operations\n */\nexport const utilities = {\n /**\n * Fill form fields with data from instance\n */\n fillForm: function (form, instance) {\n let formEl = $(form)[0];\n if ($(form).prop(\"tagName\") !== \"FORM\") {\n return null;\n }\n\n if (!instance || !instance.hasOwnProperty(\"attributes\")) {\n return null;\n }\n\n Object.getOwnPropertyNames(instance.attributes).forEach((attrName) => {\n if (!formEl.elements.hasOwnProperty(attrName)) {\n return;\n }\n let val = instance.attributes[attrName];\n let inp = formEl.elements[attrName];\n let $inp = $(inp);\n \n if (instance.attributes[attrName] && typeof instance.attributes[attrName] === \"object\" && instance.attributes[attrName].hasOwnProperty(\"id\")) {\n val = instance.attributes[attrName].id;\n }\n if ($inp.attr('type') === 'date') {\n val = val ? val.substr(0, 10) : val;\n }\n $inp.val(val);\n });\n\n if (!instance.relationships) {\n return;\n }\n\n Object.getOwnPropertyNames(instance.relationships).forEach((relName) => {\n if (!formEl.elements.hasOwnProperty(relName)) {\n return;\n }\n\n if (!instance.relationships[relName]) {\n $(formEl.elements[relName]).val(null);\n return;\n }\n\n let rel = instance.relationships[relName];\n let formElRel = formEl.elements[relName];\n\n if (rel.constructor === Array) {\n let vals = [];\n rel.forEach((relItem) => {\n vals.push(relItem.id);\n });\n $(formElRel).val(vals);\n } else {\n dbg(\"set \", relName, rel);\n if (formElRel.tagName === \"SELECT\") {\n let lbl = $(formElRel).data(\"label\");\n let lblVal = rel.hasOwnProperty(\"attributes\") && rel.attributes[lbl] ? rel.attributes[lbl] : rel.id;\n\n $(\"<option>\")\n .val(rel.id)\n .text(lblVal)\n .appendTo($(formElRel));\n }\n $(formElRel).val(rel.id);\n }\n });\n },\n\n /**\n * Capture form submit event and redirect it to callback\n */\n captureFormSubmit: function (form, cb) {\n let formEl = $(form);\n if (formEl.prop(\"tagName\") !== \"FORM\" || typeof cb !== \"function\") {\n return;\n }\n\n formEl.off(\"submit\").on(\"submit\", (event) => {\n event.preventDefault();\n let frm = formEl[0];\n cb(this.fetchFormData(frm), event);\n });\n return formEl;\n },\n\n /**\n * Fetch form data - handles array notation (name[]) and normalizes form element\n */\n fetchFormData: function (form) {\n // Normalize form element (handle jQuery, string selector, or DOM element)\n let formEl = $(form)[0];\n\n let formElements = {};\n Object.getOwnPropertyNames(formEl.elements).forEach((item) => {\n let el = formEl.elements[item];\n let $item = $(el);\n \n if (!$item.attr(\"name\") || $item.attr(\"name\") === \"\") {\n return;\n }\n if ($item.attr(\"type\") === \"checkbox\" && !$item[0].checked) {\n return;\n }\n let name = $item.attr(\"name\");\n let value = $item.val();\n\n // Handle array notation: name=\"field[]\" creates formElements.field = [value1, value2, ...]\n let arrayMatch = /(\\w+)\\[\\]/.exec(name);\n if (arrayMatch) {\n let arrayName = arrayMatch[1];\n if (!formElements[arrayName]) {\n formElements[arrayName] = [];\n }\n formElements[arrayName].push(value);\n } else {\n // Regular field: name=\"field\" creates formElements.field = value\n formElements[name] = value;\n }\n });\n return formElements;\n },\n\n /**\n * Extract form data - alias for fetchFormData (for backward compatibility)\n */\n extractFormData: function (form) {\n return this.fetchFormData(form);\n }\n};\n", "import { dbg, log, parseOptions, template } from './utils.js';\nimport { apiBaseConfig } from './apiBase.js';\nimport { Collection } from './Collection.js';\nimport { Item } from './Item.js';\nimport { CollectionView } from './CollectionView.js';\nimport { ItemView } from './ItemView.js';\nimport { Filtering } from './Filtering.js';\nimport { resolveAdapter, registerAdapter, setDefaultAdapter, getDefaultAdapter } from './adapters/index.js';\nimport { Sorting } from './Sorting.js';\nimport { utilities } from './utilities.js';\n\n/**\n * Main KViews class - factory for creating Item and Collection instances\n */\nexport class KViews {\n /**\n * Helper: Extract and merge options from element and parameters\n */\n static prepareOptions(el, opts) {\n if (!el) {\n dbg(\"Warning: no DOM element provided for apiator\");\n return null;\n }\n\n // Handle string URL as options\n if (typeof opts === \"string\") {\n opts = {\n url: opts,\n };\n }\n\n // Extract data attributes from HTML element\n let options = { dataBindings: {}, addontop: false };\n options = Object.assign(options, $(el).data());\n\n // Assign options passed as parameter\n try {\n Object.assign(options, parseOptions(opts));\n } catch (e) {\n throw new Error(\"Error on KViews init\", e);\n }\n\n return options;\n }\n\n /**\n * Helper: Check for existing instance and update if found\n * \n * SAFE UPDATE CONTRACT:\n * Only updates whitelisted safe configuration options.\n * Does not overwrite internal runtime state (callbacks, items, views, etc.)\n * \n * Safe to update:\n * - url, updateUrl, deleteUrl, insertUrl (via setUrl)\n * - template, type, pageSize, offset (configuration)\n * - emptyview, filter, paging (view configuration)\n * \n * NOT updated (internal state):\n * - callbacks, items, views, storage, filtering, paging instances\n * - length, total, iterator (runtime state)\n */\n static getOrUpdateInstance(el, options) {\n let existingInstance = $(el).data(\"instance\");\n\n if (existingInstance !== undefined) {\n // Whitelist of safe options that can be updated after initialization\n const safeUpdateOptions = [\n 'url', 'updateUrl', 'deleteUrl', 'insertUrl',\n 'template', 'type', 'pageSize', 'offset',\n 'emptyview', 'filter', 'paging', 'addontop',\n 'uievents', 'setAttrAsId', 'itemListeners', 'itemOn',\n 'headers', 'adapter'\n ];\n \n // Update URL if provided\n if (options.url) {\n existingInstance.setUrl(options.url);\n delete options.url;\n }\n\n // Parse options and filter to safe updates only\n const parsedOptions = parseOptions(options);\n const safeUpdates = {};\n \n safeUpdateOptions.forEach(key => {\n if (parsedOptions.hasOwnProperty(key)) {\n safeUpdates[key] = parsedOptions[key];\n }\n });\n \n // Apply only safe updates\n Object.assign(existingInstance, safeUpdates);\n\n if (safeUpdates.adapter) {\n existingInstance.adapter = resolveAdapter(safeUpdates.adapter);\n }\n\n if (safeUpdates.headers && existingInstance.storage && existingInstance.storage.defaultOptions) {\n existingInstance.storage.defaultOptions.headers = Object.assign(\n {},\n existingInstance.storage.defaultOptions.headers || {},\n safeUpdates.headers\n );\n }\n\n return existingInstance;\n }\n\n return null;\n }\n\n /**\n * Helper: Handle emptyview option\n */\n static processEmptyView(options) {\n if (options.hasOwnProperty(\"emptyview\")) {\n options.emptyview = $(options.emptyview).remove();\n }\n }\n\n /**\n * Helper: Attach listeners and finalize instance\n */\n static finalizeInstance(el, instance, options, listeners) {\n // Attach event listeners\n if (listeners) {\n Object.getOwnPropertyNames(listeners).forEach((eventName) => {\n instance.on(eventName, listeners[eventName]);\n });\n }\n\n // Store instance on element\n $(el).data(\"instance\", instance);\n\n dbg(\"instance\", instance.url);\n\n // Auto-load if URL is provided\n if (instance.url && (typeof options.dontload === \"undefined\" || !options.dontload)) {\n log(\"loadFromRemote now\", options, instance);\n instance.loadFromRemote();\n }\n\n return instance;\n }\n\n /**\n * Create collection instance\n */\n static createCollectionInstance(el, opts) {\n // Prepare options\n let options = KViews.prepareOptions(el, opts);\n log(\"createCollectionInstance\", options);\n if (!options) {\n return null;\n }\n\n // Check for existing instance\n let existingInstance = KViews.getOrUpdateInstance(el, options);\n if (existingInstance) {\n return existingInstance;\n }\n\n dbg(\"init apiator collection on \", el, options);\n\n // Handle emptyview\n KViews.processEmptyView(options);\n\n // Extract listeners\n let listeners = options.on;\n delete options.on;\n \n // Extract item listeners (keep in options, will be processed by Collection constructor)\n // Options 'itemListeners' or 'itemOn' are both supported\n dbg(\"Create collection instance\", options);\n\n let templateTxt = $(el).length ? $(el).html() : null;\n\n // Handle template option\n if (options.template) {\n if (options.template instanceof jQuery) {\n dbg(\"template is jQuery object\", options.template, el);\n let $tpl = $(options.template).clone().removeAttr(\"id\");\n templateTxt = $(\"<div>\").append($tpl).html();\n } else if (typeof options.template === \"string\") {\n dbg(\"template is raw text: can be either a jQuery selector or raw HTML\", options.template, el);\n templateTxt = $(\"<div>\").append($(options.template).clone().removeAttr(\"id\")).html();\n }\n }\n\n // Process template text\n if (templateTxt !== null) {\n templateTxt = templateTxt\n .replace(/</gi, '<')\n .replace(/>/gi, \">\")\n .replace(/'/gi, \"'\")\n .replace(/"/gi, '\"')\n .replace(/ /gi, \" \")\n .replace(/&/gi, \"&\");\n options.template = template(templateTxt);\n }\n\n let collectionConfig = {\n el: el,\n itemsContainer: options.hasOwnProperty(\"container\") \n ? $(options.container)\n : el,\n allowempty: options.disableempty !== true\n };\n\n options.view = new CollectionView(collectionConfig);\n log(\"Collection constructor\", options);\n let instance = new Collection(options);\n\n // Setup filtering\n if (options.hasOwnProperty(\"filter\")) {\n let filterEl = $(options.filter);\n if (filterEl.length && filterEl.prop(\"tagName\") === \"FORM\") {\n instance.filtering = new Filtering(filterEl, instance);\n }\n }\n\n if (options.hasOwnProperty(\"sort\")) {\n log(\"setup sorting\", options.sort);\n let sortEl = $(options.sort);\n if (sortEl.length) {\n instance.sorting = new Sorting(sortEl, instance);\n }\n }\n\n // Finalize instance (attach listeners, store on element, auto-load)\n KViews.finalizeInstance(el, instance, options, listeners);\n\n return instance;\n }\n\n /**\n * Create item instance\n */\n static createItemInstance(el, opts, data=null) {\n // Prepare options\n let options = KViews.prepareOptions(el, opts);\n if (!options) {\n return null;\n }\n\n // Check for existing instance\n let existingInstance = KViews.getOrUpdateInstance(el, options);\n if (existingInstance) {\n return existingInstance;\n }\n\n dbg(\"init apiator item on \", el, options);\n\n // Handle emptyview\n KViews.processEmptyView(options);\n\n // Extract listeners\n let listeners = options.on;\n delete options.on;\n\n // Extract template\n options.template = null;\n let templateTxt = null;\n\n if ($(el).length) {\n var node = $(el)[0];\n templateTxt = node ? node.outerHTML : null;\n }\n\n if (templateTxt) {\n templateTxt = templateTxt\n .replace(/</gi, '<')\n .replace(/>/gi, \">\")\n .replace(/'/gi, \"'\")\n .replace(/"/gi, '\"')\n .replace(/ /gi, \" \")\n .replace(/&/gi, \"&\");\n options.template = template(templateTxt);\n }\n\n let elId = $(el).attr(\"id\");\n let instance = new Item(options, data).bindView(new ItemView({\n template: options.template,\n el: el,\n id: elId ? elId : null\n }));\n\n // Finalize instance (attach listeners, store on element, auto-load)\n KViews.finalizeInstance(el, instance, options, listeners);\n\n // If dontload is true, render immediately with current data (if any)\n if (options.dontload && instance.attributes && Object.keys(instance.attributes).length > 0) {\n instance.render();\n }\n\n return instance;\n }\n static helpers = utilities;\n\n /**\n * Global default data adapter (name or instance). Defaults to 'jsonapi'.\n */\n static get defaultAdapter() {\n return getDefaultAdapter();\n }\n\n static set defaultAdapter(adapter) {\n setDefaultAdapter(adapter);\n }\n\n /**\n * Register a custom data adapter by name.\n *\n * @param {string} name\n * @param {object} adapter\n */\n static registerAdapter(name, adapter) {\n registerAdapter(name, adapter);\n }\n}\n\nObject.defineProperty(KViews, \"baseUrl\", {\n enumerable: true,\n configurable: true,\n get() {\n return apiBaseConfig.baseUrl;\n },\n set(v) {\n apiBaseConfig.baseUrl = v;\n },\n});\n\nObject.defineProperty(KViews, \"basePath\", {\n enumerable: true,\n configurable: true,\n get() {\n return apiBaseConfig.basePath;\n },\n set(v) {\n apiBaseConfig.basePath = v;\n },\n});\n\nObject.defineProperty(KViews, \"defaultHeaders\", {\n enumerable: true,\n configurable: true,\n get() {\n return apiBaseConfig.defaultHeaders;\n },\n set(v) {\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n apiBaseConfig.defaultHeaders = v;\n } else {\n apiBaseConfig.defaultHeaders = {};\n }\n },\n});\n", "/**\n * KViews - Class-based API data binding library\n * Refactored from jQuery plugin to ES6 classes\n */\n\nimport { KViews } from './KViews.js';\nimport { apiBaseConfig } from './apiBase.js';\nexport { Item } from './Item.js';\nexport { Collection } from './Collection.js';\nexport { ItemView } from './ItemView.js';\nexport { CollectionView } from './CollectionView.js';\nexport { Storage } from './Storage.js';\nexport { URL, createURL } from './URL.js';\nexport { Filtering } from './Filtering.js';\nexport { Sorting } from './Sorting.js';\nexport { Paging } from './Paging.js';\nexport { utilities } from './utilities.js';\nexport { JsonApiAdapter, PlainRestAdapter, resolveAdapter, registerAdapter, setDefaultAdapter, getDefaultAdapter } from './adapters/index.js';\nexport * from './utils.js';\n\n// Export KViews as default for bundle compatibility\nexport default KViews;\nexport { KViews };\n\n// Make KViews available globally for backward compatibility\nif (typeof window !== \"undefined\") {\n window.KViews = KViews;\n}\n\n// jQuery plugin wrapper for backward compatibility\nif (typeof $ !== \"undefined\" && $.fn) {\n $.fn.kviews = function (opts) {\n let el = this.length ? this[0] : this;\n \n // Determine resource type\n let resourcetype = \"collection\"; // default\n if (opts && opts.resourcetype) {\n resourcetype = opts.resourcetype;\n } else {\n let dataResourcetype = $(el).data(\"resourcetype\");\n if (dataResourcetype) {\n resourcetype = dataResourcetype;\n }\n }\n\n // Call appropriate method\n if (resourcetype === \"item\") {\n return KViews.createItemInstance(el, opts);\n } else {\n return KViews.createCollectionInstance(el, opts);\n }\n };\n\n Object.defineProperty($.fn.kviews, \"baseUrl\", {\n enumerable: true,\n configurable: true,\n get() {\n return apiBaseConfig.baseUrl;\n },\n set(v) {\n apiBaseConfig.baseUrl = v;\n },\n });\n Object.defineProperty($.fn.kviews, \"basePath\", {\n enumerable: true,\n configurable: true,\n get() {\n return apiBaseConfig.basePath;\n },\n set(v) {\n apiBaseConfig.basePath = v;\n },\n });\n Object.defineProperty($.fn.kviews, \"defaultHeaders\", {\n enumerable: true,\n configurable: true,\n get() {\n return apiBaseConfig.defaultHeaders;\n },\n set(v) {\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n apiBaseConfig.defaultHeaders = v;\n } else {\n apiBaseConfig.defaultHeaders = {};\n }\n },\n });\n\n // Helper methods\n $.fn.kviewsCollection = function (opts) {\n let options = {\n resourcetype: \"collection\"\n };\n\n if (typeof opts === \"undefined\") {\n opts = {};\n }\n if (typeof opts === \"string\") {\n opts = {\n url: opts,\n };\n }\n opts = Object.assign(opts, options);\n return this.kviews(opts);\n };\n\n $.fn.kviewsItem = function (opts) {\n let options = {\n resourcetype: \"item\"\n };\n\n if (typeof opts === \"undefined\") {\n opts = {};\n }\n if (typeof opts === \"string\") {\n opts = {\n url: opts,\n };\n }\n\n opts = Object.assign(opts, options);\n return this.kviews(opts);\n };\n\n \n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["target", "source", "optionsArgument", "error", "resource", "relationships", "normalized", "error", "error"]
|
|
7
|
+
}
|