@simai-studio/view 0.0.0-stage → 1.0.0

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.
Files changed (127) hide show
  1. package/LICENSE.md +183 -0
  2. package/README.md +75 -2
  3. package/dist/package-receipt.json +971 -0
  4. package/dist/set.json +141 -0
  5. package/dist/smart/rule.js +278 -0
  6. package/dist/smart/rule.js.gz +0 -0
  7. package/dist/smart/view/aliases.json +129 -0
  8. package/dist/smart/view/aliases.json.gz +0 -0
  9. package/dist/smart/view/component.json +1620 -0
  10. package/dist/smart/view/component.json.gz +0 -0
  11. package/dist/smart/view/css/view.css +208 -0
  12. package/dist/smart/view/css/view.css.gz +0 -0
  13. package/dist/smart/view/css/view.min.css +2 -0
  14. package/dist/smart/view/css/view.min.css.gz +0 -0
  15. package/dist/smart/view/examples.json +668 -0
  16. package/dist/smart/view/examples.json.gz +0 -0
  17. package/dist/smart/view/js/view.js +3938 -0
  18. package/dist/smart/view/js/view.js.gz +0 -0
  19. package/dist/smart/view/js/view.min.js +1 -0
  20. package/dist/smart/view/js/view.min.js.gz +0 -0
  21. package/dist/smart/view/lang/en.json +61 -0
  22. package/dist/smart/view/lang/en.json.gz +0 -0
  23. package/dist/smart/view/lang/ru.json +61 -0
  24. package/dist/smart/view/lang/ru.json.gz +0 -0
  25. package/dist/smart/view/probe.json +165 -0
  26. package/dist/smart/view/probe.json.gz +0 -0
  27. package/dist/smart/view/smart.manifest.json +1570 -0
  28. package/dist/smart/view/smart.manifest.json.gz +0 -0
  29. package/dist/smart/view/static/default/embedded.html +96 -0
  30. package/dist/smart/view/static/default/embedded.html.gz +0 -0
  31. package/dist/smart/view/static/default/open-record.html +247 -0
  32. package/dist/smart/view/static/default/open-record.html.gz +0 -0
  33. package/dist/smart/view/static/default/reference.html +247 -0
  34. package/dist/smart/view/static/default/reference.html.gz +0 -0
  35. package/dist/smart/view/static/sheets.json +282 -0
  36. package/dist/smart/view/static/sheets.json.gz +0 -0
  37. package/dist/smart/view-properties/aliases.json +174 -0
  38. package/dist/smart/view-properties/aliases.json.gz +0 -0
  39. package/dist/smart/view-properties/component.json +1898 -0
  40. package/dist/smart/view-properties/component.json.gz +0 -0
  41. package/dist/smart/view-properties/css/view-properties.css +1153 -0
  42. package/dist/smart/view-properties/css/view-properties.css.gz +0 -0
  43. package/dist/smart/view-properties/css/view-properties.min.css +2 -0
  44. package/dist/smart/view-properties/css/view-properties.min.css.gz +0 -0
  45. package/dist/smart/view-properties/examples.json +841 -0
  46. package/dist/smart/view-properties/examples.json.gz +0 -0
  47. package/dist/smart/view-properties/js/view-properties.js +10416 -0
  48. package/dist/smart/view-properties/js/view-properties.js.gz +0 -0
  49. package/dist/smart/view-properties/js/view-properties.min.js +1421 -0
  50. package/dist/smart/view-properties/js/view-properties.min.js.gz +0 -0
  51. package/dist/smart/view-properties/lang/en.json +96 -0
  52. package/dist/smart/view-properties/lang/en.json.gz +0 -0
  53. package/dist/smart/view-properties/lang/ru.json +96 -0
  54. package/dist/smart/view-properties/lang/ru.json.gz +0 -0
  55. package/dist/smart/view-properties/probe.json +188 -0
  56. package/dist/smart/view-properties/probe.json.gz +0 -0
  57. package/dist/smart/view-properties/skeleton.html +13 -0
  58. package/dist/smart/view-properties/skeleton.html.gz +0 -0
  59. package/dist/smart/view-properties/smart.manifest.json +1590 -0
  60. package/dist/smart/view-properties/smart.manifest.json.gz +0 -0
  61. package/dist/smart/view-properties/static/default/full.html +2 -0
  62. package/dist/smart/view-properties/static/default/full.html.gz +0 -0
  63. package/dist/smart/view-properties/static/default/panel-closed.html +4 -0
  64. package/dist/smart/view-properties/static/default/panel-closed.html.gz +0 -0
  65. package/dist/smart/view-properties/static/default/panel.html +4 -0
  66. package/dist/smart/view-properties/static/default/panel.html.gz +0 -0
  67. package/dist/smart/view-properties/static/default/reference.html +2 -0
  68. package/dist/smart/view-properties/static/default/reference.html.gz +0 -0
  69. package/dist/smart/view-properties/static/sheets.json +426 -0
  70. package/dist/smart/view-properties/static/sheets.json.gz +0 -0
  71. package/dist/smart/view-properties/template/default.css +989 -0
  72. package/dist/smart/view-properties/template/default.css.gz +0 -0
  73. package/dist/smart/view-properties/template/default.js +1660 -0
  74. package/dist/smart/view-properties/template/default.js.gz +0 -0
  75. package/dist/smart/view-table/aliases.json +448 -0
  76. package/dist/smart/view-table/aliases.json.gz +0 -0
  77. package/dist/smart/view-table/component.json +2738 -0
  78. package/dist/smart/view-table/component.json.gz +0 -0
  79. package/dist/smart/view-table/css/view-table.css +3658 -0
  80. package/dist/smart/view-table/css/view-table.css.gz +0 -0
  81. package/dist/smart/view-table/css/view-table.min.css +2 -0
  82. package/dist/smart/view-table/css/view-table.min.css.gz +0 -0
  83. package/dist/smart/view-table/examples.json +499 -0
  84. package/dist/smart/view-table/examples.json.gz +0 -0
  85. package/dist/smart/view-table/js/view-table.js +13879 -0
  86. package/dist/smart/view-table/js/view-table.js.gz +0 -0
  87. package/dist/smart/view-table/js/view-table.min.js +1440 -0
  88. package/dist/smart/view-table/js/view-table.min.js.gz +0 -0
  89. package/dist/smart/view-table/lang/en.json +132 -0
  90. package/dist/smart/view-table/lang/en.json.gz +0 -0
  91. package/dist/smart/view-table/lang/ru.json +132 -0
  92. package/dist/smart/view-table/lang/ru.json.gz +0 -0
  93. package/dist/smart/view-table/probe.json +275 -0
  94. package/dist/smart/view-table/probe.json.gz +0 -0
  95. package/dist/smart/view-table/smart.manifest.json +2524 -0
  96. package/dist/smart/view-table/smart.manifest.json.gz +0 -0
  97. package/dist/smart/view-table/static/default/current.html +141 -0
  98. package/dist/smart/view-table/static/default/current.html.gz +0 -0
  99. package/dist/smart/view-table/static/default/current.skeleton.html +141 -0
  100. package/dist/smart/view-table/static/default/current.skeleton.html.gz +0 -0
  101. package/dist/smart/view-table/static/default/empty.html +149 -0
  102. package/dist/smart/view-table/static/default/empty.html.gz +0 -0
  103. package/dist/smart/view-table/static/default/loading.html +180 -0
  104. package/dist/smart/view-table/static/default/loading.html.gz +0 -0
  105. package/dist/smart/view-table/static/default/many.html +180 -0
  106. package/dist/smart/view-table/static/default/many.html.gz +0 -0
  107. package/dist/smart/view-table/static/default/reference.html +136 -0
  108. package/dist/smart/view-table/static/default/reference.html.gz +0 -0
  109. package/dist/smart/view-table/static/default/reference.skeleton.html +136 -0
  110. package/dist/smart/view-table/static/default/reference.skeleton.html.gz +0 -0
  111. package/dist/smart/view-table/static/default/typed-cells.html +229 -0
  112. package/dist/smart/view-table/static/default/typed-cells.html.gz +0 -0
  113. package/dist/smart/view-table/static/default/typed-cells.skeleton.html +229 -0
  114. package/dist/smart/view-table/static/default/typed-cells.skeleton.html.gz +0 -0
  115. package/dist/smart/view-table/static/sheets.json +480 -0
  116. package/dist/smart/view-table/static/sheets.json.gz +0 -0
  117. package/dist/smart/view-table/studio.fixture.json +17 -0
  118. package/dist/smart/view-table/studio.fixture.json.gz +0 -0
  119. package/dist/smart/view-table/studio.scenario.json +30 -0
  120. package/dist/smart/view-table/studio.scenario.json.gz +0 -0
  121. package/dist/smart/view-table/template/default.css +1301 -0
  122. package/dist/smart/view-table/template/default.css.gz +0 -0
  123. package/dist/smart/view-table/template/default.js +1215 -0
  124. package/dist/smart/view-table/template/default.js.gz +0 -0
  125. package/dist/smart/view-table/template/link-cell-contract.js +48 -0
  126. package/dist/smart/view-table/template/link-cell-contract.js.gz +0 -0
  127. package/package.json +29 -4
Binary file
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e={"51250bf01ab0"(e,t,s){const i="sf-pref:",r=/^[\w.*:-]+(?:\/[\w.*:/-]+)?$/u;function n(){try{return globalThis.localStorage??null}catch{return null}}function a(e){return"string"==typeof e&&e.length>0&&e.length<=200&&r.test(e)}function o(e,t){try{return JSON.stringify(e)===JSON.stringify(t)}catch{return!1}}function l(e){return null==e?null:JSON.parse(JSON.stringify(e))}"undefined"!=typeof globalThis&&(globalThis.SF=globalThis.SF||{},globalThis.SF.Preferences||(globalThis.SF.Preferences=function(){const e={adapter:null,values:new Map},t=new Map,s=new Map;let r=!1;const c=()=>{if(r)return;const e=globalThis.document?.querySelector?.('script[type="application/json"][data-sf-preferences], script#sf-preferences[type="application/json"]');if(e){r=!0;try{g.preload(JSON.parse(e.textContent||"{}"))}catch{}}},d=(e,s)=>{for(const i of t.get(e)??[])try{i(l(s),e)}catch(t){console.error("SF.Preferences listener failed",e,t)}},h=e=>{const t=n();if(!t)return null;try{const s=t.getItem(i+e);return null===s?null:JSON.parse(s)}catch{return null}},u=(e,t)=>{const s=n();if(s)try{null===t?s.removeItem(i+e):s.setItem(i+e,JSON.stringify(t))}catch{}},p=t=>{clearTimeout(s.get(t)),s.delete(t);const i=e.adapter;if(!i)return;const r=e.values.has(t)?e.values.get(t):h(t);try{const e=null===r?i.remove?.(t):i.save?.(t,l(r));Promise.resolve(e).catch(e=>console.warn("SF.Preferences: the host did not keep",t,e))}catch(e){console.warn("SF.Preferences: the host did not keep",t,e)}},f=t=>{e.adapter&&(clearTimeout(s.get(t)),s.set(t,setTimeout(()=>p(t),400)))},g={read:t=>a(t)?(c(),e.values.has(t)?l(e.values.get(t)):l(h(t))):null,readMerged(...e){const t={};let s=!1;for(const i of e.flat()){const e=g.read(i);e&&"object"==typeof e&&!Array.isArray(e)&&(Object.assign(t,e),s=!0)}return s?t:null},write(t,s){if(!a(t))return!1;const i=l(s);return JSON.stringify(g.read(t))===JSON.stringify(i)||(e.values.has(t)&&e.values.set(t,i),u(t,i),f(t)),!0},remove:t=>!!a(t)&&(e.values.has(t)&&e.values.set(t,null),u(t,null),f(t),d(t,null),!0),subscribe:(e,s)=>a(e)&&"function"==typeof s?(t.has(e)||t.set(e,new Set),t.get(e).add(s),()=>t.get(e)?.delete(s)):()=>{},preload(t){if(t&&"object"==typeof t)for(const[s,i]of Object.entries(t)){if(!a(s))continue;const t=l(i),r=g.read(s);e.values.set(s,t),u(s,t),o(r,t)||d(s,t)}},useHost(t){if(!t||"function"!=typeof t.save)throw new TypeError("A preferences host saves: {save(key, value)}");return e.adapter=t,g},async load(t){const s=[].concat(t).filter(t=>a(t)&&!e.values.has(t));if(s.length&&"function"==typeof e.adapter?.load)try{g.preload(await e.adapter.load(s))}catch(e){console.warn("SF.Preferences: the host did not answer",s,e)}},get hosted(){return Boolean(e.adapter)},flush(){for(const e of[...s.keys()])p(e)}};return globalThis.addEventListener?.("storage",t=>{if(!t.key?.startsWith(i)||t.storageArea!==n())return;const s=t.key.slice(8);if(e.values.has(s))return;let r=null;try{r=null===t.newValue?null:JSON.parse(t.newValue)}catch{r=null}d(s,r)}),globalThis.addEventListener?.("pagehide",()=>g.flush()),c(),Object.freeze(g)}()));const c=globalThis.SF?.Preferences,d=c;s.d(t,["A",0,d])},"17828be41e75"(e,t,s){s.d(t,{C3:()=>n,l6:()=>a});const i=e=>String(e).replace(/-([a-z0-9])/gu,(e,t)=>t.toUpperCase());function r(e,t){if(null==e||!0===e||e===t)return{outcome:"applied"};if(!1===e)return{outcome:"refused",reason:"refused"};if("object"==typeof e&&"string"==typeof e.outcome)return e;if("object"==typeof e&&"string"==typeof e.answer){const{answer:t,reason:s,message:i}=e;return{...e,outcome:t,...s?{reason:s}:{},...i?{message:i}:{}}}return{outcome:"applied",value:e}}function n(e,t){const s=e.prototype;for(const[e,n]of Object.entries(t.actions||{})){const t=i(e),a=s[t];if("function"!=typeof a||a.sfAction)continue;const o=Object.keys(n?.with||{}),l=function(...e){if(1===e.length&&(null!==(t=e[0])&&"object"==typeof t&&!Array.isArray(t)&&Object.getPrototypeOf(t)===Object.prototype)){const t=Object.keys(e[0]);o.length||t.length?o.length&&t.length&&t.every(e=>o.includes(e)||o.map(i).includes(e))&&(e=o.map(t=>e[0][t]??e[0][i(t)])):e=[]}var t;const s=a.apply(this,e);return s&&"function"==typeof s.then?s.then(e=>r(e,this)):r(s,this)};l.sfAction=!0,Object.defineProperty(s,t,{configurable:!0,writable:!0,value:l})}return e}function a(e,t){const s=e.prototype;for(const[e,r]of Object.entries(t.settings||{})){if(["list","object","state"].includes(r?.type))continue;const t=i(e);let n=s,a=null;for(;n&&n!==globalThis.HTMLElement?.prototype&&n!==Object.prototype&&(a=Object.getOwnPropertyDescriptor(n,t),!a);)n=Object.getPrototypeOf(n);a&&a.get&&!a.set&&Object.defineProperty(n,t,{configurable:!0,get:a.get,set(t){"boolean"===r.type?!0===t||""===t||"true"===t?this.setAttribute(e,""):!1===t&&!0===r.default?this.setAttribute(e,"false"):this.removeAttribute(e):null==t?this.removeAttribute(e):this.setAttribute(e,String(t))}})}return e}},"36b027867bab"(e,t,s){s.a(e,async(e,t)=>{try{var i=s("43090d1c8307"),r=s("5b7d7695b41b"),n=s("deb1a4d61565"),a=s("892a0da25239"),o=s("17828be41e75"),l=s("7086146c00cc"),c=s("80ad38cb6908"),d=s("ce0305e57fa5"),h=s("3e9dffe84919"),u=s("51250bf01ab0"),p=s("29f88c884ba1"),f=e([i,r,n,a]);[i,r,n,a]=f.then?(await f)():f;const g=Object.freeze(["sf-view-table-search-change","sf-view-table-filter-change","sf-view-table-sort-change","sf-view-table-save","sf-view-table-apply","sf-view-table-refresh","sf-view-table-select","sf-view-table-column-settings-reset","sf-view-table-expand","sf-view-table-load-more","sf-view-table-reference-open","sf-view-table-cell-set","sf-view-table-move","sf-pagination-change","sf-pagination-size-change","sf-pagination-apply","sf-pagination-load-more","sf-pagination-selection-clear","sf-pagination-count","sf-pagination-action-change","sf-pagination-action-for-all-change","sf-view-saved-view-intent"]),b=Object.freeze({"sf-view-table-query":"query.change","sf-view-table-template-select":"view.open","sf-view-table-template-save":"view.save","sf-view-table-template-delete":"view.delete","sf-view-table-create":"view.create_record"});let y=0;const v={property_type:"propertyType",min_width:"minWidth"};function m(e){return"string"==typeof e?.message?e.message.trim():""}const w=new Set(["forbidden","access_denied","scope_denied"]);function _(e){if(null==e||""===e)return!0;const t=String(e).replace(/-/gu,"_");return w.has(t)||t.endsWith("_access_denied")||t.endsWith("_scope_denied")}function A(e){const t=F(e);for(const[e,s]of Object.entries(v))void 0!==t[e]&&void 0===t[s]&&(t[s]=t[e]);return t}const S=["1.0.0","1.1.0","1.2.0","1.3.0","1.4.0","1.5.0","1.6.0","1.7.0","1.8.0","1.9.0","1.10.0","1.11.0","1.12.0","1.13.0"],k=new Set(["create-record","personal-column-settings"]),x=(e,t)=>{const s=e=>String(e??"").split(".").map(e=>Number.parseInt(e,10)||0),[i,r]=[s(e),s(t)];for(let e=0;e<3;e+=1)if((i[e]??0)!==(r[e]??0))return(i[e]??0)>(r[e]??0);return!0},q=(e={})=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e.replace(/-([a-z0-9])/gu,(e,t)=>t.toUpperCase()),t])),T={en:q(d.runtime),ru:q(h.runtime)},P=["column-search-placeholder","column-search-empty-text","column-move-label","filter-apply-text"],E=["show-more-text","selected-label","total-label","pages-label","first-label","previous-label","page-label","next-label","last-label","page-field-label","action-choose-label","actions-label","actions-region-label","clear-selection-label","page-size-label"],R=[...P,...E,"pagination-aria-label"],j=["toolbar","pagination","select","settings"],N=new Set(["node.targets"]),C=new Set(["tree.expand","node.targets","node.move"]),O=new Set(["record.open","tree.expand","node.targets","settings.save_personal","settings.save_shared"]),F=e=>null==e?e:JSON.parse(JSON.stringify(e)),z=()=>globalThis.SF?.Preferences||u.A,B=e=>`sf-table/${String(e).replace(/[^\w.:-]+/gu,"-")}`;function M(e){return null!=e&&""!==e&&!1!==e&&(Array.isArray(e)?e.some(M):"object"!=typeof e||Object.values(e).some(M))}class L extends HTMLElement{connectedCallback(){}}const $=(0,r.elementFromManifest)(l,{base:L,lang:{en:d,ru:h},source:"ru",aliases:c}),I=10,D=3,K={loading:"loading",populated:"ready",empty:"empty",error:"error","no-access":"refused",unavailable:"unavailable"},V=e=>JSON.stringify(e,(e,t)=>t&&"object"==typeof t&&!Array.isArray(t)?Object.fromEntries(Object.keys(t).sort().map(e=>[e,t[e]])):t),J=e=>V([...e?.capabilities??[]].map(String).sort());function Q(e,t){if(void 0!==e.revision&&null!==e.revision&&void 0!==t.revision&&null!==t.revision)return String(e.revision)===String(t.revision);const s=e=>V({records:e.records??null,total:e.total??null,has_next:e.has_next??null,columns:e.columns??null,tree:e.tree??null});return s(e)===s(t)}class W extends ${constructor(){super(),this.instanceId="sf-view-"+ ++y,this.query={filters:{},search:"",sort:[],page:1,per_page:25},this.records=[],this.treeMode=null,this.tree=(0,p.bP)(),this._treeAppend=new Set,this.treeSequence=0,this.rowActionCatalog=[],this.continuing=!1,this.appended=null,this.columns=[],this.total=0,this.countKnown=!0,this.totalExact=!0,this.hasNext=!1,this.countedQuery=null,this.savedViews=[],this.columnSettings=null,this.sequence=0,this.epoch=0,this.pending=null,this.hostPort=null,this._answered=!1,this._bound=e=>this._onEvent(e),this._seenEvents=new WeakSet,this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML='\n <style>\n :host { display: block; }\n [part="layout"] { display: grid; gap: var(--sf-data-view-gap, var(--sf-space-3)); }\n [part="toolbar"] { display: flex; flex-wrap: wrap; gap: var(--sf-data-view-toolbar-gap, var(--sf-space-2)); }\n /* Hidden means hidden: the toolbar\'s own display beat the hidden\n attribute, and a related list in a record panel (chrome="")\n showed the bare fallback search above its rows (Larena,\n 2026-10-14). */\n [hidden] { display: none !important; }\n /* Files from the computer over a view that takes them (accept-files):\n a dashed zone over the list says where they go. */\n [part="drop"] {\n position: absolute; inset: 0; z-index: 20;\n display: grid; place-items: center;\n border: var(--sf-focus--width, 2px) dashed var(--sf-data-view-drop-border-color, var(--sf-primary));\n border-radius: var(--sf-radius--surface);\n background: var(--sf-data-view-drop-background-color, color-mix(in srgb, var(--sf-primary-container) 80%, transparent));\n color: var(--sf-data-view-drop-color, var(--sf-on-primary-container));\n font: var(--sf-font-weight-medium) var(--sf-text-size-1) / var(--sf-text-height-1) var(--sf-text--family);\n pointer-events: none;\n }\n /* What the view is doing is announced, not laid out. It used to be\n a line above the table, which said "Нет данных" over a table\n whose own body says the same, and pushed everything down by its\n height every time a search found nothing. */\n [part="status"] {\n position: absolute;\n inline-size: var(--sf-px);\n block-size: var(--sf-px);\n margin: calc(var(--sf-px) * -1);\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n }\n /* A notice is a message about an action. It used to float over the\n top of the card, which moved nothing but covered the search, the\n create button and the filters -- the consumer was right that this\n is worse than a shifted table. It stands in the corner of the\n window now, over the page and over none of the controls, and it\n goes away by itself. Slotted from the light DOM because the\n Framework\'s styles -- sf-toast\'s among them -- do not cross a\n shadow boundary. */\n slot[name="notice"]::slotted(*) {\n position: fixed;\n inset-block-end: var(--sf-space-3);\n inset-inline-end: var(--sf-space-3);\n max-inline-size: var(--sf-g0);\n /* One above the menus: they share the top step, and a refusal\n answering a menu choice opened under the menu that asked. */\n z-index: calc(var(--sf-z-index-9, 90) + 1);\n }\n /* The band of bulk controls is the last strip of the card and holds\n the bottom of the window while the card runs past it. It is\n slotted rather than built in here: the Framework\'s own styles do\n not cross a shadow boundary, so the band lives in the light DOM\n where they reach it, and this layout is what contains it. */\n slot[name="bulk"]::slotted(*) {\n position: sticky;\n inset-block-end: 0;\n z-index: var(--sf-z-index-3, 30);\n }\n /* The first paint (standard 1.3.8 §5.4): until the host\'s first\n answer the view is its skeleton, slotted from the light DOM\n where a server printed it (static/<template>/<example>.html)\n or where the view drew it, and the layout stands back. */\n :host([data-sf-awaiting]) [part="layout"] { display: none; }\n :host(:not([data-sf-awaiting])) slot[name="first-paint"] { display: none; }\n </style>\n <slot name="first-paint"></slot>\n <section part="layout" style="position: relative">\n <div part="toolbar"><slot name="toolbar">\n <label>Поиск <input type="search" data-search></label>\n \x3c!-- Saved views are offered only when the host says it keeps them.\n They were offered always, and a host that claims neither\n saved-views nor shared-saved-views answers every one of these\n with capability-not-provided -- so «Сохранить вид» could do\n nothing but refuse, which is not a control, it is a trap. The\n owner met them on a page whose host claims only row-actions\n (owner, 2026-10-09). --\x3e\n <span data-saved-views hidden>\n <label>Вид <select data-view><option value="">Текущий</option></select></label>\n <label>Название вида <input type="text" data-view-name></label>\n <button type="button" data-save>Сохранить вид</button>\n <button type="button" data-delete>Удалить вид</button>\n </span>\n </slot></div>\n <div part="status" role="status" aria-live="polite" hidden></div>\n <div part="drop" hidden></div>\n <slot name="content"><sf-view-table toolbar="false"></sf-view-table></slot>\n <slot name="show-all"></slot>\n <slot name="pagination"><sf-pagination top="false" bottom="false"></sf-pagination></slot>\n <slot name="bulk"></slot>\n <slot name="notice"></slot>\n <slot name="dialog"></slot>\n </section>'}get total(){return this._total??0}set total(e){this._total=e}get state(){return this._queryRefused?"refused":K[this._dataState]??"idle"}get current(){return this._current??""}set current(e){this._current=null==e?"":String(e),this.table&&(this.table.current=this._current)}get selected(){return this._current||void 0}get bulkActions(){return this._bulkActions??[]}set bulkActions(e){this._bulkActions=Array.isArray(e)?e.filter(e=>e&&(e.id??e.value)):[],this._applyBulkActions()}_applyBulkActions(){const e=this.pagination;if(!e||!this._bulkActions?.length)return;const t=e=>String(e??"").replace(/[|:]/gu," ").trim(),s=this._bulkActions.map(e=>`${t(e.id??e.value)}:${t(e.label??e.text??e.id??e.value)}`).join("|");e.getAttribute("actions")!==s&&e.setAttribute("actions",s)}get selection(){return this.table?.selection??[]}get table(){const e=this.shadowRoot.querySelector('slot[name="content"]');return e.assignedElements().find(e=>(0,n.isTag)(e,"sf-view-table"))??e.querySelector((0,n.tagSelector)("sf-view-table"))}get bulkBand(){if(this._bulkBand?.isConnected)return this._bulkBand;const e=this.querySelector(':scope > [slot="bulk"]');return this._bulkBand=e??document.createElement("div"),this._bulkBand.setAttribute("slot","bulk"),this._bulkBand.classList.add("sf-pagination-actions","flex","items-cross-center"),this._bulkBand.setAttribute("role","region"),this._bulkBand.isConnected||this.append(this._bulkBand),this._bulkBand}get showAllBand(){if(this._showAll?.isConnected)return this._showAll;const e=this.querySelector(':scope > [slot="show-all"]');return this._showAll=e??document.createElement("div"),this._showAll.setAttribute("slot","show-all"),this._showAll.classList.add("flex","items-cross-center","gap-1/3"),"1"!==this._showAll.getAttribute("data-sf-bound")&&(this._showAll.setAttribute("data-sf-bound","1"),this._showAll.addEventListener("click",this._bound)),this._showAll.isConnected||this.append(this._showAll),this._showAll}get noticeBand(){if(this._notice?.isConnected)return this._notice;const e=this.querySelector(':scope > [slot="notice"]');return this._notice=e??document.createElement("div"),this._notice.setAttribute("slot","notice"),this._notice.isConnected||this.append(this._notice),this._notice}_noticeText(e={}){const t=m(e);if(t)return t;const s={"action-not-allowed":"noticeActionNotAllowed","capability-not-provided":"noticeCapabilityNotProvided","port-not-connected":"noticePortNotConnected","saved-view-levels-require-port-1.1.0":"noticeSavedViewLevels",confirm_required:"noticeConfirmRequired","not-confirmed":"noticeNotConfirmed","no-base-revision":"noticeNoBaseRevision",record_invalid:"noticeRecordInvalid",forbidden:"noticeForbidden","stale-revision":"noticeStaleRevision"};if(s[e.reason])return(0,i.pageText)(T,s[e.reason],this);const r={conflict:"noticeConflict",refused:"noticeRefused",unavailable:"noticeUnavailable"}[e.answer];return(0,i.pageText)(T,r??"noticeFailed",this)}notify(e,{kind:t="error",code:s=""}={}){if("function"==typeof globalThis.SF?.notify)return e?(this._notifyHandle=globalThis.SF.notify({status:"error"===t?"error":"warning",title:e,duration:7e3,source:s?`sf-view:${s}`:"sf-view",key:s?`sf-view:${s}`:void 0}),this):(this._notifyHandle?.close?.(),this._notifyHandle=null,this);const r=this.noticeBand;if(r.replaceChildren(),!e)return r.remove(),this._notice=null,this;this._askForParts(["sf-toast"]);const n=document.createElement("sf-toast");return n.setAttribute("status","error"===t?"error":"warning"),n.setAttribute("closable","true"),n.setAttribute("close-label",(0,i.pageText)(T,"closeNoticeLabel",this)),n.setAttribute("role","error"===t?"alert":"status"),n.setAttribute("heading",e),n.setAttribute("duration","7000"),s&&n.setAttribute("data-sf-code",s),n.addEventListener("sf-toast-closed",()=>this.notify("")),r.append(n),this}get pagination(){const e=this.shadowRoot.querySelector('slot[name="pagination"]');return e.assignedElements().find(e=>e.matches("sf-pagination"))??e.querySelector("sf-pagination")}_bindFileDrop(){if(this._fileDropBound)return;this._fileDropBound=!0;const e=()=>this.shadowRoot.querySelector('[part="drop"]'),t=e=>this.hasAttribute("accept-files")&&[...e.dataTransfer?.types??[]].includes("Files"),s=t=>{const s=e();s&&(s.textContent=(0,i.pageText)(T,"dropFiles",this),s.hidden=!t)};this.addEventListener("dragover",e=>{t(e)&&(e.preventDefault(),e.dataTransfer.dropEffect="copy",s(!0))}),this.addEventListener("dragleave",e=>{this.contains(e.relatedTarget)||this.shadowRoot.contains(e.relatedTarget)||s(!1)}),this.addEventListener("drop",e=>{if(!t(e))return;e.preventDefault(),s(!1);const i=[...e.dataTransfer.files];i.length&&this.dispatchEvent(new CustomEvent("sf-view-files-drop",{bubbles:!0,composed:!0,detail:{files:i}}))})}_ownParts(){if(!this.querySelector(`:scope > ${(0,n.tagSelector)("sf-view-table")}[slot="content"], :scope > [slot="content"]`)){const e=document.createElement("sf-view-table");e.slot="content",e.setAttribute("aria-label",(0,i.pageText)(T,"recordsLabel",this)),e.toggleAttribute("data-sf-view-made",!0),this.append(e)}if(!this.querySelector(':scope > [slot="pagination"]')){const e=document.createElement("sf-pagination");e.slot="pagination",e.setAttribute("top","false"),e.setAttribute("bottom","false"),e.toggleAttribute("data-sf-view-made",!0),this.append(e)}this._applyBulkActions(),this._applyForAll()}connectedCallback(){this._readPrintedPageSize(),super.connectedCallback(),this.getAttribute("data-sf-instance")&&this._ownParts(),this._askForParts(["sf-view-table","sf-pagination"]),this.__sfAliases||(this.__sfAliases=(0,a.installAliases)(this,c,{tag:this.localName,adapters:{}})),this._bindFileDrop(),this.epoch+=1,this._applyPreferences(),this._controller=new AbortController;const e=[...Object.keys(b),...g];for(const t of e)this.shadowRoot.addEventListener(t,this._bound);for(const t of e)this.addEventListener(t,this._bound);this.shadowRoot.querySelector("[data-search]").addEventListener("change",this._bound),this.shadowRoot.querySelector("[data-view]").addEventListener("change",this._bound),this.shadowRoot.querySelector("[data-save]").addEventListener("click",this._bound),this.shadowRoot.querySelector("[data-delete]").addEventListener("click",this._bound),this._readDeclaredPort(),this._seedPageSize(),this._seedPrintedQuery(),this._renderProjection(),this._firstPaintReady=!0,this._drawFirstAnswer(),this._startFirstPaint(),this.hostPort?this.refresh("connected"):this._requestHostPort()}get firstPaintRows(){const e=this._declaredPageSize(),t=this.rowCap;return e&&t?Math.min(e,t):e||t||I}_declaredPageSize(){return this._pageSizeDeclared?Number(this.query.per_page)||0:this._printedPageSize||0}_readPrintedPageSize(){if(void 0!==this._printedPageSize)return;const e=this.querySelector?.(':scope > sf-pagination[slot="pagination"]');if(!e)return;const t=Number.parseInt(e.getAttribute("page-size")??"",10);this._printedPageSize=Number.isInteger(t)&&t>0?t:0}_seedPageSize(){if(this._pageSizeDeclared||this._answered)return;const e=this._declaredPageSize();e&&(this.query.per_page=e,this._pageSizeDeclared=!0)}get firstAnswer(){return this._firstAnswer??null}set firstAnswer(e){this._firstAnswer=e&&"object"==typeof e&&!Array.isArray(e)&&Array.isArray(e.records)?F(e):null,this._firstPaintReady&&this.isConnected&&this._firstAnswer&&!this._answered&&(this._drawFirstAnswer(),this.hostPort&&this.refresh("connected"))}_drawFirstAnswer(){const e=this._firstAnswer;if(!e||this._answered)return!1;if(this._firstAnswer=null,!this._printedAnswerFits(e))return!1;e.echo&&Number.isInteger(e.echo.per_page)&&e.echo.per_page>0&&(this._pageSizeDeclared=!0),this._revalidate=!0,this._printedAnswer=F(e),!this._declaredPort&&Array.isArray(e.capabilities)&&(this._declaredPort={version:e.version??null,capabilities:e.capabilities.map(String)});const t=F(this.query);this.applyProjection(e),this._seedPrintedQuery({answer:e})||(this.query=t),this.removeAttribute("data-sf-awaiting");for(const e of this._firstPaintNodes())e.remove?.();return!0}_readDeclaredPort(){if(void 0!==this._declaredPort)return;const e=Array.from(this.children??[]).find(e=>"script"===e.localName&&e.hasAttribute?.("data-sf-port")&&/^application\/json$/iu.test(e.type));if(this._declaredPort=null,e)try{const t=JSON.parse(e.textContent||"{}");if(!t||"object"!=typeof t)return;this._declaredPort={version:t.version??null,capabilities:Array.isArray(t.capabilities)?t.capabilities.map(String):[],first:t.first&&"object"==typeof t.first?F(t.first):null}}catch(e){console.warn("[sf-view] the data-sf-port island is not JSON",e)}}get knownPort(){return this.hostPort??this._declaredPort??null}knownCapability(e){return Boolean(this.knownPort?.capabilities?.includes?.(e))}_seedPrintedQuery({answer:e=null}={}){const t=this._declaredPort?.first,s=e?.query&&"object"==typeof e.query?e.query:"query.change"===t?.intent&&t.payload?.query&&"object"==typeof t.payload.query?t.payload.query:null;return!!s&&(this.query={...this.query,...F(s),...F(this._keptState??{})},Number.isInteger(this.query.per_page)&&this.query.per_page>0&&(this._pageSizeDeclared=!0),!0)}_printedAnswerFits(e){const t=this._keptState??{};if(!Object.keys(t).length)return!0;const s=e?.query&&"object"==typeof e.query?e.query:e?.echo??{};return(void 0===t.per_page||Number(s.per_page)===t.per_page)&&(void 0===t.sort||V(s.sort??[])===V(t.sort))}get expectedColumns(){const e=Number.parseInt(this.getAttribute("expected-columns")??"",10);return Number.isFinite(e)&&e>0?e:4}_startFirstPaint(){if(this._answered)return;this.setAttribute("data-sf-awaiting",""),null===this.getAttribute("aria-busy")&&this.setAttribute("aria-busy","true");const e=this._firstPaintNodes();if(e.length){for(const t of e)t.removeAttribute?.("data-sf-static");return}if("undefined"==typeof document)return;const t=document.createElement("div");t.setAttribute("slot","first-paint"),t.setAttribute("aria-hidden","true"),t.className="sf-data-view-skeleton sf-skeleton sf-skeleton--animation-pulse",t.setAttribute("data-size",this.size),t.innerHTML=this._firstPaintMarkup(t),this.append(t)}_firstPaintMarkup(e){const t=this.querySelector(`:scope > ${(0,n.tagSelector)("sf-view-table")}[slot="content"]`),s='<i class="sf-skeleton-text"></i>',i=(e="")=>`<i class="sf-skeleton-text" data-control${e?`="${e}"`:""}></i>`,r=t?"false"!==t.getAttribute("toolbar"):this.renders("toolbar"),a=Boolean(t)&&this.renders("toolbar")&&Boolean(this.querySelector(':scope > [slot="toolbar"]')),o=this.renders("select"),l=this.renders("settings"),c=t?.getAttribute("layout")||(this.renders("toolbar")?"auto":"table");e.setAttribute("data-layout",["auto","table","list"].includes(c)?c:"table");const d=this.expectedColumns,h=this.firstPaintRows,u=Number.parseInt(t?.getAttribute("list-fields")??"",10),p=Math.min(d-1,Number.isFinite(u)&&u>=0?u:D),f=e=>`<div>${o?`<span data-chrome>${s}</span>`:""}${l?`<span data-chrome>${e?s:i()}</span>`:""}${`<span>${s}</span>`.repeat(d)}</div>`,g=`<div>${o?s:"<span></span>"}<div>${s.repeat(p+1)}</div>${l?i():"<span></span>"}</div>`,b=`<nav class="sf-pagination sf-pagination--size-${this.size} flex flex-col"><div class="sf-pagination-main flex items-cross-center content-main-between"><div class="sf-pagination-left flex items-cross-center">${s}</div><div class="sf-pagination-container flex items-cross-center"><span class="sf-pagination-pages-label">${s}</span>${i()}</div><div class="sf-pagination-count flex items-cross-center">${s}${i("field")}</div></div></nav>`;return[a?'<div class="sf-data-view-skeleton-own-toolbar"></div>':"",'<div class="sf-data-view-skeleton-records">',r?`<div class="sf-data-view-skeleton-toolbar">${i("button")}${i("field")}</div>`:"",`<div class="sf-data-view-skeleton-table">${f(!0)}${Array.from({length:h},()=>f(!1)).join("")}</div>`,`<div class="sf-data-view-skeleton-list">${g.repeat(h)}</div>`,"</div>",this.renders("pagination")?b:""].join("")}_endFirstPaint(){if(null!==this.getAttribute("data-sf-awaiting")){this.removeAttribute?.("data-sf-awaiting");for(const e of this._firstPaintNodes())e.remove?.()}}_firstPaintNodes(){return Array.from(this.children??[]).filter(e=>"first-paint"===e.getAttribute?.("slot"))}_requestHostPort(){return!this.hostPort&&!this._portRequested&&(this._portRequested=!0,this.dispatchEvent(new CustomEvent("sf-host-port-request",{bubbles:!0,composed:!0,detail:{component:this,context:{owner:this.portOwner,record:this.portRecord,group:this.portGroup}}})),!0)}get portOwner(){return this.getAttribute("port-owner")||null}get portRecord(){return this.getAttribute("port-record")||null}get portGroup(){return this.getAttribute("port-group")||null}disconnectedCallback(){this.epoch+=1,this._portRequested=!1,this._controller?.abort(),this._controller=null;const e=[...Object.keys(b),...g];for(const t of e)this.shadowRoot.removeEventListener(t,this._bound);for(const t of e)this.removeEventListener(t,this._bound);this.shadowRoot.querySelector("[data-search]").removeEventListener("change",this._bound),this.shadowRoot.querySelector("[data-view]").removeEventListener("change",this._bound),this.shadowRoot.querySelector("[data-save]").removeEventListener("click",this._bound),this.shadowRoot.querySelector("[data-delete]").removeEventListener("click",this._bound),this.pending=null}get chrome(){const e=this.getAttribute("chrome");return null===e?[...j]:e.split(/\s+/u).filter(e=>j.includes(e))}renders(e){return this.chrome.includes(e)}get rowCap(){const e=Number.parseInt(this.getAttribute("row-cap")??"",10);return Number.isFinite(e)&&e>0?e:0}get cappedRecords(){if("tree"===this.treeMode)return(0,p.WY)(this.tree);const e=this.rowCap;return e?this.records.slice(0,e):this.records}get capHidesRows(){const e=this.rowCap;return Boolean(e)&&(this.records.length>e||!0===this.hasNext)}openList(e="row-cap"){return this.hostPort?this._raise("list.open",{reason:e,query:{search:this.query.search??"",filters:{...this.query.filters??{}}}}):Promise.resolve({answer:"unavailable",reason:"port-not-connected"})}get size(){return"1/2"===this.getAttribute("size")?"1/2":"1"}static get observedAttributes(){return["chrome","row-cap","aria-label","size","preferences-key",...R]}_forwardLabels(){this._forwarded??=new Set;const e=(e,t,s=t)=>{if(!e?.setAttribute)return;const i=this.getAttribute(t),r=`${e.localName}:${s}`;null!==i?(e.setAttribute(s,i),this._forwarded.add(r)):this._forwarded.delete(r)&&e.removeAttribute(s)};for(const t of P)e(this.table,t);for(const t of E)e(this.pagination,t);e(this.pagination,"pagination-aria-label","aria-label")}attributeChangedCallback(e,t,s){t!==s&&this.isConnected&&("preferences-key"===e&&this._applyPreferences(),this._renderProjection())}setHostPort(e){if(!e||"function"!=typeof e.raise||!S.includes(e.version))throw new TypeError(`sf-view requires a declared dataview host port: ${S.join(", ")}`);return this.hostPort=e,this._applyForAll(),this.isConnected&&this.refresh("host-connected"),this}_applyForAll(){const e=this.pagination;if(!e?.setAttribute)return;const t=null!==e.getAttribute("data-sf-view-for-all");(t||null===e.getAttribute("show-action-for-all"))&&(this.hostOffers("bulk-under-filter")?t||(e.setAttribute("show-action-for-all","true"),e.setAttribute("data-sf-view-for-all","")):t&&(e.removeAttribute?.("show-action-for-all"),e.removeAttribute?.("data-sf-view-for-all")))}_setState(e,t=""){this._dataState=e,"loading"!==e&&this._endFirstPaint(),this.setAttribute("data-state",e),this.setAttribute("aria-busy","loading"===e?"true":"false"),this.table&&"empty"===e&&(this.table.emptyContext=this._emptyContext()),this.table&&"error"===e&&(this.table.emptyContext={caused:["search","filter"].includes(this._queryReason),...this._queryMessage?{message:this._queryMessage}:{}}),this.table?.setDataState?.(e);const s=this.shadowRoot.querySelector('slot[name="pagination"]');s&&["error","no-access"].includes(e)&&(s.hidden=!0);const i=this.shadowRoot.querySelector('[part="status"]');i.hidden=!t,i.textContent=t,this.dispatchEvent(new CustomEvent("sf-view-state",{bubbles:!0,composed:!0,detail:{state:e,message:t,instance_id:this.instanceId}}))}_emptyContext(){if(this._queryRefused)return this._queryMessage?{kind:"no-access",message:this._queryMessage}:{kind:"no-access"};const e=""!==String(this.query.search??"").trim(),t=M(this.query.filters);return e||t?{kind:"nothing-found",reset:e&&t?"both":e?"search":"filters"}:{kind:"no-data"}}hostOffers(e){const t=this.hostPort??this._declaredPort??null;return!!t&&(!!t.capabilities?.includes?.(e)||k.has(e)&&!x(t.version,"1.10.0"))}async _raise(e,t,{query:s=!1}={}){if(!this.hostPort)return s&&(this._queryMessage=""),this._setState("error",(0,i.pageText)(T,"statePortNotConnected",this)),this.notify((0,i.pageText)(T,"noticePortNotConnected",this)),{answer:"unavailable",reason:"port-not-connected"};const r={"view.open":"saved-views","view.save":"saved-views","view.delete":"saved-views","view.save_shared":"shared-saved-views","settings.save_shared":"shared-column-settings","bulk.apply_under_filter":"bulk-under-filter","record.open":"row-actions","record.mutate":"row-actions","tree.expand":"tree","node.targets":"tree-move","node.move":"tree-move","view.create_record":"create-record","settings.save_personal":"personal-column-settings","record.reorder":"row-reorder","record.set":"inline-edit"}[e];if(r&&!this.hostOffers(r)){const t={answer:"unavailable",reason:"capability-not-provided"};return this._showAnswer(e,t),t}C.has(e)&&this.sfEmit("tree",{intent:e,payload:F(t)});const n=this.epoch,a=s?t.sequence:null;try{const r=await this.hostPort.raise(e,F(t),{signal:this._controller?.signal});if(!this.isConnected||n!==this.epoch||s&&a!==this.sequence)return null;if(!r||!["applied","conflict","refused","unavailable"].includes(r.answer))throw new TypeError("Host answer is not a declared port answer");if(s&&null!=r.sequence&&r.sequence!==a)return null;if(s&&(this.pending=null),s&&(this._queryRefused="refused"===r.answer&&_(r.reason)),s&&(this._queryMessage=["refused","unavailable"].includes(r.answer)?m(r):""),!s&&"refused"===r.answer&&"confirm_required"===r.reason&&r.data?.confirm?.digest&&!t?.confirm){await this._ensureElements(["sf-button"]);return await this._dialog({title:(0,i.pageText)(T,"confirmTitle",this),text:String(r.data.confirm.summary??""),apply:(0,i.pageText)(T,"confirmApply",this)})?this._raise(e,{...t,confirm:String(r.data.confirm.digest)}):{answer:"refused",reason:"not-confirmed"}}if("applied"===r.answer){if(N.has(e)||(!s&&this._isRecordPatch(r.data)?this._applyRecordPatch(r.data.records):r.data&&this.applyProjection(r.data)),s&&!r.data)throw new TypeError("Applied query has no data");"view.open"===e&&this.refresh("view-switch"),s||r.data||O.has(e)||this.refresh("after-write"),Array.isArray(r.effects)&&r.effects.length&&globalThis.SF?.Composition?.publishEffects?.(r.effects,{origin:this})}else{if(s&&"refused"===r.answer&&!this._queryRefused)return this.records=[],this.appended=null,this.total=0,this.countKnown=!1,this._renderProjection(),this._queryMessage||(this._queryMessage=(0,i.pageText)(T,"stateQueryFailed",this)),this._setState("error",this._queryMessage),this._showAnswer(e,r,{stated:!0}),r;s&&"refused"===r.answer?(this.records=[],this.appended=null,this.total=0,this.countKnown=!1,this._renderProjection()):s&&"unavailable"===r.answer&&(this._setState("error",this._queryMessage||(0,i.pageText)(T,"stateUnavailable",this)),this._queryMessage||this.notify((0,i.pageText)(T,"noticeFetchFailed",this),{code:r.reason||""}))}return this._showAnswer(e,r),r}catch(t){if(!this.isConnected||n!==this.epoch)return null;const r={answer:"unavailable",reason:t?.message||"port-error"};return s&&(this._queryMessage="",this._setState("error",(0,i.pageText)(T,"stateLoadFailed",this)),this.notify((0,i.pageText)(T,"noticeLoadFailed",this),{code:r.reason||""})),this._showAnswer(e,r),r}}_showAnswer(e,t,{stated:s=!1}={}){if(!s&&["conflict","refused"].includes(t.answer)||"unavailable"===t.answer&&"query.change"!==e){const e=this._noticeText(t);this._setState(this.records.length?"populated":"empty",e),this.notify(e,{kind:"conflict"===t.answer?"warning":"error",code:t.reason||""})}this.dispatchEvent(new CustomEvent("sf-view-answer",{bubbles:!0,composed:!0,detail:{intent:e,...F(t),instance_id:this.instanceId}}))}get preferencesKey(){const e=this.getAttribute("preferences-key")||"";return e?B(e):""}_tableScrollMode(e){"function"==typeof e?.hasAttribute&&"function"==typeof e.setAttribute&&(e.hasAttribute("data-sf-host-vertical-scroll")||e.setAttribute("data-sf-host-vertical-scroll",e.getAttribute("vertical-scroll")??""),e.getAttribute("data-sf-host-vertical-scroll")||e.setAttribute("vertical-scroll","page"))}_applyPreferences(){this._tableScrollMode(this.table);const e=this.preferencesKey;if(e===this._preferencesApplied)return;this._preferencesApplied=e;const t=this.table;t&&e&&!t.getAttribute("preferences-key")&&t.setAttribute("preferences-key",this.getAttribute("preferences-key"));const s=e?z()?.read(e):null;this._keptState={...Array.isArray(s?.sort)&&s.sort.length?{sort:F(s.sort)}:{},...Number.isInteger(s?.pageSize)&&s.pageSize>0?{per_page:s.pageSize}:{}},s&&(Array.isArray(s.sort)&&!this.query.sort?.length&&(this.query.sort=F(s.sort)),Number.isInteger(s.pageSize)&&s.pageSize>0&&(this.query.per_page=s.pageSize,this._pageSizeDeclared=!0))}_keepPreference(e){const t=this.preferencesKey;t&&z()?.write(t,{...z()?.read(t)??{},v:1,...e})}refresh(e="refresh"){if(!this.isConnected)return Promise.resolve(null);this._applyPreferences();const t=++this.sequence;this.pending=t,this._queryReason=e,this.continuing="show-more"===e;const s=!0===this._revalidate&&["connected","host-connected"].includes(e);return this._revalidate=!1,this._revalidating=s,this.continuing?this.pagination?.setState?.({showMoreBusy:!0}):s||this._setState("loading",(0,i.pageText)(T,"stateLoading",this)),this._raise("query.change",{sequence:t,query:F(this.query),reason:e},{query:!0})}_syncSearchBoxes(e){const t=String(e??""),s=this.shadowRoot?.querySelector("input[data-search]");s&&s.value!==t&&this.shadowRoot.activeElement!==s&&(s.value=t);const i=this.table;i?.updateSearchState&&(i.state?.search?.value??"")!==t&&!i.contains(document.activeElement)&&i.updateSearchState({value:t},!1)}changeQuery(e,t="query-change"){if(!e||"object"!=typeof e||Array.isArray(e))throw new TypeError("Query patch must be an object");return this.query={...this.query,...F(e)},["page-change","page-size-change","show-more"].includes(t)||(this.query.page=1),this.refresh(t)}applyProjection(e){if(!e||"object"!=typeof e)throw new TypeError("Port data must be an object");let t=!1;if(this._revalidating){this._revalidating=!1;const s=this._printedAnswer;if(this._printedAnswer=null,s&&Q(s,e))return void(this._capabilitiesKey!==J(this.knownPort)&&this._renderProjection());t=Boolean(s)}Array.isArray(e.row_actions)&&(this.rowActionCatalog=F(e.row_actions));const s=e.tree&&"object"==typeof e.tree?e.tree:null;if("tree"===s?.mode&&null!==s.parent&&void 0!==s.parent&&Array.isArray(e.records)){const t=String(s.parent);return(0,p.tO)(this.tree,{parent:t,records:F(e.records),hasNext:!0===s.has_next,cursor:s.cursor??null,append:this._treeAppend.delete(t)}),this.records=(0,p.Wp)(this.tree),void this._renderProjection()}if(s?this.treeMode=s.mode??null:Array.isArray(e.records)&&(this.treeMode=null),"tree"===this.treeMode&&Array.isArray(e.records)){const t=[...this.tree.expanded];(0,p.tO)(this.tree,{records:F(e.records),hasNext:!0===s.has_next,cursor:s.cursor??null,append:this.continuing&&this.records.length>0}),this.records=(0,p.Wp)(this.tree),this.appended=null;for(const e of t)!0!==this.tree.nodes.get(e)?.has_children||(0,p.BT)(this.tree,e)||this.expandNode(e)}else if(Array.isArray(e.records)){const s=F(e.records);if(this.continuing&&this.records.length){const e=new Set(this.records.map(e=>e.id));this.appended=s.filter(t=>!e.has(t.id)),this.records=[...this.records,...this.appended]}else this.appended=null,this.records=s,this._newResult=!t}if(!Array.isArray(e.columns)||t&&V(e.columns)===this._columnsKey||(this.columns=e.columns.map(A),this._columnsKey=V(e.columns)),Number.isSafeInteger(e.total)&&e.total>=0?(this.total=e.total,this.countKnown=!0):"boolean"==typeof e.has_next&&(this.hasNext=e.has_next,this.countKnown=null!==this.countedQuery&&this.countedQuery===this._countKey()),Number.isSafeInteger(e.total)&&(this.totalExact=!1!==e.total_exact),this._answered=!0,Array.isArray(e.saved_views)&&(this.savedViews=F(e.saved_views)),e.column_settings&&(this.columnSettings=F(e.column_settings)),e.echo){const t=e.echo;this.query={...this.query,filters:F(t.filters_chosen??t.filters??{}),search:t.search??"",sort:F(t.sort??[]),page:t.page??1,per_page:t.per_page??25}}this._syncSearchBoxes(this.query.search??""),this._renderProjection(),this._restoreOpenedView(),this._setState(this.records.length?"populated":"empty",this.records.length?"":(0,i.pageText)(T,"emptyText",this)),this.notify("")}_countKey(){return JSON.stringify([this.query.search??"",this.query.filters??{},this.query.per_page??25])}_renderBulkBand(){const e=this.pagination,t=this.table,s=t?.getSelectedRecordIds?.()??[],i=e?.actions??[];if(!e||!s.length||!i.length)return this._bulkBand?.isConnected&&this._bulkBand.remove(),this._bulkBand=null,this;const r=this.bulkBand;r.setAttribute("aria-label",e.actionsRegionLabel??"");const n=e.action??"",a=!1===e.countKnown?null:e.total,o=null==a?e.actionForAllLabel:`${e.actionForAllLabel} (${this._shownTotal(a)})`,l=(e,t,s)=>{null==s||!1===s?e.removeAttribute(t):e.setAttribute(t,!0===s?"":String(s))},c={};r.childElementCount||(r.innerHTML='\n <span class="sf-pagination-actions-count" data-sf-bulk="count"></span>\n <span class="sf-pagination-actions-separator" aria-hidden="true"></span>\n <sf-dropdown data-sf-bulk="actions" size="1" appearance="outlined" search="false" mode="select"></sf-dropdown>\n <sf-button data-sf-bulk="apply" size="1" appearance="default" scheme="primary"></sf-button>\n <span class="sf-pagination-actions-separator" aria-hidden="true" data-sf-bulk="for-all-separator"></span>\n <sf-checkbox data-sf-bulk="for-all"></sf-checkbox>\n <sf-button-icon data-sf-bulk="clear" class="sf-pagination-actions-clear" size="1" appearance="link" scheme="on-surface" icon="close"></sf-button-icon>',r.querySelector('[data-sf-bulk="apply"]').addEventListener("click",()=>this.applyBulkAction()),r.querySelector('[data-sf-bulk="actions"]').addEventListener("change",t=>e.setAction?.(t.detail?.value??"")),r.querySelector('[data-sf-bulk="for-all"]').addEventListener("change",t=>e.setActionForAll?.(Boolean(t.target?.checked))),r.querySelector('[data-sf-bulk="clear"]').addEventListener("click",()=>this.clearSelection()));for(const e of r.querySelectorAll("[data-sf-bulk]"))c[e.dataset.sfBulk]=e,e.localName.startsWith("sf-")&&l(e,"size",this.size);return c.count.textContent=`${e.selectedLabel} ${s.length}`,l(c.actions,"value",n),l(c.actions,"placeholder",e.actionChooseLabel),l(c.actions,"aria-label",e.actionsLabel),c.actions.options=[{type:"text",size:this.size,text:e.actionChooseLabel,value:"",selected:!n},...i.map(e=>({type:"text",size:this.size,text:e.text,value:e.value,selected:e.value===n,disabled:Boolean(e.disabled)}))],l(c.apply,"text",e.actionApplyText),l(c.apply,"disabled",!n),l(c["for-all"],"label",o),l(c["for-all"],"checked",Boolean(e.actionForAll)),c["for-all"].hidden=!e.showActionForAll,c["for-all-separator"].hidden=!e.showActionForAll,l(c.clear,"title",e.clearSelectionLabel),l(c.clear,"aria-label",e.clearSelectionLabel),this}applyBulkAction(){const e=this.pagination,t=e?.action;if(t)return e.actionForAll?this.applyUnderFilter(t,this.total):this._action({action_id:t,record_ids:this.table?.getSelectedRecordIds?.()??[]},{selectedBulk:!0})}clearSelection(){return this.table?.clearSelection?.(),this.pagination?.setState?.({selectedCount:0}),this._renderBulkBand()}updateRecord(e,t={}){const s=String(e);if("tree"===this.treeMode){const e=this.tree.nodes.get(s);return!(!e||!t||"object"!=typeof t)&&(this.tree.nodes.set(s,{...e,...F(t),id:e.id}),this.records=(0,p.Wp)(this.tree),this.table?.setRows?.((0,p.WY)(this.tree)),this._renderBulkBand(),!0)}const i=this.records.findIndex(e=>String(e?.id)===s);if(i<0||!t||"object"!=typeof t)return!1;const r={...this.records[i],...F(t),id:this.records[i].id};return this.records=[...this.records.slice(0,i),r,...this.records.slice(i+1)],this.table?.updateRowByKey?.("id",this.records[i].id,{...r},"record-update"),this._renderBulkBand(),!0}expandNode(e){const t=String(e),s=this.tree.nodes.get(t);return s&&!0===s.has_children?(0,p.BT)(this.tree,t)?((0,p.O8)(this.tree,t),this._renderTreeRows(),null):((0,p.yY)(this.tree,t),this._renderTreeRows(),this._raise("tree.expand",{id:s.id,cursor:null,sequence:++this.treeSequence})):null}collapseNode(e){(0,p.ap)(this.tree,e),this._renderTreeRows()}loadMoreNodes(e,t){if(null==e||""===e)return this.changeQuery({page:this.query.page+1},"show-more");const s=String(e);this._treeAppend.add(s);const i=this.tree.nodes.get(s);return this._raise("tree.expand",{id:i?.id??e,cursor:t??null,sequence:++this.treeSequence})}async openMoveDialog(e){const t=await this._raise("node.targets",{id:e.id});if("applied"!==t?.answer)return t;const s=t.data?.move_targets??{},r=Array.isArray(s.parents)?s.parents:[],n=[...s.root?[{id:null,label:(0,i.pageText)(T,"moveRoot",this),path:[]}]:[],...r.filter(t=>String(t.id)!==String(e.id))];if(!n.length)return this.notify((0,i.pageText)(T,"moveNoTargets",this),{kind:"warning"}),{answer:"refused",reason:"no-targets"};const a=String(e.title??e.label??e.name??e.id),o=await this._dialog({title:(0,i.pageText)(T,"moveTitle",this).replace("{label}",a),apply:(0,i.pageText)(T,"moveApply",this),options:n,reorder:!0===s.reorder});return o?this._raise("node.move",{id:e.id,parent:o.parent,index:o.index,...void 0!==e.revision?{revision:e.revision}:{}}):null}_askForParts(e){const t=globalThis.customElements;if("function"!=typeof t?.get||"function"!=typeof t.whenDefined)return;const s=e.filter(e=>!t.get(e));if(!s.length)return;const i=s.join(",");this._partsAsked??=new Set,this._partsAsked.has(i)||(this._partsAsked.add(i),globalThis.SF?.Loader?.ensure?.(s,{timeout:1/0}).then(()=>{this._partsAsked.delete(i),this.isConnected&&s.some(e=>"sf-toast"!==e)&&this._renderProjection()}))}async _ensureElements(e){return globalThis.SF?.Loader?.ensure?.(e)}async _dialog({title:e,text:t="",apply:s,options:r=null,reorder:n=!1}){if(await this._ensureElements(["sf-modal","sf-button",...r?["sf-radio"]:[]]),!globalThis.customElements?.get("sf-modal"))return this.notify((0,i.pageText)(T,"noticeUnavailable",this)),null;const a=document.createElement("sf-modal");a.slot="dialog",a.className="sf-data-view-dialog",a.setAttribute("heading",e),a.setAttribute("aria-label",e),a.setAttribute("width","min(var(--sf-g4), calc(100vw - 2 * var(--sf-space-3)))");const o=document.createElement("div");if(o.slot="content",o.className="flex flex-col gap-3",t){const e=document.createElement("p");e.className="sf-text-1 m-0",e.textContent=t,o.append(e)}const l=`${this.instanceId}-move`;if(r){const t=document.createElement("div");if(t.setAttribute("role","radiogroup"),t.setAttribute("aria-label",e),t.className="flex flex-col gap-1",t.style.cssText="overflow-y: auto; min-block-size: 0; flex: 1 1 auto;",r.forEach((e,s)=>{const i=document.createElement("sf-radio");i.setAttribute("name",l),i.setAttribute("value",null===e.id?"":String(e.id)),i.setAttribute("label",String(e.label)),Array.isArray(e.path)&&e.path.length&&i.setAttribute("description",e.path.join(" / ")),0===s&&i.setAttribute("checked",""),t.append(i)}),o.append(t),n){const e=document.createElement("div");e.setAttribute("role","radiogroup"),e.setAttribute("aria-label",(0,i.pageText)(T,"movePlace",this)),e.className="flex gap-2";for(const[t,s]of[["last","moveLast"],["first","moveFirst"]]){const r=document.createElement("sf-radio");r.setAttribute("name",`${l}-place`),r.setAttribute("value",t),r.setAttribute("label",(0,i.pageText)(T,s,this)),"last"===t&&r.setAttribute("checked",""),e.append(r)}o.append(e)}}const c=document.createElement("div");c.slot="footer",c.className="flex justify-end gap-2";const d=document.createElement("sf-button");d.setAttribute("appearance","outline"),d.setAttribute("text",(0,i.pageText)(T,"cancel",this));const h=document.createElement("sf-button");h.setAttribute("text",s),h.dataset.apply="",c.append(d,h),a.append(o,c),this.append(a);const u=e=>[...o.querySelectorAll(`sf-radio[name="${e}"]`)].find(e=>!0===e.checked||e.hasAttribute("checked")&&!1!==e.checked);let p=null;d.addEventListener("click",()=>a.close({reason:"cancelled"})),h.addEventListener("click",()=>{if(r){const e=u(l),t=e?.getAttribute("value")??"",s=r.find(e=>(null===e.id?"":String(e.id))===t)??r[0],i=n?u(`${l}-place`)?.getAttribute("value"):"last";p={parent:s.id,index:"first"===i?0:null}}else p=!0;a.confirm()});const f=new AbortController,g=await a.open({},{signal:f.signal});return a.remove(),"applied"===g?.outcome&&!0===g.value?.accepted?p:null}_renderTreeRows(){this.records=(0,p.Wp)(this.tree),this.table?.setRows?.((0,p.WY)(this.tree))}_isRecordPatch(e){return Boolean(e)&&Array.isArray(e.records)&&!e.echo&&null==e.total&&!e.columns&&!e.saved_views&&!e.column_settings&&!e.tree}async setCell({id:e,key:t,value:s,revision:i}={}){if(null==e||!t)return null;const r=this.records.find(t=>String(t.id)===String(e)),n=await this._raise("record.set",{record_id:e,key:t,value:s,revision:i??r?._revision??r?.revision??null});if(this.table?.clearCellPending?.(String(e),t),"applied"!==n?.answer){const s=this.records.find(t=>String(t.id)===String(e));this.table?.resetCellControl?.(String(e),t,s?.[t])}return n}async reorderRows({ids:e=[],before:t=null,order:s=null}={}){if(!e.length)return null;const i=this.records;if(Array.isArray(s)){const e=new Map(this.records.map(e=>[String(e.id),e])),t=s.map(t=>e.get(String(t))).filter(Boolean);t.length===this.records.length&&(this.records=t,this._renderProjection())}const r=i.find(t=>e.map(String).includes(String(t.id))),n=await this._raise("record.reorder",{record_ids:[...e],before:t,revision:r?._revision??r?.revision??null});return"applied"!==n?.answer&&(this.records=i,this._renderProjection()),n}_applyRecordPatch(e=[]){let t=0;for(const s of e)s&&null!=s.id&&this.updateRecord(s.id,s)&&(t+=1);return t!==e.length?this.refresh("record-unknown"):this.notify(""),t}_captureRowActions(e){if(this._knownRowActions?.length)return this._knownRowActions;const t=e?.ACTIONS_SETTINGS_ROW,s=Array.isArray(t)&&t.length>0&&t!==this._projectedRowActions;return this._knownRowActions=s?t:[],s||this._awaitRowActions(),this._knownRowActions}_awaitRowActions(){if(this._awaitingRowActions)return;this._awaitingRowActions=!0,globalThis.SF?.Loader?.ensure?.(["sf-view-table"]);const e=globalThis.customElements?.whenDefined?.("sf-view-table");e?.then?.(()=>{this.isConnected&&this._renderProjection()})}_renderProjection(){this._capabilitiesKey=J(this.knownPort),this._readPrintedPageSize(),this._applyForAll(),void 0!==this._current&&this.table&&this.table.current!==this._current&&(this.table.current=this._current);const e=this.shadowRoot?.querySelector?.("[data-saved-views]");e&&(e.hidden=!this.knownCapability("saved-views")),this.pagination?.setState?.({showMoreBusy:!1}),this.pagination?.setAttribute?.("bottom","false"),this.pagination?.setAttribute?.("size",this.size),this._forwardLabels();const t=this.table;if(t){const e=!0===this._queryRefused;t.hasAttribute?.("data-sf-host-toolbar")||t.setAttribute("data-sf-host-toolbar",t.getAttribute?.("toolbar")??"");const s=t.getAttribute?.("data-sf-host-toolbar");e?t.setAttribute("toolbar","false"):s?t.setAttribute("toolbar",s):t.removeAttribute?.("toolbar"),t.setAttribute("selectable",this.renders("select")&&!e?"true":"false"),t.hasAttribute?.("data-sf-host-layout")||t.setAttribute("data-sf-host-layout",t.getAttribute?.("layout")??""),t.getAttribute?.("data-sf-host-layout")||t.setAttribute("layout",this.renders("toolbar")?"auto":"table"),t.setAttribute("size",this.size),this._tableScrollMode(t),t.setAttribute("settings",this.renders("settings")?"true":"false"),t.setAttribute("settings-menu",this.hostOffers("personal-column-settings")?"true":"false"),t.setAttribute("creatable",this.hostOffers("create-record")&&!e?"true":"false"),t.setAttribute("row-reorder",this.hostOffers("row-reorder")&&"tree"!==this.treeMode?"true":"false"),t.setAttribute("inline-edit",this.hostOffers("inline-edit")?"true":"false"),t.setAttribute("filter-templates",this.hostOffers("saved-views")?"true":"false"),t.hasAttribute?.("data-sf-host-row-actions")||t.setAttribute("data-sf-host-row-actions",t.getAttribute?.("row-actions")??"");const r="false"===t.getAttribute?.("data-sf-host-row-actions");t.setAttribute("row-actions",!r&&this.knownCapability("row-actions")?"true":"false");const n=this.shadowRoot.querySelector('slot[name="content"]'),a=this.getAttribute("aria-label");a&&n&&!n.assignedElements().length&&t.setAttribute("aria-label",a);const o=new Set(this.records.flatMap(e=>Array.isArray(e.actions)?e.actions:[])),l=this._captureRowActions(t),c=new Map(this.rowActionCatalog.map(e=>[e.id,e])),d="tree"===this.treeMode?{move:(0,i.pageText)(T,"moveAction",this),...this.hostOffers("create-record")?{create:(0,i.pageText)(T,"createChildAction",this)}:{}}:{},h=e=>{const t=c.get(e)??(d[e]?{id:e,label:d[e]}:null);if(t)return{id:e,name:t.label,danger:!0===t.danger,inline:!1,component:{type:"button",props:{text:t.label,appearance:"link",...t.icon?{icon:t.icon}:{}}}};const s=l.find(t=>t.id===e);if(s)return s;console.warn(`[sf-view] row action «${e}» has no row_actions entry; name it in the host's catalogue.`);const r=(0,i.pageText)(T,"unnamedAction",this);return{id:e,name:r,inline:!1,component:{type:"button",props:{text:r,appearance:"link",title:e}}}},u=new Map,p=[];for(const e of o){const t=c.get(e)?.group;if(t){if(!u.has(t)){const s=c.get(e).group_label??t,i={id:`group:${t}`,name:s,members:[],inline:!1,component:{type:"button",props:{text:s,appearance:"link"}}};u.set(t,i),p.push(i)}u.get(t).members.push(h(e))}else p.push(h(e))}t.ACTIONS_SETTINGS_ROW=p,this._projectedRowActions=p,p.length&&p.every(e=>!1===e.inline)&&t.setAttribute("row-actions","false"),t.cellHost=this.hostPort??null,t.setColumns?.(this.columns),Array.isArray(this.appended)?t.addRows?.(this.appended):(t.setRows?.(this.cappedRecords,this._newResult?"result":"rows"),this._newResult=!1);const f=this.query.sort[0];t.setSort?.(f?.key??null,f?.direction??null),t.setTemplates?.(Object.fromEntries(this.savedViews.map(e=>[e.key,e])))}const s=this.pagination,r=this._answered?{total:this.total,countKnown:this.countKnown,totalExact:this.totalExact,hasNext:this.hasNext}:{},a=String(s?.getAttribute?.("page-sizes")??"10,20,30,40").split(/[\s,]+/u).map(Number).filter(e=>Number.isInteger(e)&&e>0),o=Number(this.query.per_page);s&&Number.isInteger(o)&&o>0&&!a.includes(o)&&s.setAttribute("page-sizes",[...a,o].sort((e,t)=>e-t).join(",")),s?.setState?.({current:this.query.page,pageSize:this.query.per_page,...r,canCount:this.knownCapability("count-on-request"),counting:!1});const l=this.shadowRoot.querySelector('[part="layout"]');l&&l.setAttribute("aria-label",this.getAttribute("aria-label")||(0,i.pageText)(T,"layoutLabel",this));const c=this.shadowRoot.querySelector(`slot[name="content"] > ${(0,n.tagSelector)("sf-view-table")}`);c&&!c.getAttribute("aria-label")&&c.setAttribute("aria-label",(0,i.pageText)(T,"recordsLabel",this));const d=this.shadowRoot.querySelector('[part="toolbar"]'),h=this.querySelector(`:scope > ${(0,n.tagSelector)("sf-view-table")}[slot="content"]`),u=h?.getAttribute("data-sf-host-toolbar")??h?.getAttribute("toolbar"),p=Boolean(h)&&"false"!==u,f=this.querySelector(':scope > [slot="toolbar"]');d&&(d.hidden=!this.renders("toolbar")||p&&!f||!0===this._queryRefused);const g=this.shadowRoot.querySelector('slot[name="pagination"]'),b=!this._answered||this._queryRefused||["error","no-access"].includes(this.getAttribute("data-state"));if(g&&(g.hidden=!this.renders("pagination")||"tree"===this.treeMode||b),this.capHidesRows){const e=this.showAllBand;let t=e.querySelector("[data-show-all]");t||(t=document.createElement("sf-button"),t.setAttribute("data-show-all",""),t.setAttribute("appearance","link"),t.setAttribute("size","1"),e.append(t)),t.setAttribute("text",(0,i.pageText)(T,"showAll",this));let s=e.querySelector("[data-show-count]");s||(s=document.createElement("span"),s.setAttribute("data-show-count",""),e.append(s)),s.textContent=this.countKnown?(0,i.pageText)(T,"ofTotal",this).replace("{shown}",String(this.cappedRecords.length)).replace("{total}",this._shownTotal(this.total)):""}else this._showAll?.isConnected&&this._showAll.remove(),this._showAll=null;const y=this.shadowRoot.querySelector("[data-search]");y&&y.value!==this.query.search&&(y.value=this.query.search);const v=this.shadowRoot.querySelector("[data-view]");if(v){const e=v.value;v.replaceChildren(new Option((0,i.pageText)(T,"currentViewText",this),""),...this.savedViews.map(e=>new Option(e.label,e.key))),v.value=this.savedViews.some(t=>t.key===e)?e:""}}saveView({key:e,label:t,level:s="personal",revision:i,roles:r,layout:n,settings:a}={}){if(!e||!t)throw new TypeError("Saved view needs key and label");if(!["personal","shared"].includes(s))throw new TypeError("Only personal and shared views can be written");const[o,l]=String(this.hostPort?.version??"0.0.0").split(".").map(Number);return"shared"!==s||o>1||1===o&&l>=1?this._raise("shared"===s?"view.save_shared":"view.save",{key:e,label:t,revision:i,query:F(this.query),roles:F(r??{}),layout:F(n??{columns:this.columns}),settings:F(a??this.columnSettings??{}),..."shared"===s?{target:"shared"}:{}}):Promise.resolve({answer:"unavailable",reason:"saved-view-levels-require-port-1.1.0"})}deleteView(e){return this._raise("view.delete",{key:e})}openView(e){return this._openedView=e,this._raise("view.open",{key:e})}_restoreOpenedView(){const e=this._openedView;if(!e)return this;const t=this.savedViews.find(t=>t?.key===e);if(!t)return this;this._openedView=null;const s=t.settings?.filter_fields;return Array.isArray(s)&&this.table?.setActiveFilterFields?.(s.filter(e=>"string"==typeof e)),this}saveColumnSettings(e,{shared:t=!1,base_revision:s}={}){const i=t?"shared":"personal",r=this.columnSettings?.target,n=r&&(r.kind??r.target??r)===i?r.revision:r?.revision??null,a=s??this.columnSettings?.layers?.[i]?.revision??n;return null==a?(this._showAnswer(t?"settings.save_shared":"settings.save_personal",{answer:"unavailable",reason:"no-base-revision"}),Promise.resolve({answer:"unavailable",reason:"no-base-revision"})):this._raise(t?"settings.save_shared":"settings.save_personal",{columnSettings:F(e),base_revision:a,...t?{target:"shared"}:{}}).then(e=>{if("conflict"===e?.answer){const t=e.current_revision??e.data?.current_revision,s=e.columns??e.data?.columns;if(e.data?.column_settings)this.columnSettings=F(e.data.column_settings);else if(null!=t){const e={...this.columnSettings?.layers??{}};e[i]={...e[i]??{},revision:t,...s?{columns:F(s)}:{}},this.columnSettings={...this.columnSettings??{},layers:e}}else this.refresh("settings-conflict")}return e})}resetColumnSettings(){return this.saveColumnSettings({},{})}_shownTotal(e){return this.totalExact?String(e):`~${e}`}applyUnderFilter(e,t){if(!this.totalExact)return this.count("action-for-all").then(e=>this.totalExact&&"applied"===e?.answer?(this._renderBulkBand(),{answer:"conflict",reason:"total-counted",current_total:this.total}):e);if(!Number.isSafeInteger(t)||t!==this.total)throw new TypeError("Confirm the current total before a filter-wide action");return this._raise("bulk.apply_under_filter",{action_id:e,filters:F(this.query.filters),confirmed_total:t}).then(e=>{const t=e?.current_total??e?.data?.total;return"conflict"===e?.answer&&Number.isSafeInteger(t)&&t>=0&&(this.total=t,this.totalExact=!0,this.pagination?.setState?.({total:t,countKnown:!0,totalExact:!0}),this._renderBulkBand()),e})}async count(e="total"){const t=this._countKey(),s=await this._raise("query.count",{query:{search:this.query.search??"",filters:F(this.query.filters??{})},reason:e}),i=s?.data?.total;return"applied"!==s?.answer||!Number.isSafeInteger(i)||i<0?(this.pagination?.setState?.({counting:!1}),"action-for-all"===e&&this.pagination?.setState?.({actionForAll:!1}),s):t!==this._countKey()?(this.pagination?.setState?.({counting:!1}),s):(this.total=i,this.countKnown=!0,this.totalExact=!1!==s.data.total_exact,this.countedQuery=t,this.pagination?.setState?.({counting:!1,countKnown:!0,totalExact:this.totalExact,total:i}),"last-page"===e&&this.pagination?.lastPage?.(),s)}_action(e,{selectedBulk:t=!1}={}){const s=e?.record_ids;if(!Array.isArray(s)||!s.length||"string"!=typeof e.action_id)return;const i=s.map(e=>this.records.find(t=>t.id===e));if("tree"===this.treeMode&&!t&&1===s.length&&i[0]?.actions?.includes(e.action_id)){if("move"===e.action_id)return this.openMoveDialog(i[0]);if("create"===e.action_id)return this._raise("view.create_record",{item:null,parent:i[0].id})}if(i.some(e=>!e)||!t&&1===s.length&&!i[0].actions?.includes(e.action_id))return void this._showAnswer("record.mutate",{answer:"refused",reason:"action-not-allowed"});if(!t&&1===s.length&&"view"===e.action_id){return this.sfEmit("open",{id:s[0]},{cancelable:!0})?this._raise("record.open",e):null}const r=Object.fromEntries(i.map(e=>[String(e.id),e.revision])),n=this._raise(t||s.length>1?"bulk.apply_selected":"record.mutate",{...e,revisions:r});return"delete"===e.action_id?Promise.resolve(n).then(e=>("applied"===e?.answer&&this.sfEmit("deleted",{ids:[...s]}),e)):n}_openReference(e){if(!this.hostPort||!this.hostOffers("row-actions"))return;e.preventDefault();const{href:t,recordId:s,record_id:i,...r}=e.detail??{};return this._raise("record.open",{...r,record_id:s??i??null,href:t}).then(e=>{!["applied","accepted","opened"].includes(e?.answer)&&t&&globalThis.location?.assign?.(t)})}_onEvent(e){if(this._seenEvents.has(e))return;if(this._seenEvents.add(e),"sf-view-saved-view-intent"===e.type){if(e.currentTarget!==this)return;const t=e.detail??{};return this.saveView({key:t.key,label:t.label??t.key,revision:t.revision,level:"shared",roles:t.roles})}if(e.target===this||e.target?.closest?.((0,n.tagSelector)("sf-view"))!==this&&!this.shadowRoot.contains(e.target))return;if(e.currentTarget===this&&this.shadowRoot.contains(e.target))return;if("change"===e.type&&e.target.matches?.("[data-search]"))return this.changeQuery({search:e.target.value},"search");if("change"===e.type&&e.target.matches?.("[data-view]"))return e.target.value&&this.openView(e.target.value);if("click"===e.type&&e.target.matches?.("[data-show-all]"))return this.openList("row-cap");if("click"===e.type&&e.target.matches?.("[data-save]")){const e=this.shadowRoot.querySelector("[data-view-name]")?.value?.trim();if(e)return this.saveView({key:e,label:e})}if("click"===e.type&&e.target.matches?.("[data-delete]")){const e=this.shadowRoot.querySelector("[data-view]").value;if(e)return this.deleteView(e)}if("sf-view-table-cell-set"===e.type)return this.setCell(e.detail??{});if("sf-view-table-move"===e.type)return this.reorderRows(e.detail??{});if("sf-view-table-search-change"===e.type){const t="object"==typeof e.detail&&null!==e.detail?e.detail.search:e.detail;return this.changeQuery({search:String(t??"")},"search")}if("sf-view-table-filter-change"===e.type)return this.changeQuery({filters:F(e.detail?.filters??e.detail?.values??e.detail??{})},"filter");if("sf-view-table-sort-change"===e.type){const t=e.detail?.direction?[F(e.detail)]:[];return this._keepPreference({sort:t}),this.changeQuery({sort:t},"sort")}if("sf-pagination-change"===e.type)return this.changeQuery({page:e.detail?.current},"page-change");if("sf-pagination-size-change"===e.type){const t=e.detail?.["page-size"];return Number.isInteger(t)&&this._keepPreference({pageSize:t}),this.changeQuery({per_page:t,page:1},"page-size-change")}if("sf-pagination-load-more"===e.type)return this.changeQuery({page:this.query.page+1},"show-more");if("sf-pagination-count"===e.type)return this.count(e.detail?.reason??"total");if("sf-view-table-column-settings-reset"===e.type)return this.resetColumnSettings();if("sf-pagination-selection-clear"===e.type)return this.clearSelection();if("sf-pagination-action-change"===e.type||"sf-pagination-action-for-all-change"===e.type)return void this._renderBulkBand();if("sf-view-table-refresh"===e.type)return this.refresh("retry");if("sf-view-table-reference-open"===e.type)return this._openReference(e);if("sf-view-table-expand"===e.type){const t=e.detail?.id;return e.detail?.expanded?this.collapseNode(t):this.expandNode(t)}if("sf-view-table-load-more"===e.type)return this.loadMoreNodes(e.detail?.parent,e.detail?.cursor);if("sf-view-table-apply"===e.type)return this._action({action_id:e.detail?.action,record_ids:e.detail?.ids},{selectedBulk:"selection"===e.detail?.scope});if("sf-view-table-save"===e.type)return this.saveColumnSettings(e.detail?.columnSettings??e.detail,{shared:"shared"===e.detail?.target,base_revision:e.detail?.base_revision});if("sf-pagination-apply"===e.type)return"filter"===e.detail?.scope?this.applyUnderFilter(e.detail.action,e.detail.total):this._action({action_id:e.detail?.action,record_ids:this.table?.getSelectedRecordIds?.()??[]},{selectedBulk:!0});if("sf-view-table-select"===e.type)return this.pagination?.setState?.({selectedCount:e.detail?.ids?.length??0}),void this._renderBulkBand();const t=b[e.type];if("query.change"===t)return this.refresh("table-context");if("view.save"===t){const t=(e={})=>this.saveView({key:e.key,label:e.label??e.name??e.key,revision:e.revision,level:e.level??"personal",roles:e.roles,layout:e.layout,settings:e.settings}),s=e.detail??{};return Array.isArray(s)?Promise.all(s.filter(e=>e?.key).map(t)):t(s)}return t?this._raise(t,F(e.detail??{})):void 0}}W.sfElementBrand="simai.smart-base.v1",(0,o.C3)(W,l),(0,o.l6)(W,l);const H=customElements.get("sf-view");H?H.sfElementBrand!==W.sfElementBrand&&console.warn("SfDataView.define(): sf-view is already defined",H):(customElements.define("sf-view",W),(0,n.defineTagAliases)(W,"sf-view"));t()}catch(U){t(U)}})},"29f88c884ba1"(e,t,s){s.d(t,{BT:()=>o,O8:()=>c,WY:()=>h,Wp:()=>u,ap:()=>l,bP:()=>n,tO:()=>a,yY:()=>d});const i="\0root",r=e=>null==e?i:String(e);function n(){return{nodes:new Map,children:new Map,expanded:new Set,loading:new Set}}function a(e,{parent:t=null,records:s=[],hasNext:n=!1,cursor:a=null,append:o=!1}={}){const l=r(t);l!==i||o||(e.nodes.clear(),e.children.clear(),e.loading.clear());for(const t of s)e.nodes.set(String(t.id),t);const c=o?e.children.get(l)?.ids??[]:[],d=new Set(c),h=[...c,...s.map(e=>String(e.id)).filter(e=>!d.has(e))];return e.children.set(l,{ids:h,hasNext:Boolean(n),cursor:a??null}),l!==i&&(e.expanded.add(l),e.loading.delete(l)),e}function o(e,t){return e.children.has(r(t))}function l(e,t){return e.expanded.delete(String(t)),e}function c(e,t){return e.expanded.add(String(t)),e}function d(e,t){return e.loading.add(String(t)),e}function h(e){const t=[],s=(r,n)=>{const a=e.children.get(r);a&&(a.ids.forEach((i,r)=>{const o=e.nodes.get(i);if(!o)return;const l=e.expanded.has(i)&&e.children.has(i);t.push({...o,__tree:{level:Number.isInteger(o.level)?o.level:n,hasChildren:!0===o.has_children,expanded:l,loading:e.loading.has(i),setsize:a.ids.length,posinset:r+1}}),l&&s(i,n+1)}),a.hasNext&&t.push({id:`__more:${r===i?"":r}`,__tree:{level:n,more:!0,parent:r===i?null:r,cursor:a.cursor}}))};return s(i,0),t}function u(e){return[...e.nodes.values()]}},"892a0da25239"(e){e.exports=globalThis.SF&&globalThis.SF.runtimeModule?globalThis.SF.runtimeModule("aliases",1):new Promise((e,t)=>globalThis.addEventListener("sf-runtime-ready",()=>globalThis.SF.runtimeModule("aliases",1).then(e,t),{once:!0}))},"5b7d7695b41b"(e){e.exports=globalThis.SF&&globalThis.SF.runtimeModule?globalThis.SF.runtimeModule("element-manifest",1):new Promise((e,t)=>globalThis.addEventListener("sf-runtime-ready",()=>globalThis.SF.runtimeModule("element-manifest",1).then(e,t),{once:!0}))},"43090d1c8307"(e){e.exports=globalThis.SF&&globalThis.SF.runtimeModule?globalThis.SF.runtimeModule("page-language",1):new Promise((e,t)=>globalThis.addEventListener("sf-runtime-ready",()=>globalThis.SF.runtimeModule("page-language",1).then(e,t),{once:!0}))},deb1a4d61565(e){e.exports=globalThis.SF&&globalThis.SF.runtimeModule?globalThis.SF.runtimeModule("smart-base",1):new Promise((e,t)=>globalThis.addEventListener("sf-runtime-ready",()=>globalThis.SF.runtimeModule("smart-base",1).then(e,t),{once:!0}))},"80ad38cb6908"(e){e.exports=JSON.parse('{"$comment":"Dated aliases of sf-view for the shim (core/js/aliases.js, standard §16 item 20).","component":"sf-view","since":"2026-10-27","remove_after":"2026-12-01","aliases":[{"from":"aria-label","to":null,"kind":"attribute","component":"sf-view","since":"2026-10-27","remove_after":"2026-12-01","mode":"host-attribute","section":"§3.1, §4.8","note":"stays a host attribute, read for the accessible name; no shim"},{"from":"sf-table-tree-intent","to":"sf-data-view-tree","kind":"event","component":"sf-view","since":"2026-10-27","remove_after":"2026-12-01","mode":"same-detail","cancelable":false,"section":"§8, vocabulary §9","note":"the view\'s announcement of the tree\'s port intents carried a table name; the detail {intent, payload} is unchanged"},{"from":"sf-data-view","to":"sf-view","kind":"tag","component":"sf-view","since":"2026-11-03","remove_after":"2027-01-01","section":"rename plan R2 (ui-control RENAME-PLAN-2026-11-03), naming decision 2026-11-02","note":"the element is sf-view; sf-data-view is a subclass defined beside it until the date"},{"from":"sf-data-view-open","to":"sf-view-open","kind":"event","component":"sf-view","since":"2026-11-03","remove_after":"2027-01-01","mode":"same-detail","section":"§8","note":"the event name carries the tag"},{"from":"sf-data-view-deleted","to":"sf-view-deleted","kind":"event","component":"sf-view","since":"2026-11-03","remove_after":"2027-01-01","mode":"same-detail","section":"§8","note":"the event name carries the tag"},{"from":"sf-data-view-answer","to":"sf-view-answer","kind":"event","component":"sf-view","since":"2026-11-03","remove_after":"2027-01-01","mode":"same-detail","section":"§8","note":"the event name carries the tag"},{"from":"sf-data-view-state","to":"sf-view-state","kind":"event","component":"sf-view","since":"2026-11-03","remove_after":"2027-01-01","mode":"same-detail","section":"§8","note":"the event name carries the tag"},{"from":"sf-data-view-tree","to":"sf-view-tree","kind":"event","component":"sf-view","since":"2026-11-03","remove_after":"2027-01-01","mode":"same-detail","section":"§8","note":"the event name carries the tag"},{"from":"sf-data-view-files-drop","to":"sf-view-files-drop","kind":"event","component":"sf-view","since":"2026-11-03","remove_after":"2027-01-01","mode":"same-detail","section":"§8","note":"the event name carries the tag"},{"from":"sf-data-view-saved-view-intent","to":"sf-view-saved-view-intent","kind":"event","component":"sf-view","since":"2026-11-03","remove_after":"2027-01-01","mode":"same-detail","section":"§8","note":"the event name carries the tag"},{"from":"sf-data-view-list-open","to":"sf-view-list-open","kind":"event","component":"sf-view","since":"2026-11-03","remove_after":"2027-01-01","mode":"same-detail","section":"§8","note":"the event name carries the tag"}]}')},"7086146c00cc"(e){e.exports=JSON.parse('{"id":"smart.view","tag":"sf-view","version":"1.8.0","kind":"leaf","settings":{"chrome":{"type":"string","default":"toolbar pagination select settings"},"row-cap":{"type":"number","default":0,"integer":true,"min":0},"expected-columns":{"type":"number","default":4,"integer":true,"min":1},"port-owner":{"type":"string","default":""},"port-record":{"type":"string","default":""},"port-group":{"type":"string","default":""},"size":{"type":"enum","values":["1/2","1"],"default":"1"},"column-search-placeholder":{"type":"string"},"column-search-empty-text":{"type":"string"},"column-move-label":{"type":"string"},"filter-apply-text":{"type":"string"},"show-more-text":{"type":"string"},"selected-label":{"type":"string"},"total-label":{"type":"string"},"pages-label":{"type":"string"},"first-label":{"type":"string"},"previous-label":{"type":"string"},"page-label":{"type":"string"},"next-label":{"type":"string"},"last-label":{"type":"string"},"page-field-label":{"type":"string"},"action-choose-label":{"type":"string"},"actions-label":{"type":"string"},"actions-region-label":{"type":"string"},"clear-selection-label":{"type":"string"},"page-size-label":{"type":"string"},"pagination-aria-label":{"type":"string"},"preferences-key":{"type":"string","default":""},"accept-files":{"type":"boolean","default":false},"collection":{"type":"string","default":""},"current":{"type":"string","default":""},"bulk-actions":{"type":"list","of":{"id":"string","label":"string"}},"first-answer":{"type":"object","optional":true}},"values":{"state":{"type":"state"},"total":{"type":"number","nullable":true},"selected":{"type":"id","optional":true},"selection":{"type":"list"}},"events":{"open":{"carries":{"id":"id"},"cancelable":true},"deleted":{"carries":{"ids":"list"}},"answer":{"carries":{"intent":{"type":"string"},"answer":{"type":"enum","values":["applied","conflict","refused","unavailable"],"schema":{"type":"string"}},"reason":{"type":"string","optional":true},"message":{"type":"string","optional":true},"data":{"type":"object","optional":true},"sequence":{"type":"number","integer":true,"optional":true},"effects":{"type":"list","optional":true},"instance_id":{"type":"string"}},"own-verb":true},"state":{"carries":{"state":{"type":"enum","values":["loading","populated","empty","error","no-access"],"schema":{"type":"string"}},"message":{"type":"string"},"instance_id":{"type":"string"}},"own-verb":true},"tree":{"carries":{"intent":"string","payload":{"type":"object","optional":true}},"own-verb":true},"files-drop":{"carries":{"files":{"type":"list","schema":{"items":{"type":"object"},"minItems":1}}},"own-verb":true},"pagination-count":{"shared":"count-on-request@1","carries":{"component":{"type":"object"},"tagName":{"type":"string"},"template":{"type":"string"},"reason":{"type":"enum","values":["total","last-page","action-for-all"],"schema":{"type":"string"}},"current":{"type":"number","integer":true},"pageSize":{"type":"number","integer":true}}},"saved-view-intent":{"carries":{"key":{"type":"string"},"label":{"type":"string"},"revision":{"type":"string","schema":{"type":["string","integer"]},"optional":true},"roles":{"type":"object","optional":true}}},"table-action-intent":{"shared":"table-intents@1","carries":{"action_id":{"type":"string","schema":{"minLength":1}},"record_ids":{"type":"list","schema":{"items":{"type":["string","integer"]},"minItems":1}}}},"table-column-settings-change":{"shared":"table-intents@1","carries":{"reason":{"type":"string"},"columnSettings":{"type":"object"},"tableSettingsKey":{"type":"string"},"target":{"type":"enum","values":["personal","shared"],"schema":{"type":"string"},"optional":true},"base_revision":{"type":"string","schema":{"type":["string","number"]},"optional":true}}},"table-column-settings-reset":{"shared":"table-intents@1","carries":{"target":{"type":"enum","values":["personal"],"schema":{"type":"string"}},"tableSettingsKey":{"type":"string","schema":{"type":["string","null"]}}}},"table-create-intent":{"shared":"table-intents@1","carries":{"item":{"type":"string","schema":{"type":["string","null"]}}}},"table-query-intent":{"shared":"table-intents@1","carries":{"reason":{"type":"enum","values":["context"]},"context":{"type":"object"},"sequence":{"type":"number","integer":true,"schema":{"minimum":1}}}},"table-template-delete":{"shared":"table-intents@1","carries":{"key":{"type":"string","schema":{"minLength":1}}}},"table-template-save":{"shared":"table-intents@1","carries":{},"x-comment":"The detail is one template object or an array of them: a carries map cannot say that, so the payload schema is x-registry/event-fields until 1.4 has a home for a detail that is not a flat object."},"table-template-select":{"shared":"table-intents@1","carries":{"key":{"type":"string","schema":{"minLength":1}}}},"host-port-request":{"shared":"host-port@1","carries":{"component":{"type":"object","optional":true},"context":{"type":"object","optional":true}}},"list-open":{"carries":{"reason":{"type":"id","schema":{"enum":["row-cap"]}},"query":{"type":"object"}}},"table-cell-set":{"shared":"table-intents@1","carries":{"id":{"type":"string","schema":{"type":["string","integer"]}},"key":{"type":"string"},"value":{"type":"id"},"revision":{"type":"string","schema":{"type":["string","integer","null"]}}}},"table-rows-reorder":{"shared":"table-intents@1","carries":{"ids":{"type":"list","schema":{"items":{"type":"string"},"minItems":1}},"before":{"type":"string","schema":{"type":["string","null"]}},"order":{"type":"list","schema":{"items":{"type":"string"}}}}}},"actions":{"refresh":{"with":{"reason":{"type":"string","optional":true}}},"change-query":{"with":{"patch":"object","reason":{"type":"string","optional":true}},"concurrency":"latest"},"open-view":{"with":{"key":"string"}},"save-view":{"with":{"view":{"type":"object"}},"concurrency":"drop"},"delete-view":{"with":{"key":"string"},"concurrency":"drop"},"apply-under-filter":{"with":{"action-id":"string","confirmed-total":"number"},"concurrency":"drop"},"reset-column-settings":{},"clear-selection":{},"notify":{"with":{"text":"string","options":{"type":"object","optional":true}}}},"port":{"id":"simai.dataview-port","version":"1.13.0","contract":"src/core/contracts/ports/simai.dataview-port/1.13.0/port.json"},"presentation":{"skeleton":{"late":[]}},"css-variables":{"--sf-data-view-gap":{"type":"length","state":"default"},"--sf-data-view-drop-border-color":{"type":"color","state":"dragged-over"},"--sf-data-view-drop-background-color":{"type":"color","state":"dragged-over"},"--sf-data-view-drop-color":{"type":"color","state":"dragged-over"},"--sf-data-view-toolbar-gap":{"type":"length","state":"default"}},"host-states":{"data-state":"string","aria-busy":"string"}}')},ce0305e57fa5(e){e.exports=JSON.parse('{"title":"Data view","events":{"answer":{"label":"The host answered"},"state":{"label":"List state"},"tree":{"label":"Tree request"},"files-drop":{"label":"Files dropped on the list"}},"runtime":{"cancel":"Cancel","close-notice-label":"Close the message","confirm-apply":"Confirm","confirm-title":"Confirm the change","create-child-action":"Add a nested one","current-view-text":"Current","drop-files":"Drop the files here to upload them","empty-text":"No data","layout-label":"Data view","move-action":"Move…","move-apply":"Move","move-first":"First","move-last":"Last","move-no-targets":"There is nowhere this record can be moved.","move-place":"Place","move-root":"To the top level","move-title":"Move «{label}»","notice-action-not-allowed":"That action is not available for the chosen record.","notice-capability-not-provided":"The host does not support that action.","notice-confirm-required":"The action has to be confirmed first.","notice-conflict":"The data changed. Read the view again and repeat the action.","notice-failed":"The action was not carried out.","notice-fetch-failed":"The data could not be fetched. Try again.","notice-forbidden":"You may not do this.","notice-load-failed":"The data could not be loaded.","notice-no-base-revision":"The settings cannot be saved yet: the view has no current version of them. Read the view again.","notice-not-confirmed":"The action was cancelled.","notice-port-not-connected":"The data source is not connected.","notice-record-invalid":"The record was not found.","notice-refused":"The action was refused.","notice-saved-view-levels":"Shared views need a newer port.","notice-stale-revision":"Someone changed this in the meantime. Read the view again and repeat the action.","notice-unavailable":"The action is unavailable.","of-total":"{shown} of {total}","records-label":"Records","show-all":"Show all","state-load-failed":"The data could not be loaded","state-loading":"Loading","state-port-not-connected":"The data port is not connected","state-query-failed":"The request could not be completed","state-unavailable":"The data is temporarily unavailable","unnamed-action":"Action"}}')},"3e9dffe84919"(e){e.exports=JSON.parse('{"title":"Представление данных","events":{"answer":{"label":"Ответ хоста"},"state":{"label":"Состояние списка"},"tree":{"label":"Запрос ветви дерева"},"files-drop":{"label":"Файлы брошены на список"}},"runtime":{"cancel":"Отмена","close-notice-label":"Закрыть сообщение","confirm-apply":"Подтвердить","confirm-title":"Подтвердите изменение","create-child-action":"Добавить вложенную","current-view-text":"Текущий","drop-files":"Отпустите, чтобы загрузить файлы сюда","empty-text":"Нет данных","layout-label":"Представление данных","move-action":"Переместить…","move-apply":"Переместить","move-first":"Первым","move-last":"Последним","move-no-targets":"Эту запись некуда переместить.","move-place":"Место","move-root":"На верхний уровень","move-title":"Переместить «{label}»","notice-action-not-allowed":"Это действие недоступно для выбранной записи.","notice-capability-not-provided":"Хост не поддерживает это действие.","notice-confirm-required":"Действие нужно сначала подтвердить.","notice-conflict":"Данные изменились. Обновите представление и повторите действие.","notice-failed":"Действие не выполнено.","notice-fetch-failed":"Не удалось получить данные. Повторите попытку.","notice-forbidden":"Недостаточно прав для этого действия.","notice-load-failed":"Не удалось загрузить данные.","notice-no-base-revision":"Настройки пока нельзя сохранить: у представления нет их текущей версии. Обновите представление.","notice-not-confirmed":"Действие отменено.","notice-port-not-connected":"Источник данных не подключён.","notice-record-invalid":"Запись не найдена.","notice-refused":"Действие отклонено.","notice-saved-view-levels":"Общие виды требуют более новой версии порта.","notice-stale-revision":"Данные успели изменить. Обновите представление и повторите действие.","notice-unavailable":"Действие недоступно.","of-total":"{shown} из {total}","records-label":"Записи","show-all":"Показать все","state-load-failed":"Не удалось загрузить данные","state-loading":"Загрузка данных","state-port-not-connected":"Порт данных не подключён","state-query-failed":"Запрос не выполнен","state-unavailable":"Данные временно недоступны","unnamed-action":"Действие"}}')}};const t={};function s(i){const r=t[i];if(void 0!==r)return r.exports;const n=t[i]={exports:{}};return e[i](n,n.exports,s),n.exports}(()=>{const e="function"==typeof Symbol,t=e?Symbol("webpack queues"):"__webpack_queues__",i=e?Symbol("webpack exports"):"__webpack_exports__",r=e?Symbol("webpack error"):"__webpack_error__",n=e=>{e?.d<1&&(e.d=1,e.forEach(e=>e.r--),e.forEach(e=>e.r--?e.r++:e()))};s.a=(e,s,a)=>{let o;a&&((o=[]).d=-1);const l=new Set,c=e.exports;let d,h,u;const p=new Promise((e,t)=>{u=t,h=e});p[i]=c,p[t]=e=>(o&&e(o),l.forEach(e),p.catch(e=>{})),e.exports=p;s(e=>{let s;d=(e=>e.map(e=>{if(null!==e&&"object"==typeof e){if(e[t])return e;if(e.then){const s=[];s.d=0,e.then(e=>{a[i]=e,n(s)},e=>{a[r]=e,n(s)});const a={};return a[t]=e=>e(s),a}}const s={};return s[t]=e=>{},s[i]=e,s}))(e);const a=()=>d.map(e=>{if(e[r])throw e[r];return e[i]}),c=new Promise(e=>{s=()=>e(a),s.r=0;const i=e=>e!==o&&!l.has(e)&&(l.add(e),e&&!e.d&&(s.r++,e.push(s)));d.map(e=>e[t](i))});return s.r?c:a()},e=>(e?u(p[r]=e):h(c),n(o))),o?.d<0&&(o.d=0)}})(),s.n=e=>{const t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{if(Array.isArray(t))for(var i=0;i<t.length;){var r=t[i++],n=t[i++];s.o(e,r)?0===n&&i++:0===n?Object.defineProperty(e,r,{enumerable:!0,value:t[i++]}):Object.defineProperty(e,r,{enumerable:!0,get:n})}else for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);s("36b027867bab")})();
@@ -0,0 +1,61 @@
1
+ {
2
+ "title": "Data view",
3
+ "events": {
4
+ "answer": {
5
+ "label": "The host answered"
6
+ },
7
+ "state": {
8
+ "label": "List state"
9
+ },
10
+ "tree": {
11
+ "label": "Tree request"
12
+ },
13
+ "files-drop": {
14
+ "label": "Files dropped on the list"
15
+ }
16
+ },
17
+ "runtime": {
18
+ "cancel": "Cancel",
19
+ "close-notice-label": "Close the message",
20
+ "confirm-apply": "Confirm",
21
+ "confirm-title": "Confirm the change",
22
+ "create-child-action": "Add a nested one",
23
+ "current-view-text": "Current",
24
+ "drop-files": "Drop the files here to upload them",
25
+ "empty-text": "No data",
26
+ "layout-label": "Data view",
27
+ "move-action": "Move…",
28
+ "move-apply": "Move",
29
+ "move-first": "First",
30
+ "move-last": "Last",
31
+ "move-no-targets": "There is nowhere this record can be moved.",
32
+ "move-place": "Place",
33
+ "move-root": "To the top level",
34
+ "move-title": "Move «{label}»",
35
+ "notice-action-not-allowed": "That action is not available for the chosen record.",
36
+ "notice-capability-not-provided": "The host does not support that action.",
37
+ "notice-confirm-required": "The action has to be confirmed first.",
38
+ "notice-conflict": "The data changed. Read the view again and repeat the action.",
39
+ "notice-failed": "The action was not carried out.",
40
+ "notice-fetch-failed": "The data could not be fetched. Try again.",
41
+ "notice-forbidden": "You may not do this.",
42
+ "notice-load-failed": "The data could not be loaded.",
43
+ "notice-no-base-revision": "The settings cannot be saved yet: the view has no current version of them. Read the view again.",
44
+ "notice-not-confirmed": "The action was cancelled.",
45
+ "notice-port-not-connected": "The data source is not connected.",
46
+ "notice-record-invalid": "The record was not found.",
47
+ "notice-refused": "The action was refused.",
48
+ "notice-saved-view-levels": "Shared views need a newer port.",
49
+ "notice-stale-revision": "Someone changed this in the meantime. Read the view again and repeat the action.",
50
+ "notice-unavailable": "The action is unavailable.",
51
+ "of-total": "{shown} of {total}",
52
+ "records-label": "Records",
53
+ "show-all": "Show all",
54
+ "state-load-failed": "The data could not be loaded",
55
+ "state-loading": "Loading",
56
+ "state-port-not-connected": "The data port is not connected",
57
+ "state-query-failed": "The request could not be completed",
58
+ "state-unavailable": "The data is temporarily unavailable",
59
+ "unnamed-action": "Action"
60
+ }
61
+ }
Binary file
@@ -0,0 +1,61 @@
1
+ {
2
+ "title": "Представление данных",
3
+ "events": {
4
+ "answer": {
5
+ "label": "Ответ хоста"
6
+ },
7
+ "state": {
8
+ "label": "Состояние списка"
9
+ },
10
+ "tree": {
11
+ "label": "Запрос ветви дерева"
12
+ },
13
+ "files-drop": {
14
+ "label": "Файлы брошены на список"
15
+ }
16
+ },
17
+ "runtime": {
18
+ "cancel": "Отмена",
19
+ "close-notice-label": "Закрыть сообщение",
20
+ "confirm-apply": "Подтвердить",
21
+ "confirm-title": "Подтвердите изменение",
22
+ "create-child-action": "Добавить вложенную",
23
+ "current-view-text": "Текущий",
24
+ "drop-files": "Отпустите, чтобы загрузить файлы сюда",
25
+ "empty-text": "Нет данных",
26
+ "layout-label": "Представление данных",
27
+ "move-action": "Переместить…",
28
+ "move-apply": "Переместить",
29
+ "move-first": "Первым",
30
+ "move-last": "Последним",
31
+ "move-no-targets": "Эту запись некуда переместить.",
32
+ "move-place": "Место",
33
+ "move-root": "На верхний уровень",
34
+ "move-title": "Переместить «{label}»",
35
+ "notice-action-not-allowed": "Это действие недоступно для выбранной записи.",
36
+ "notice-capability-not-provided": "Хост не поддерживает это действие.",
37
+ "notice-confirm-required": "Действие нужно сначала подтвердить.",
38
+ "notice-conflict": "Данные изменились. Обновите представление и повторите действие.",
39
+ "notice-failed": "Действие не выполнено.",
40
+ "notice-fetch-failed": "Не удалось получить данные. Повторите попытку.",
41
+ "notice-forbidden": "Недостаточно прав для этого действия.",
42
+ "notice-load-failed": "Не удалось загрузить данные.",
43
+ "notice-no-base-revision": "Настройки пока нельзя сохранить: у представления нет их текущей версии. Обновите представление.",
44
+ "notice-not-confirmed": "Действие отменено.",
45
+ "notice-port-not-connected": "Источник данных не подключён.",
46
+ "notice-record-invalid": "Запись не найдена.",
47
+ "notice-refused": "Действие отклонено.",
48
+ "notice-saved-view-levels": "Общие виды требуют более новой версии порта.",
49
+ "notice-stale-revision": "Данные успели изменить. Обновите представление и повторите действие.",
50
+ "notice-unavailable": "Действие недоступно.",
51
+ "of-total": "{shown} из {total}",
52
+ "records-label": "Записи",
53
+ "show-all": "Показать все",
54
+ "state-load-failed": "Не удалось загрузить данные",
55
+ "state-loading": "Загрузка данных",
56
+ "state-port-not-connected": "Порт данных не подключён",
57
+ "state-query-failed": "Запрос не выполнен",
58
+ "state-unavailable": "Данные временно недоступны",
59
+ "unnamed-action": "Действие"
60
+ }
61
+ }
Binary file
@@ -0,0 +1,165 @@
1
+ {
2
+ "component": "sf-view",
3
+ "probe": "sf-data-view against component.json (standard simai.smart-component 1.3.8 §12, gate 20)",
4
+ "format": "stands/15-scenarios (A4 modal: a page, probes in steps); the runner is the SIMAI Framework's tests/browser/manifest-probes.browser.mjs through tests/browser/package-manifest-probes.browser.mjs",
5
+ "page": {
6
+ "lang": "ru",
7
+ "body": [
8
+ "<main style=\"width: 1100px\">",
9
+ " <sf-view id=\"v\" aria-label=\"Решения\" collection=\"workbench.solutions\"></sf-view>",
10
+ "</main>"
11
+ ]
12
+ },
13
+ "probes": [
14
+ {
15
+ "id": "p1-values",
16
+ "title": "after the host's answer: state ready, total 3, three rows",
17
+ "covers": "values.state, values.total, port answers",
18
+ "steps": [
19
+ {
20
+ "script": "(() => { window.__calls = []; const records = [{id: '1', revision: '1', actions: ['view', 'delete'], title: 'Портал клиента'}, {id: '2', revision: '1', actions: ['view', 'delete'], title: 'Каталог товаров'}, {id: '3', revision: '1', actions: ['view'], title: 'Склад'}]; const port = {id: 'simai.dataview-port', version: '1.12.0', capabilities: ['row-actions'], raise: async (intent, payload) => { window.__calls.push(intent); if (intent === 'query.change') return {answer: 'applied', sequence: payload.sequence, data: {records: records.map((one) => ({...one})), columns: [{key: 'title', label: 'Название', role: 'title'}], total: records.length, has_next: false, echo: {page: 1, per_page: 25}}}; if (intent === 'record.open') return {answer: 'applied', record_id: payload.record_ids?.[0]}; if (intent === 'record.mutate') { const at = records.findIndex((one) => one.id === payload.record_ids[0]); if (at >= 0) records.splice(at, 1); return {answer: 'applied'}; } return {answer: 'unavailable', reason: 'capability-not-provided'}; } }; document.getElementById('v').setHostPort(port); return true; })()",
21
+ "wait": 1200,
22
+ "expect": {
23
+ "values": {
24
+ "#v.state": "ready",
25
+ "#v.total": 3
26
+ }
27
+ },
28
+ "check": "document.getElementById('v').table.querySelectorAll('tbody tr[data-row-id]').length === 3 && window.__calls[0] === 'query.change'"
29
+ }
30
+ ]
31
+ },
32
+ {
33
+ "id": "p2-open",
34
+ "title": "a record's title asks to open it: sf-data-view-open {id} once, then the host's record.open",
35
+ "covers": "events.open (vocabulary §5 open)",
36
+ "steps": [
37
+ {
38
+ "script": "(() => { window.__calls = []; const records = [{id: '1', revision: '1', actions: ['view', 'delete'], title: 'Портал клиента'}, {id: '2', revision: '1', actions: ['view', 'delete'], title: 'Каталог товаров'}, {id: '3', revision: '1', actions: ['view'], title: 'Склад'}]; const port = {id: 'simai.dataview-port', version: '1.12.0', capabilities: ['row-actions'], raise: async (intent, payload) => { window.__calls.push(intent); if (intent === 'query.change') return {answer: 'applied', sequence: payload.sequence, data: {records: records.map((one) => ({...one})), columns: [{key: 'title', label: 'Название', role: 'title'}], total: records.length, has_next: false, echo: {page: 1, per_page: 25}}}; if (intent === 'record.open') return {answer: 'applied', record_id: payload.record_ids?.[0]}; if (intent === 'record.mutate') { const at = records.findIndex((one) => one.id === payload.record_ids[0]); if (at >= 0) records.splice(at, 1); return {answer: 'applied'}; } return {answer: 'unavailable', reason: 'capability-not-provided'}; } }; document.getElementById('v').setHostPort(port); return true; })()",
39
+ "wait": 1200
40
+ },
41
+ {
42
+ "wait": 500,
43
+ "expect": {
44
+ "events": [
45
+ {
46
+ "name": "sf-view-open",
47
+ "count": 1,
48
+ "detail": {
49
+ "id": "2"
50
+ }
51
+ }
52
+ ]
53
+ },
54
+ "check": "window.__calls.includes('record.open')",
55
+ "script": "(document.getElementById('v').table.querySelector('tbody tr[data-row-id=\"2\"] a.sf-table-title-link').click(), true)"
56
+ }
57
+ ]
58
+ },
59
+ {
60
+ "id": "p3-open-refused",
61
+ "title": "a listener that refuses sf-data-view-open keeps the host out of it",
62
+ "covers": "events.open cancelable (§8)",
63
+ "steps": [
64
+ {
65
+ "script": "(() => { window.__calls = []; const records = [{id: '1', revision: '1', actions: ['view', 'delete'], title: 'Портал клиента'}, {id: '2', revision: '1', actions: ['view', 'delete'], title: 'Каталог товаров'}, {id: '3', revision: '1', actions: ['view'], title: 'Склад'}]; const port = {id: 'simai.dataview-port', version: '1.12.0', capabilities: ['row-actions'], raise: async (intent, payload) => { window.__calls.push(intent); if (intent === 'query.change') return {answer: 'applied', sequence: payload.sequence, data: {records: records.map((one) => ({...one})), columns: [{key: 'title', label: 'Название', role: 'title'}], total: records.length, has_next: false, echo: {page: 1, per_page: 25}}}; if (intent === 'record.open') return {answer: 'applied', record_id: payload.record_ids?.[0]}; if (intent === 'record.mutate') { const at = records.findIndex((one) => one.id === payload.record_ids[0]); if (at >= 0) records.splice(at, 1); return {answer: 'applied'}; } return {answer: 'unavailable', reason: 'capability-not-provided'}; } }; document.getElementById('v').setHostPort(port); return true; })()",
66
+ "wait": 1200
67
+ },
68
+ {
69
+ "script": "(document.getElementById('v').addEventListener('sf-view-open', (event) => event.preventDefault()), true)",
70
+ "wait": 50
71
+ },
72
+ {
73
+ "wait": 500,
74
+ "expect": {
75
+ "events": [
76
+ {
77
+ "name": "sf-view-open",
78
+ "count": 1,
79
+ "detail": {
80
+ "id": "1"
81
+ }
82
+ }
83
+ ]
84
+ },
85
+ "check": "!window.__calls.includes('record.open')",
86
+ "script": "(document.getElementById('v').table.querySelector('tbody tr[data-row-id=\"1\"] a.sf-table-title-link').click(), true)"
87
+ }
88
+ ]
89
+ },
90
+ {
91
+ "id": "p4-deleted",
92
+ "title": "an applied delete is the fact sf-data-view-deleted {ids}",
93
+ "covers": "events.deleted",
94
+ "steps": [
95
+ {
96
+ "script": "(() => { window.__calls = []; const records = [{id: '1', revision: '1', actions: ['view', 'delete'], title: 'Портал клиента'}, {id: '2', revision: '1', actions: ['view', 'delete'], title: 'Каталог товаров'}, {id: '3', revision: '1', actions: ['view'], title: 'Склад'}]; const port = {id: 'simai.dataview-port', version: '1.12.0', capabilities: ['row-actions'], raise: async (intent, payload) => { window.__calls.push(intent); if (intent === 'query.change') return {answer: 'applied', sequence: payload.sequence, data: {records: records.map((one) => ({...one})), columns: [{key: 'title', label: 'Название', role: 'title'}], total: records.length, has_next: false, echo: {page: 1, per_page: 25}}}; if (intent === 'record.open') return {answer: 'applied', record_id: payload.record_ids?.[0]}; if (intent === 'record.mutate') { const at = records.findIndex((one) => one.id === payload.record_ids[0]); if (at >= 0) records.splice(at, 1); return {answer: 'applied'}; } return {answer: 'unavailable', reason: 'capability-not-provided'}; } }; document.getElementById('v').setHostPort(port); return true; })()",
97
+ "wait": 1200
98
+ },
99
+ {
100
+ "script": "(document.getElementById('v').table.requestActionIntent('delete', ['1']), true)",
101
+ "wait": 900,
102
+ "expect": {
103
+ "events": [
104
+ {
105
+ "name": "sf-view-deleted",
106
+ "count": 1,
107
+ "detail": {
108
+ "ids": [
109
+ "1"
110
+ ]
111
+ }
112
+ }
113
+ ]
114
+ },
115
+ "check": "window.__calls.includes('record.mutate')"
116
+ }
117
+ ]
118
+ },
119
+ {
120
+ "id": "p5-current",
121
+ "title": "current marks the open record's row, and selected reads it",
122
+ "covers": "settings.current, values.selected",
123
+ "steps": [
124
+ {
125
+ "script": "(() => { window.__calls = []; const records = [{id: '1', revision: '1', actions: ['view', 'delete'], title: 'Портал клиента'}, {id: '2', revision: '1', actions: ['view', 'delete'], title: 'Каталог товаров'}, {id: '3', revision: '1', actions: ['view'], title: 'Склад'}]; const port = {id: 'simai.dataview-port', version: '1.12.0', capabilities: ['row-actions'], raise: async (intent, payload) => { window.__calls.push(intent); if (intent === 'query.change') return {answer: 'applied', sequence: payload.sequence, data: {records: records.map((one) => ({...one})), columns: [{key: 'title', label: 'Название', role: 'title'}], total: records.length, has_next: false, echo: {page: 1, per_page: 25}}}; if (intent === 'record.open') return {answer: 'applied', record_id: payload.record_ids?.[0]}; if (intent === 'record.mutate') { const at = records.findIndex((one) => one.id === payload.record_ids[0]); if (at >= 0) records.splice(at, 1); return {answer: 'applied'}; } return {answer: 'unavailable', reason: 'capability-not-provided'}; } }; document.getElementById('v').setHostPort(port); return true; })()",
126
+ "wait": 1200
127
+ },
128
+ {
129
+ "script": "(document.getElementById('v').current = '3', true)",
130
+ "wait": 400,
131
+ "expect": {
132
+ "values": {
133
+ "#v.selected": "3"
134
+ }
135
+ },
136
+ "check": "document.getElementById('v').table.querySelector('tbody tr[data-row-id=\"3\"]').getAttribute('aria-current') === 'true'"
137
+ }
138
+ ]
139
+ },
140
+ {
141
+ "id": "p6-refresh",
142
+ "title": "refresh answers an outcome and reads the list again",
143
+ "covers": "actions.refresh (§4.4)",
144
+ "steps": [
145
+ {
146
+ "script": "(() => { window.__calls = []; const records = [{id: '1', revision: '1', actions: ['view', 'delete'], title: 'Портал клиента'}, {id: '2', revision: '1', actions: ['view', 'delete'], title: 'Каталог товаров'}, {id: '3', revision: '1', actions: ['view'], title: 'Склад'}]; const port = {id: 'simai.dataview-port', version: '1.12.0', capabilities: ['row-actions'], raise: async (intent, payload) => { window.__calls.push(intent); if (intent === 'query.change') return {answer: 'applied', sequence: payload.sequence, data: {records: records.map((one) => ({...one})), columns: [{key: 'title', label: 'Название', role: 'title'}], total: records.length, has_next: false, echo: {page: 1, per_page: 25}}}; if (intent === 'record.open') return {answer: 'applied', record_id: payload.record_ids?.[0]}; if (intent === 'record.mutate') { const at = records.findIndex((one) => one.id === payload.record_ids[0]); if (at >= 0) records.splice(at, 1); return {answer: 'applied'}; } return {answer: 'unavailable', reason: 'capability-not-provided'}; } }; document.getElementById('v').setHostPort(port); return true; })()",
147
+ "wait": 1200
148
+ },
149
+ {
150
+ "action": {
151
+ "name": "refresh"
152
+ },
153
+ "target": "#v",
154
+ "wait": 600,
155
+ "expect": {
156
+ "returns": {
157
+ "outcome": "applied"
158
+ }
159
+ },
160
+ "check": "window.__calls.filter((one) => one === 'query.change').length === 2"
161
+ }
162
+ ]
163
+ }
164
+ ]
165
+ }
Binary file