From 8528648edfe4f655d3e8a06853d067a861114c99 Mon Sep 17 00:00:00 2001 From: David Bosschaert Date: Mon, 16 Dec 2024 12:36:49 +0000 Subject: [PATCH 01/15] Initial working changes --- blocks/edit/da-editor/da-editor.css | 4 +++ blocks/edit/da-editor/da-editor.js | 38 +++++++++++++++++++++++++++-- blocks/edit/da-title/da-title.css | 5 ++++ blocks/edit/prose/index.js | 4 ++- 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/blocks/edit/da-editor/da-editor.css b/blocks/edit/da-editor/da-editor.css index a707ecb0..e3f8ec6f 100644 --- a/blocks/edit/da-editor/da-editor.css +++ b/blocks/edit/da-editor/da-editor.css @@ -61,6 +61,10 @@ padding-top: 96px; } +.da-prose-mirror-readonly .ProseMirror { + background-color: lightgrey; +} + .ProseMirror { min-height: 600px; background: #FFF; diff --git a/blocks/edit/da-editor/da-editor.js b/blocks/edit/da-editor/da-editor.js index 3e7de9b9..1fbd7f4e 100644 --- a/blocks/edit/da-editor/da-editor.js +++ b/blocks/edit/da-editor/da-editor.js @@ -88,13 +88,47 @@ export default class DaEditor extends LitElement { `; } - updated(props) { + async getPermissions() { + const resp = await daFetch(this.path, { method: 'HEAD' }); + + const pragma = resp.headers.get('Pragma'); + const idx = pragma.indexOf('X-da-actions '); + if (idx === -1) return []; + + const idx2 = pragma.indexOf(';', idx); + const daActions = pragma.substring(idx + 'X-da-actions '.length, idx2); + + // const daActions = resp.headers.get('X-da-actions'); + if (!daActions) return []; + const actions = daActions.split('='); + if (actions) { + return actions[1].split(','); + } + return []; + } + + async updated(props) { if (!this._imsLoaded) return; if (!(props.has('version') || props.has('_versionDom'))) { this.disconnectWebsocket(); const prose = this.shadowRoot.querySelector('.da-prose-mirror'); prose.innerHTML = ''; - this.wsProvider = initProse({ editor: prose, path: this.path }); + + const permissions = await this.getPermissions(); + this.wsProvider = initProse({ editor: prose, path: this.path, permissions }); + + const titleEl = this.ownerDocument.querySelector('da-title')?.shadowRoot?.querySelector('.da-title-inner'); + const verBtn = this.parentElement.querySelector('button.show-versions'); + + titleEl.classList.remove('da-title-readonly'); + prose.classList.remove('da-prose-mirror-readonly'); + prose.querySelector('.ProseMirror')?.setAttribute('contenteditable', permissions.includes('write')); + verBtn.removeAttribute('disabled'); + if (!permissions.includes('write')) { + titleEl.classList.add('da-title-readonly'); + prose.classList.add('da-prose-mirror-readonly'); + verBtn.setAttribute('disabled', ''); + } } } } diff --git a/blocks/edit/da-title/da-title.css b/blocks/edit/da-title/da-title.css index 6858c96d..600958b1 100644 --- a/blocks/edit/da-title/da-title.css +++ b/blocks/edit/da-title/da-title.css @@ -39,6 +39,11 @@ h1 { align-items: end; } +.da-title-readonly h1::after { + content: ' 🔒'; + font-size: 0.8em; +} + .da-title-name-label { display: inline-block; position: relative; diff --git a/blocks/edit/prose/index.js b/blocks/edit/prose/index.js index 5d23846e..6dc47a06 100644 --- a/blocks/edit/prose/index.js +++ b/blocks/edit/prose/index.js @@ -160,10 +160,12 @@ function restoreCursorPosition(view) { } } -export default function initProse({ editor, path }) { +export default function initProse({ editor, path, permissions }) { // Destroy ProseMirror if it already exists - GH-212 if (window.view) delete window.view; + if (!permissions.includes('read')) return undefined; + const schema = getSchema(); const ydoc = new Y.Doc(); From 860d9003fec5073f2d02db946684bdf13147b882 Mon Sep 17 00:00:00 2001 From: David Bosschaert Date: Mon, 16 Dec 2024 13:39:53 +0000 Subject: [PATCH 02/15] Use X-da-actions header --- blocks/edit/da-editor/da-editor.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/blocks/edit/da-editor/da-editor.js b/blocks/edit/da-editor/da-editor.js index 1fbd7f4e..b189ba93 100644 --- a/blocks/edit/da-editor/da-editor.js +++ b/blocks/edit/da-editor/da-editor.js @@ -91,14 +91,7 @@ export default class DaEditor extends LitElement { async getPermissions() { const resp = await daFetch(this.path, { method: 'HEAD' }); - const pragma = resp.headers.get('Pragma'); - const idx = pragma.indexOf('X-da-actions '); - if (idx === -1) return []; - - const idx2 = pragma.indexOf(';', idx); - const daActions = pragma.substring(idx + 'X-da-actions '.length, idx2); - - // const daActions = resp.headers.get('X-da-actions'); + const daActions = resp.headers.get('X-da-actions'); if (!daActions) return []; const actions = daActions.split('='); if (actions) { From 56f55cc963400777ab19bbb376fd827c3f7a2c46 Mon Sep 17 00:00:00 2001 From: David Bosschaert Date: Tue, 17 Dec 2024 10:59:55 +0000 Subject: [PATCH 03/15] Render directories with no access as empty ones --- blocks/browse/da-list/da-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/browse/da-list/da-list.js b/blocks/browse/da-list/da-list.js index ef4ebeb6..c01f4997 100644 --- a/blocks/browse/da-list/da-list.js +++ b/blocks/browse/da-list/da-list.js @@ -70,7 +70,7 @@ export default class DaList extends LitElement { async getList() { const resp = await daFetch(`${DA_ORIGIN}/list${this.fullpath}`); - if (!resp.ok) return null; + if (!resp.ok) return []; return resp.json(); } From ad0e0a42d67fe6090313490a1ecee63141b9229b Mon Sep 17 00:00:00 2001 From: David Bosschaert Date: Tue, 17 Dec 2024 15:32:39 +0000 Subject: [PATCH 04/15] Handle the case where paste fails because of ACL --- blocks/browse/da-list/da-list.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/blocks/browse/da-list/da-list.js b/blocks/browse/da-list/da-list.js index c01f4997..b2a77252 100644 --- a/blocks/browse/da-list/da-list.js +++ b/blocks/browse/da-list/da-list.js @@ -114,6 +114,12 @@ export default class DaList extends LitElement { this.requestUpdate(); } + wait(milliseconds) { + return new Promise((r) => { + setTimeout(r, milliseconds); + }); + } + async handlePasteItem(item) { let continuation = true; let continuationToken; @@ -127,6 +133,13 @@ export default class DaList extends LitElement { if (resp.status === 204) { continuation = false; break; + } else if (resp.status >= 400) { + this.setStatus('Copying', 'There was an issue copying.'); + + // TODO maybe there is a better way to keep the status dialog visible for a bit? + await this.wait(2000); + + return; } const json = await resp.json(); ({ continuationToken } = json); From 4961ce61e638d4477ecda83d676d3288e7c80999 Mon Sep 17 00:00:00 2001 From: Chris Millar Date: Wed, 18 Dec 2024 11:01:32 -0700 Subject: [PATCH 05/15] Updating scopes for org info --- scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/scripts.js b/scripts/scripts.js index 8f220dfa..21642744 100644 --- a/scripts/scripts.js +++ b/scripts/scripts.js @@ -17,7 +17,7 @@ const STYLES = '/styles/styles.css'; const CONFIG = { codeBase, imsClientId: 'darkalley', - imsScope: 'ab.manage,additional_info.projectedProductContext,AdobeID,gnav,openid,org.read,read_organizations,session,aem.frontend.all', + imsScope: 'ab.manage,AdobeID,gnav,openid,org.read,read_organizations,session,aem.frontend.all,additional_info.ownerOrg', decorateArea, }; From ac9d015f2d3538ecd2a8f77689ea03d72cd547f4 Mon Sep 17 00:00:00 2001 From: David Bosschaert Date: Tue, 7 Jan 2025 16:01:30 +0000 Subject: [PATCH 06/15] Fix ommissions in Playwright tests for local running --- test/e2e/tests/delete.spec.js | 4 ++-- test/e2e/tests/edit.spec.js | 6 +++--- test/e2e/utils/page.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/e2e/tests/delete.spec.js b/test/e2e/tests/delete.spec.js index e1ff5fd6..f8546d3a 100644 --- a/test/e2e/tests/delete.spec.js +++ b/test/e2e/tests/delete.spec.js @@ -11,7 +11,7 @@ */ import { test, expect } from '@playwright/test'; import ENV from '../utils/env.js'; -import { getTestPageURL, getTestResourceAge } from '../utils/page.js'; +import { getQuery, getTestPageURL, getTestResourceAge } from '../utils/page.js'; // Files are deleted after 2 hours by default const MIN_HOURS = process.env.PW_DELETE_HOURS ? Number(process.env.PW_DELETE_HOURS) : 2; @@ -104,7 +104,7 @@ test('Empty out open editors on deleted documents', async ({ browser, page }, wo await page.close(); const list = await browser.newPage(); - await list.goto(`${ENV}/#/da-sites/da-status/tests`); + await list.goto(`${ENV}/${getQuery()}#/da-sites/da-status/tests`); await list.waitForTimeout(3000); await list.reload(); diff --git a/test/e2e/tests/edit.spec.js b/test/e2e/tests/edit.spec.js index d8369c4e..ed336a94 100644 --- a/test/e2e/tests/edit.spec.js +++ b/test/e2e/tests/edit.spec.js @@ -11,7 +11,7 @@ */ import { test, expect } from '@playwright/test'; import ENV from '../utils/env.js'; -import { getTestPageURL } from '../utils/page.js'; +import { getQuery, getTestPageURL } from '../utils/page.js'; test('Update Document', async ({ browser, page }, workerInfo) => { test.setTimeout(30000); @@ -40,7 +40,7 @@ test('Create Delete Document', async ({ browser, page }, workerInfo) => { const url = getTestPageURL('edit2', workerInfo); const pageName = url.split('/').pop(); - await page.goto(`${ENV}/#/da-sites/da-status/tests`); + await page.goto(`${ENV}/${getQuery()}#/da-sites/da-status/tests`); await page.locator('button.da-actions-new-button').click(); await page.locator('button:text("Document")').click(); await page.locator('input.da-actions-input').fill(pageName); @@ -51,7 +51,7 @@ test('Create Delete Document', async ({ browser, page }, workerInfo) => { await page.waitForTimeout(1000); const newPage = await browser.newPage(); - await newPage.goto(`${ENV}/#/da-sites/da-status/tests`); + await newPage.goto(`${ENV}/${getQuery()}#/da-sites/da-status/tests`); await newPage.waitForTimeout(3000); await newPage.reload(); diff --git a/test/e2e/utils/page.js b/test/e2e/utils/page.js index 5bfccca5..1bbceb9c 100644 --- a/test/e2e/utils/page.js +++ b/test/e2e/utils/page.js @@ -11,7 +11,7 @@ */ import ENV from './env.js'; -function getQuery() { +export function getQuery() { const { GITHUB_HEAD_REF: branch } = process.env; if (branch === 'local') { return '?da-admin=local&da-collab=local'; From b7c19237d3af1d3538c7b7aee42fc6df10594b40 Mon Sep 17 00:00:00 2001 From: David Bosschaert Date: Fri, 10 Jan 2025 14:49:01 +0000 Subject: [PATCH 07/15] Log any config save errors --- blocks/edit/da-title/da-title.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/blocks/edit/da-title/da-title.js b/blocks/edit/da-title/da-title.js index 10dd4288..d9ba4f78 100644 --- a/blocks/edit/da-title/da-title.js +++ b/blocks/edit/da-title/da-title.js @@ -64,7 +64,10 @@ export default class DaTitle extends LitElement { } if (this.details.view === 'config') { const daConfigResp = await saveDaConfig(pathname, this.sheet); - if (!daConfigResp.ok) return; + if (!daConfigResp.ok) { + console.log('Saving configuration failed because:', daConfigResp.status, await daConfigResp.text()); + return; + } } if (action === 'preview' || action === 'publish') { const aemPath = this.sheet ? `${pathname}.json` : pathname; From d45af0ad4116807d9a6fdbbb715daaff6988289c Mon Sep 17 00:00:00 2001 From: Chris Millar Date: Sat, 11 Jan 2025 21:38:46 -0700 Subject: [PATCH 08/15] ACL - Disable new in browse view --- blocks/browse/da-browse/da-browse.js | 9 +++++++++ blocks/browse/da-list/da-list.js | 8 ++++++++ blocks/browse/da-new/da-new.css | 9 +++++++++ blocks/browse/da-new/da-new.js | 10 ++++++++-- blocks/shared/utils.js | 1 + 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/blocks/browse/da-browse/da-browse.js b/blocks/browse/da-browse/da-browse.js index dca0f052..74504f51 100644 --- a/blocks/browse/da-browse/da-browse.js +++ b/blocks/browse/da-browse/da-browse.js @@ -39,6 +39,10 @@ export default class DaBrowse extends LitElement { this.shadowRoot.adoptedStyleSheets = [STYLE]; } + handlePermissions(e) { + if (this.newCmp) this.newCmp.permissions = e.detail; + } + handleTabClick(idx) { this._tabItems = this._tabItems.map((tab, tidx) => ({ ...tab, selected: idx === tidx })); } @@ -55,6 +59,10 @@ export default class DaBrowse extends LitElement { return this._tabItems.find((tab) => tab.selected).id; } + get newCmp() { + return this.shadowRoot.querySelector('da-new'); + } + renderNew() { return html``; } @@ -68,6 +76,7 @@ export default class DaBrowse extends LitElement { `; diff --git a/blocks/browse/da-list/da-list.js b/blocks/browse/da-list/da-list.js index fd60f266..cec4b173 100644 --- a/blocks/browse/da-list/da-list.js +++ b/blocks/browse/da-list/da-list.js @@ -51,6 +51,7 @@ export default class DaList extends LitElement { } if (props.has('fullpath') && this.fullpath) { + this.handlePermissions(null); this._listItems = await this.getList(); } @@ -69,9 +70,16 @@ export default class DaList extends LitElement { this._status = { type, text, description }; } + handlePermissions(permissions) { + const opts = { detail: permissions, bubbles: true, composed: true }; + const event = new CustomEvent('onpermissions', opts); + this.dispatchEvent(event); + } + async getList() { const resp = await daFetch(`${DA_ORIGIN}/list${this.fullpath}`); if (!resp.ok) return []; + if (resp.permissions) this.handlePermissions(resp.permissions); return resp.json(); } diff --git a/blocks/browse/da-new/da-new.css b/blocks/browse/da-new/da-new.css index eac5f7a8..be54e8f3 100644 --- a/blocks/browse/da-new/da-new.css +++ b/blocks/browse/da-new/da-new.css @@ -51,6 +51,15 @@ button { transition: outline-offset .2s; } +.da-actions-new-button:disabled { + color: var(--s2-gray-700); + background-color: transparent; + outline-color: var(--s2-gray-700); + border: 2px solid var(--s2-gray-700); + border-style: dotted; + cursor: not-allowed; +} + .da-actions-create.menu .da-actions-menu { display: grid; gap: 6px; diff --git a/blocks/browse/da-new/da-new.js b/blocks/browse/da-new/da-new.js index 0f6a8884..3ac4ebbb 100644 --- a/blocks/browse/da-new/da-new.js +++ b/blocks/browse/da-new/da-new.js @@ -1,4 +1,4 @@ -import { LitElement, html } from 'da-lit'; +import { LitElement, html, nothing } from 'da-lit'; import { saveToDa } from '../../shared/utils.js'; import { getNx } from '../../../scripts/utils.js'; import getEditPath from '../shared.js'; @@ -10,6 +10,7 @@ const STYLE = await getStyle(import.meta.url); export default class DaNew extends LitElement { static properties = { fullpath: { type: String }, + permissions: { attribute: false }, _createShow: { attribute: false }, _createType: { attribute: false }, _createFile: { attribute: false }, @@ -126,10 +127,15 @@ export default class DaNew extends LitElement { this._externalUrl = ''; } + get _disabled() { + if (!this.permissions) return true; + return !this.permissions.some((permission) => permission === 'write'); + } + render() { return html`
- + - + `; } } diff --git a/blocks/sheet/utils/index.js b/blocks/sheet/utils/index.js index fdff7c15..7932bcf6 100644 --- a/blocks/sheet/utils/index.js +++ b/blocks/sheet/utils/index.js @@ -6,7 +6,10 @@ import '../da-sheet-tabs.js'; const { loadStyle } = await import(`${getNx()}/scripts/nexter.js`); const loadScript = (await import(`${getNx()}/utils/script.js`)).default; -const SHEET_TEMPLATE = { minDimensions: [20, 20], sheetName: 'data' }; +const SHEET_TEMPLATE = { sheetName: 'data' }; + +let permissions; +let canWrite; function resetSheets(el) { document.querySelector('da-sheet-tabs')?.remove(); @@ -30,6 +33,7 @@ function finishSetup(el, data) { // Setup tabs const daSheetTabs = document.createElement('da-sheet-tabs'); + daSheetTabs.permissions = permissions; el.insertAdjacentElement('beforebegin', daSheetTabs); } @@ -50,23 +54,48 @@ function getSheetData(sheetData) { return [header, ...data]; } -const getColWidths = (colWidths, headers) => colWidths?.map((width) => ({ width: `${width}` })) - || headers.map(() => ({ width: '300' })); +const getColWidths = (colWidths, headers) => { + if (colWidths) { + return colWidths?.map((width) => { + const opts = { width: `${width}` }; + opts.readOnly = !canWrite; + return opts; + }); + } + return headers.map(() => { + const opts = { width: '300' }; + opts.readOnly = !canWrite; + return opts; + }); +}; function getSheet(json, sheetName) { const data = getSheetData(json.data); + const templ = canWrite ? { ...SHEET_TEMPLATE, minDimensions: [20, 20] } : SHEET_TEMPLATE; + return { - ...SHEET_TEMPLATE, + ...templ, sheetName, data, columns: getColWidths(json[':colWidths'], data[0]), }; } +export function getPermissions() { + return permissions; +} + export async function getData(url) { const resp = await daFetch(url); if (!resp.ok) return getDefaultSheet(); + // Set permissions + const daTitle = document.querySelector('da-title'); + if (daTitle) daTitle.permissions = resp.permissions; + + permissions = resp.permissions; + canWrite = resp.permissions.some((permission) => permission === 'write'); + const sheets = []; // Get base data diff --git a/blocks/sheet/utils/utils.js b/blocks/sheet/utils/utils.js index 51802e7d..2b3d011f 100644 --- a/blocks/sheet/utils/utils.js +++ b/blocks/sheet/utils/utils.js @@ -11,6 +11,7 @@ function debounce(func, wait) { } export const saveSheets = async (sheets) => { + const daTitle = document.querySelector('da-title'); document.querySelector('da-sheet-panes').data = convertSheets(sheets); const { hash } = window.location; diff --git a/deps/jspreadsheet-ce/dist/jspreadsheet.css b/deps/jspreadsheet-ce/dist/jspreadsheet.css index d4a1a227..3ae87a4f 100644 --- a/deps/jspreadsheet-ce/dist/jspreadsheet.css +++ b/deps/jspreadsheet-ce/dist/jspreadsheet.css @@ -1,761 +1,761 @@ -:root { - --jexcel-border-color:#000; -} - -.jexcel_container { - display:inline-block; - padding-right:2px; - box-sizing: border-box; - overscroll-behavior: contain; - outline: none; -} - -.jexcel_container.fullscreen { - position:fixed; - top:0px; - left:0px; - width:100%; - height:100%; - z-index:21; -} - -.jexcel_container.fullscreen .jexcel_content { - overflow:auto; - width:100%; - height:100%; - background-color:#ffffff; -} - -.jexcel_container.with-toolbar .jexcel > thead > tr > td { - top: 0; -} - -.jexcel_container.fullscreen.with-toolbar { - height: calc(100% - 46px); -} - -.jexcel_content { - display:inline-block; - box-sizing: border-box; - padding-right:3px; - padding-bottom:3px; - position:relative; - scrollbar-width: thin; - scrollbar-color: #666 transparent; -} - -@supports (-moz-appearance:none) { - .jexcel_content { padding-right:10px; } -} - -.jexcel_content::-webkit-scrollbar { - width: 8px; - height: 8px; -} - -.jexcel_content::-webkit-scrollbar-track { - background: #eee; -} - -.jexcel_content::-webkit-scrollbar-thumb { - background: #666; -} - -.jexcel { - border-collapse: separate; - table-layout: fixed; - white-space: nowrap; - empty-cells: show; - border: 0px; - background-color: #fff; - width: 0; - - border-top: 1px solid transparent; - border-left: 1px solid transparent; - border-right: 1px solid #ccc; - border-bottom: 1px solid #ccc; -} - -.jexcel > thead > tr > td -{ - border-top: 1px solid #ccc; - border-left: 1px solid #ccc; - border-right: 1px solid transparent; - border-bottom: 1px solid transparent; - background-color: #f3f3f3; - padding: 2px; - cursor: pointer; - box-sizing: border-box; - overflow: hidden; - position: -webkit-sticky; - position: sticky; - top: 0; - z-index:2; -} - -.jexcel_container.with-toolbar .jexcel > thead > tr > td -{ - top:42px; -} - -.jexcel > thead > tr > td.dragging -{ - background-color:#fff; - opacity:0.5; -} - -.jexcel > thead > tr > td.selected -{ - background-color:#dcdcdc; -} - -.jexcel > thead > tr > td.arrow-up -{ - background-repeat:no-repeat; - background-position:center right 5px; - background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 14l5-5 5 5H7z' fill='gray'/%3E%3C/svg%3E"); - text-decoration:underline; -} - -.jexcel > thead > tr > td.arrow-down -{ - background-repeat:no-repeat; - background-position:center right 5px; - background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 10l5 5 5-5H7z' fill='gray'/%3E%3C/svg%3E"); - text-decoration:underline; -} - -.jexcel > tbody > tr > td:first-child -{ - position:relative; - background-color:#f3f3f3; - text-align:center; -} - -.jexcel > tbody.resizable > tr > td:first-child::before -{ - content:'\00a0'; - width:100%; - height:3px; - position:absolute; - bottom:0px; - left:0px; - cursor:row-resize; -} - -.jexcel > tbody.draggable > tr > td:first-child::after -{ - content:'\00a0'; - width:3px; - height:100%; - position:absolute; - top:0px; - right:0px; - cursor:move; -} - -.jexcel > tbody > tr.dragging > td -{ - background-color:#eee; - opacity:0.5; -} - -.jexcel > tbody > tr > td -{ - border-top:1px solid #ccc; - border-left:1px solid #ccc; - border-right:1px solid transparent; - border-bottom:1px solid transparent; - padding:4px; - white-space: nowrap; - box-sizing: border-box; - line-height:1em; -} - -.jexcel_overflow > tbody > tr > td { - overflow: hidden; -} - -.jexcel > tbody > tr > td:last-child -{ - overflow: hidden; -} - -.jexcel > tbody > tr > td > img -{ - display:inline-block; - max-width:100px; -} - -.jexcel > tbody > tr > td.readonly -{ - color:rgba(0,0,0,0.3) -} -.jexcel > tbody > tr.selected > td:first-child -{ - background-color:#dcdcdc; -} -.jexcel > tbody > tr > td > select, -.jexcel > tbody > tr > td > input, -.jexcel > tbody > tr > td > textarea -{ - border:0px; - border-radius:0px; - outline:0px; - width:100%; - margin:0px; - padding:0px; - padding-right:2px; - background-color:transparent; - box-sizing: border-box; -} - -.jexcel > tbody > tr > td > textarea -{ - resize: none; - padding-top:6px !important; -} - -.jexcel > tbody > tr > td > input[type=checkbox] -{ - width:12px; - margin-top:2px; -} -.jexcel > tbody > tr > td > input[type=radio] -{ - width:12px; - margin-top:2px; -} - -.jexcel > tbody > tr > td > select -{ - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background-repeat: no-repeat; - background-position-x: 100%; - background-position-y: 40%; - background-image: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSdibGFjaycgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyB3aWR0aD0nMjQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nTTcgMTBsNSA1IDUtNXonLz48cGF0aCBkPSdNMCAwaDI0djI0SDB6JyBmaWxsPSdub25lJy8+PC9zdmc+); -} - -.jexcel > tbody > tr > td.jexcel_dropdown -{ - background-repeat: no-repeat; - background-position:top 50% right 5px; - background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 10l5 5 5-5H7z' fill='lightgray'/%3E%3C/svg%3E"); - text-overflow: ellipsis; - overflow-x:hidden; -} - -.jexcel > tbody > tr > td.jexcel_dropdown.jexcel_comments -{ - background:url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 10l5 5 5-5H7z' fill='lightgray'/%3E%3C/svg%3E") top 50% right 5px no-repeat, url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFuGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTAxLTMxVDE4OjU1OjA4WiIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wMS0zMVQxODo1NTowOFoiIHhtcDpNb2RpZnlEYXRlPSIyMDE5LTAxLTMxVDE4OjU1OjA4WiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDphMTlhZDJmOC1kMDI2LTI1NDItODhjOS1iZTRkYjkyMmQ0MmQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpkOGI5NDUyMS00ZjEwLWQ5NDktYjUwNC0wZmU1N2I3Nzk1MDEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplMzdjYmE1ZS1hYTMwLWNkNDUtYTAyNS1lOWYxZjk2MzUzOGUiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplMzdjYmE1ZS1hYTMwLWNkNDUtYTAyNS1lOWYxZjk2MzUzOGUiIHN0RXZ0OndoZW49IjIwMTktMDEtMzFUMTg6NTU6MDhaIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmExOWFkMmY4LWQwMjYtMjU0Mi04OGM5LWJlNGRiOTIyZDQyZCIgc3RFdnQ6d2hlbj0iMjAxOS0wMS0zMVQxODo1NTowOFoiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4En6MDAAAAX0lEQVQYlX3KOw6AIBBAwS32RpJADXfx0pTET+ERZJ8F8RODFtONsG0QAoh0CSDM82dqodaBdQXnfoLZQM7gPai+wjNNE8R4pTuAYNZSKZASqL7CMy0LxNgJp30fKYUDi3+vIqb/+rUAAAAASUVORK5CYII=') top right no-repeat; -} - -.jexcel > tbody > tr > td > .color -{ - width:90%; - height:10px; - margin:auto; -} - -.jexcel > tbody > tr > td > a { - text-decoration: underline; -} - -.jexcel > tbody > tr > td.highlight > a { - color: blue; - cursor: pointer; -} - -.jexcel > tfoot > tr > td -{ - border-top: 1px solid #ccc; - border-left: 1px solid #ccc; - border-right: 1px solid transparent; - border-bottom: 1px solid transparent; - background-color: #f3f3f3; - padding: 2px; - cursor: pointer; - box-sizing: border-box; - overflow: hidden; -} - -.jexcel .highlight { - background-color:rgba(0,0,0,0.05); -} - -.jexcel .highlight-top { - border-top:1px solid #000; /* var(--jexcel-border-color);*/ - box-shadow: 0px -1px #ccc; -} - -.jexcel .highlight-left { - border-left:1px solid #000; /* var(--jexcel-border-color);*/ - box-shadow: -1px 0px #ccc; -} - -.jexcel .highlight-right { - border-right:1px solid #000; /* var(--jexcel-border-color);*/ -} - -.jexcel .highlight-bottom { - border-bottom:1px solid #000; /* var(--jexcel-border-color);*/ -} - -.jexcel .highlight-top.highlight-left { - box-shadow: -1px -1px #ccc; - -webkit-box-shadow: -1px -1px #ccc; - -moz-box-shadow: -1px -1px #ccc; -} - -.jexcel .highlight-selected -{ - background-color:rgba(0,0,0,0.0); -} -.jexcel .selection -{ - background-color:rgba(0,0,0,0.05); -} -.jexcel .selection-left -{ - border-left:1px dotted #000; -} -.jexcel .selection-right -{ - border-right:1px dotted #000; -} -.jexcel .selection-top -{ - border-top:1px dotted #000; -} -.jexcel .selection-bottom -{ - border-bottom:1px dotted #000; -} -.jexcel_corner -{ - position:absolute; - background-color: rgb(0, 0, 0); - height: 1px; - width: 1px; - border: 1px solid rgb(255, 255, 255); - top:-2000px; - left:-2000px; - cursor:crosshair; - box-sizing: initial; - z-index:20; - padding: 2px; -} - -.jexcel .editor -{ - outline:0px solid transparent; - overflow:visible; - white-space: nowrap; - text-align:left; - padding:0px; - box-sizing: border-box; - overflow:visible !important; -} - -.jexcel .editor > input -{ - padding-left:4px; -} - -.jexcel .editor .jupload -{ - position:fixed; - top:100%; - z-index:40; - user-select:none; - -webkit-font-smoothing: antialiased; - font-size: .875rem; - letter-spacing: .2px; - -webkit-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 8px 10px 1px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); - box-shadow: 0 8px 10px 1px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); - padding:10px; - background-color:#fff; - width:300px; - min-height:225px; - margin-top:2px; -} - -.jexcel .editor .jupload img -{ - width:100%; - height:auto; -} - -.jexcel .editor .jexcel_richtext -{ - position:fixed; - top:100%; - z-index:40; - user-select:none; - -webkit-font-smoothing: antialiased; - font-size: .875rem; - letter-spacing: .2px; - -webkit-box-shadow: 0 8px 10px 1px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); - box-shadow: 0 8px 10px 1px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); - padding:10px; - background-color:#fff; - min-width:280px; - max-width:310px; - margin-top:2px; - text-align:left; -} - -.jexcel .editor .jclose:after -{ - position:absolute; - top:0; - right:0; - margin:10px; - content:'close'; - font-family:'Material icons'; - font-size:24px; - width:24px; - height:24px; - line-height:24px; - cursor:pointer; - text-shadow: 0px 0px 5px #fff; -} - -.jexcel, .jexcel td, .jexcel_corner -{ - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-user-drag: none; - -khtml-user-drag: none; - -moz-user-drag: none; - -o-user-drag: none; - user-drag: none; -} - -.jexcel_textarea -{ - position:absolute; - top:-999px; - left:-999px; - width:1px; - height:1px; -} -.jexcel .dragline -{ - position:absolute; -} -.jexcel .dragline div -{ - position:relative; - top:-6px; - height:5px; - width:22px; -} -.jexcel .dragline div:hover -{ - cursor:move; -} - -.jexcel .onDrag -{ - background-color:rgba(0,0,0,0.6); -} - -.jexcel .error -{ - border:1px solid red; -} - -.jexcel thead td.resizing -{ - border-right-style:dotted !important; - border-right-color:red !important; -} - -.jexcel tbody tr.resizing > td -{ - border-bottom-style:dotted !important; - border-bottom-color:red !important; -} - -.jexcel tbody td.resizing -{ - border-right-style:dotted !important; - border-right-color:red !important; -} - -.jexcel .jdropdown-header -{ - border:0px !important; - outline:none !important; - width:100% !important; - height:100% !important; - padding:0px !important; - padding-left:8px !important; -} - -.jexcel .jdropdown-container -{ - margin-top:1px; -} - -.jexcel .jdropdown-container-header { - padding: 0px; - margin: 0px; - height: inherit; -} - -.jexcel .jdropdown-picker -{ - border:0px !important; - padding:0px !important; - width:inherit; - height:inherit; -} - -.jexcel .jexcel_comments -{ - background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFuGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTAxLTMxVDE4OjU1OjA4WiIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wMS0zMVQxODo1NTowOFoiIHhtcDpNb2RpZnlEYXRlPSIyMDE5LTAxLTMxVDE4OjU1OjA4WiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDphMTlhZDJmOC1kMDI2LTI1NDItODhjOS1iZTRkYjkyMmQ0MmQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpkOGI5NDUyMS00ZjEwLWQ5NDktYjUwNC0wZmU1N2I3Nzk1MDEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplMzdjYmE1ZS1hYTMwLWNkNDUtYTAyNS1lOWYxZjk2MzUzOGUiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplMzdjYmE1ZS1hYTMwLWNkNDUtYTAyNS1lOWYxZjk2MzUzOGUiIHN0RXZ0OndoZW49IjIwMTktMDEtMzFUMTg6NTU6MDhaIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmExOWFkMmY4LWQwMjYtMjU0Mi04OGM5LWJlNGRiOTIyZDQyZCIgc3RFdnQ6d2hlbj0iMjAxOS0wMS0zMVQxODo1NTowOFoiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4En6MDAAAAX0lEQVQYlX3KOw6AIBBAwS32RpJADXfx0pTET+ERZJ8F8RODFtONsG0QAoh0CSDM82dqodaBdQXnfoLZQM7gPai+wjNNE8R4pTuAYNZSKZASqL7CMy0LxNgJp30fKYUDi3+vIqb/+rUAAAAASUVORK5CYII='); - background-repeat: no-repeat; - background-position: top right; -} - -.jexcel .sp-replacer -{ - margin: 2px; - border:0px; -} - -.jexcel > thead > tr.jexcel_filter > td > input -{ - border:0px; - width:100%; - outline:none; -} - -.jexcel_about { - float: right; - font-size: 0.7em; - padding: 2px; - text-transform: uppercase; - letter-spacing: 1px; - display: none; -} -.jexcel_about a { - color: #ccc; - text-decoration: none; -} - -.jexcel_about img { - display: none; -} - -.jexcel_filter -{ - display:flex; - justify-content:space-between; - margin-bottom:4px; -} - -.jexcel_filter > div -{ - padding:8px; - align-items:center; -} - -.jexcel_pagination -{ - display:flex; - justify-content:space-between; - align-items:center; -} - -.jexcel_pagination > div -{ - display:flex; - padding:10px; -} - -.jexcel_pagination > div:last-child -{ - padding-right:10px; - padding-top:10px; -} - -.jexcel_pagination > div > div -{ - text-align:center; - width:36px; - height:36px; - line-height:34px; - border:1px solid #ccc; - box-sizing: border-box; - margin-left:2px; - cursor:pointer; -} - -.jexcel_page -{ - font-size:0.8em; -} - -.jexcel_page_selected -{ - font-weight:bold; - background-color:#f3f3f3; -} - -.jexcel_toolbar -{ - display:flex; - background-color:#f3f3f3; - border:1px solid #ccc; - padding:4px; - margin:0px 2px 4px 1px; - position:sticky; - top:0px; - z-index:21; -} - -.jexcel_toolbar:empty -{ - display:none; -} - -.jexcel_toolbar i.jexcel_toolbar_item -{ - width:24px; - height:24px; - padding:4px; - cursor:pointer; - display:inline-block; -} - -.jexcel_toolbar i.jexcel_toolbar_item:hover -{ - background-color:#ddd; -} - -.jexcel_toolbar select.jexcel_toolbar_item -{ - margin-left:2px; - margin-right:2px; - display:inline-block; - border:0px; - background-color:transparent; - padding-right:10px; -} - -.jexcel .dragging-left -{ - background-repeat: no-repeat; - background-position:top 50% left 0px; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M14 7l-5 5 5 5V7z'/%3E%3Cpath fill='none' d='M24 0v24H0V0h24z'/%3E%3C/svg%3E"); -} - -.jexcel .dragging-right -{ - background-repeat: no-repeat; - background-position:top 50% right 0px; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M10 17l5-5-5-5v10z'/%3E%3Cpath fill='none' d='M0 24V0h24v24H0z'/%3E%3C/svg%3E"); -} - -.jexcel_tabs .jexcel_tab -{ - display:none; -} - -.jexcel_tabs .jexcel_tab_link -{ - display:inline-block; - padding:10px; - padding-left:20px; - padding-right:20px; - margin-right:5px; - margin-bottom:5px; - background-color:#f3f3f3; - cursor:pointer; -} - -.jexcel_tabs .jexcel_tab_link.selected -{ - background-color:#ddd; -} - -.jexcel_hidden_index > tbody > tr > td:first-child, -.jexcel_hidden_index > thead > tr > td:first-child, -.jexcel_hidden_index > tfoot > tr > td:first-child, -.jexcel_hidden_index > colgroup > col:first-child -{ - display:none; -} - - - -.jexcel .jrating { - display: inline-flex; -} -.jexcel .jrating > div { - zoom: 0.55; -} - -.jexcel .copying-top { - border-top:1px dashed #000; -} - -.jexcel .copying-left { - border-left:1px dashed #000; -} - -.jexcel .copying-right { - border-right:1px dashed #000; -} - -.jexcel .copying-bottom { - border-bottom:1px dashed #000; -} - -.jexcel .jexcel_column_filter { - background-repeat: no-repeat; - background-position: top 50% right 5px; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='gray' width='18px' height='18px'%3E%3Cpath d='M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); - text-overflow: ellipsis; - overflow: hidden; - padding: 0px; - padding-left: 6px; - padding-right: 20px; -} - -.jexcel thead .jexcel_freezed, .jexcel tfoot .jexcel_freezed { - left: 0px; - z-index: 3 !important; - box-shadow: 2px 0px 2px 0.2px #ccc !important; - -webkit-box-shadow: 2px 0px 2px 0.2px #ccc !important; - -moz-box-shadow: 2px 0px 2px 0.2px #ccc !important; -} - -.jexcel tbody .jexcel_freezed { - position: relative; - background-color: #fff; - box-shadow: 1px 1px 1px 1px #ccc !important; - -webkit-box-shadow: 2px 4px 4px 0.1px #ccc !important; - -moz-box-shadow: 2px 4px 4px 0.1px #ccc !important; -} - -.red { - color: red; -} - -.jexcel > tbody > tr > td.readonly > input[type=checkbox], -.jexcel > tbody > tr > td.readonly > input[type=radio] { - pointer-events: none; - opacity: 0.5; -} \ No newline at end of file +:root { + --jexcel-border-color:#000; +} + +.jexcel_container { + display:inline-block; + padding-right:2px; + box-sizing: border-box; + overscroll-behavior: contain; + outline: none; +} + +.jexcel_container.fullscreen { + position:fixed; + top:0px; + left:0px; + width:100%; + height:100%; + z-index:21; +} + +.jexcel_container.fullscreen .jexcel_content { + overflow:auto; + width:100%; + height:100%; + background-color:#ffffff; +} + +.jexcel_container.with-toolbar .jexcel > thead > tr > td { + top: 0; +} + +.jexcel_container.fullscreen.with-toolbar { + height: calc(100% - 46px); +} + +.jexcel_content { + display:inline-block; + box-sizing: border-box; + padding-right:3px; + padding-bottom:3px; + position:relative; + scrollbar-width: thin; + scrollbar-color: #666 transparent; +} + +@supports (-moz-appearance:none) { + .jexcel_content { padding-right:10px; } +} + +.jexcel_content::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +.jexcel_content::-webkit-scrollbar-track { + background: #eee; +} + +.jexcel_content::-webkit-scrollbar-thumb { + background: #666; +} + +.jexcel { + border-collapse: separate; + table-layout: fixed; + white-space: nowrap; + empty-cells: show; + border: 0px; + background-color: #fff; + width: 0; + + border-top: 1px solid transparent; + border-left: 1px solid transparent; + border-right: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} + +.jexcel > thead > tr > td +{ + border-top: 1px solid #ccc; + border-left: 1px solid #ccc; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + background-color: #f3f3f3; + padding: 2px; + cursor: pointer; + box-sizing: border-box; + overflow: hidden; + position: -webkit-sticky; + position: sticky; + top: 0; + z-index:2; +} + +.jexcel_container.with-toolbar .jexcel > thead > tr > td +{ + top:42px; +} + +.jexcel > thead > tr > td.dragging +{ + background-color:#fff; + opacity:0.5; +} + +.jexcel > thead > tr > td.selected +{ + background-color:#dcdcdc; +} + +.jexcel > thead > tr > td.arrow-up +{ + background-repeat:no-repeat; + background-position:center right 5px; + background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 14l5-5 5 5H7z' fill='gray'/%3E%3C/svg%3E"); + text-decoration:underline; +} + +.jexcel > thead > tr > td.arrow-down +{ + background-repeat:no-repeat; + background-position:center right 5px; + background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 10l5 5 5-5H7z' fill='gray'/%3E%3C/svg%3E"); + text-decoration:underline; +} + +.jexcel > tbody > tr > td:first-child +{ + position:relative; + background-color:#f3f3f3; + text-align:center; +} + +.jexcel > tbody.resizable > tr > td:first-child::before +{ + content:'\00a0'; + width:100%; + height:3px; + position:absolute; + bottom:0px; + left:0px; + cursor:row-resize; +} + +.jexcel > tbody.draggable > tr > td:first-child::after +{ + content:'\00a0'; + width:3px; + height:100%; + position:absolute; + top:0px; + right:0px; + cursor:move; +} + +.jexcel > tbody > tr.dragging > td +{ + background-color:#eee; + opacity:0.5; +} + +.jexcel > tbody > tr > td +{ + border-top:1px solid #ccc; + border-left:1px solid #ccc; + border-right:1px solid transparent; + border-bottom:1px solid transparent; + padding:4px; + white-space: nowrap; + box-sizing: border-box; + line-height:1em; +} + +.jexcel_overflow > tbody > tr > td { + overflow: hidden; +} + +.jexcel > tbody > tr > td:last-child +{ + overflow: hidden; +} + +.jexcel > tbody > tr > td > img +{ + display:inline-block; + max-width:100px; +} + +.jexcel > tbody > tr > td.readonly +{ + background-color: #f9f9f9; +} +.jexcel > tbody > tr.selected > td:first-child +{ + background-color:#dcdcdc; +} +.jexcel > tbody > tr > td > select, +.jexcel > tbody > tr > td > input, +.jexcel > tbody > tr > td > textarea +{ + border:0px; + border-radius:0px; + outline:0px; + width:100%; + margin:0px; + padding:0px; + padding-right:2px; + background-color:transparent; + box-sizing: border-box; +} + +.jexcel > tbody > tr > td > textarea +{ + resize: none; + padding-top:6px !important; +} + +.jexcel > tbody > tr > td > input[type=checkbox] +{ + width:12px; + margin-top:2px; +} +.jexcel > tbody > tr > td > input[type=radio] +{ + width:12px; + margin-top:2px; +} + +.jexcel > tbody > tr > td > select +{ + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-repeat: no-repeat; + background-position-x: 100%; + background-position-y: 40%; + background-image: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSdibGFjaycgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyB3aWR0aD0nMjQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nTTcgMTBsNSA1IDUtNXonLz48cGF0aCBkPSdNMCAwaDI0djI0SDB6JyBmaWxsPSdub25lJy8+PC9zdmc+); +} + +.jexcel > tbody > tr > td.jexcel_dropdown +{ + background-repeat: no-repeat; + background-position:top 50% right 5px; + background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 10l5 5 5-5H7z' fill='lightgray'/%3E%3C/svg%3E"); + text-overflow: ellipsis; + overflow-x:hidden; +} + +.jexcel > tbody > tr > td.jexcel_dropdown.jexcel_comments +{ + background:url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 10l5 5 5-5H7z' fill='lightgray'/%3E%3C/svg%3E") top 50% right 5px no-repeat, url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFuGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTAxLTMxVDE4OjU1OjA4WiIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wMS0zMVQxODo1NTowOFoiIHhtcDpNb2RpZnlEYXRlPSIyMDE5LTAxLTMxVDE4OjU1OjA4WiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDphMTlhZDJmOC1kMDI2LTI1NDItODhjOS1iZTRkYjkyMmQ0MmQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpkOGI5NDUyMS00ZjEwLWQ5NDktYjUwNC0wZmU1N2I3Nzk1MDEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplMzdjYmE1ZS1hYTMwLWNkNDUtYTAyNS1lOWYxZjk2MzUzOGUiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplMzdjYmE1ZS1hYTMwLWNkNDUtYTAyNS1lOWYxZjk2MzUzOGUiIHN0RXZ0OndoZW49IjIwMTktMDEtMzFUMTg6NTU6MDhaIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmExOWFkMmY4LWQwMjYtMjU0Mi04OGM5LWJlNGRiOTIyZDQyZCIgc3RFdnQ6d2hlbj0iMjAxOS0wMS0zMVQxODo1NTowOFoiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4En6MDAAAAX0lEQVQYlX3KOw6AIBBAwS32RpJADXfx0pTET+ERZJ8F8RODFtONsG0QAoh0CSDM82dqodaBdQXnfoLZQM7gPai+wjNNE8R4pTuAYNZSKZASqL7CMy0LxNgJp30fKYUDi3+vIqb/+rUAAAAASUVORK5CYII=') top right no-repeat; +} + +.jexcel > tbody > tr > td > .color +{ + width:90%; + height:10px; + margin:auto; +} + +.jexcel > tbody > tr > td > a { + text-decoration: underline; +} + +.jexcel > tbody > tr > td.highlight > a { + color: blue; + cursor: pointer; +} + +.jexcel > tfoot > tr > td +{ + border-top: 1px solid #ccc; + border-left: 1px solid #ccc; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + background-color: #f3f3f3; + padding: 2px; + cursor: pointer; + box-sizing: border-box; + overflow: hidden; +} + +.jexcel .highlight { + background-color:rgba(0,0,0,0.05); +} + +.jexcel .highlight-top { + border-top:1px solid #000; /* var(--jexcel-border-color);*/ + box-shadow: 0px -1px #ccc; +} + +.jexcel .highlight-left { + border-left:1px solid #000; /* var(--jexcel-border-color);*/ + box-shadow: -1px 0px #ccc; +} + +.jexcel .highlight-right { + border-right:1px solid #000; /* var(--jexcel-border-color);*/ +} + +.jexcel .highlight-bottom { + border-bottom:1px solid #000; /* var(--jexcel-border-color);*/ +} + +.jexcel .highlight-top.highlight-left { + box-shadow: -1px -1px #ccc; + -webkit-box-shadow: -1px -1px #ccc; + -moz-box-shadow: -1px -1px #ccc; +} + +.jexcel .highlight-selected +{ + background-color:rgba(0,0,0,0.0); +} +.jexcel .selection +{ + background-color:rgba(0,0,0,0.05); +} +.jexcel .selection-left +{ + border-left:1px dotted #000; +} +.jexcel .selection-right +{ + border-right:1px dotted #000; +} +.jexcel .selection-top +{ + border-top:1px dotted #000; +} +.jexcel .selection-bottom +{ + border-bottom:1px dotted #000; +} +.jexcel_corner +{ + position:absolute; + background-color: rgb(0, 0, 0); + height: 1px; + width: 1px; + border: 1px solid rgb(255, 255, 255); + top:-2000px; + left:-2000px; + cursor:crosshair; + box-sizing: initial; + z-index:20; + padding: 2px; +} + +.jexcel .editor +{ + outline:0px solid transparent; + overflow:visible; + white-space: nowrap; + text-align:left; + padding:0px; + box-sizing: border-box; + overflow:visible !important; +} + +.jexcel .editor > input +{ + padding-left:4px; +} + +.jexcel .editor .jupload +{ + position:fixed; + top:100%; + z-index:40; + user-select:none; + -webkit-font-smoothing: antialiased; + font-size: .875rem; + letter-spacing: .2px; + -webkit-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 8px 10px 1px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); + box-shadow: 0 8px 10px 1px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); + padding:10px; + background-color:#fff; + width:300px; + min-height:225px; + margin-top:2px; +} + +.jexcel .editor .jupload img +{ + width:100%; + height:auto; +} + +.jexcel .editor .jexcel_richtext +{ + position:fixed; + top:100%; + z-index:40; + user-select:none; + -webkit-font-smoothing: antialiased; + font-size: .875rem; + letter-spacing: .2px; + -webkit-box-shadow: 0 8px 10px 1px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); + box-shadow: 0 8px 10px 1px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); + padding:10px; + background-color:#fff; + min-width:280px; + max-width:310px; + margin-top:2px; + text-align:left; +} + +.jexcel .editor .jclose:after +{ + position:absolute; + top:0; + right:0; + margin:10px; + content:'close'; + font-family:'Material icons'; + font-size:24px; + width:24px; + height:24px; + line-height:24px; + cursor:pointer; + text-shadow: 0px 0px 5px #fff; +} + +.jexcel, .jexcel td, .jexcel_corner +{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-drag: none; + -khtml-user-drag: none; + -moz-user-drag: none; + -o-user-drag: none; + user-drag: none; +} + +.jexcel_textarea +{ + position:absolute; + top:-999px; + left:-999px; + width:1px; + height:1px; +} +.jexcel .dragline +{ + position:absolute; +} +.jexcel .dragline div +{ + position:relative; + top:-6px; + height:5px; + width:22px; +} +.jexcel .dragline div:hover +{ + cursor:move; +} + +.jexcel .onDrag +{ + background-color:rgba(0,0,0,0.6); +} + +.jexcel .error +{ + border:1px solid red; +} + +.jexcel thead td.resizing +{ + border-right-style:dotted !important; + border-right-color:red !important; +} + +.jexcel tbody tr.resizing > td +{ + border-bottom-style:dotted !important; + border-bottom-color:red !important; +} + +.jexcel tbody td.resizing +{ + border-right-style:dotted !important; + border-right-color:red !important; +} + +.jexcel .jdropdown-header +{ + border:0px !important; + outline:none !important; + width:100% !important; + height:100% !important; + padding:0px !important; + padding-left:8px !important; +} + +.jexcel .jdropdown-container +{ + margin-top:1px; +} + +.jexcel .jdropdown-container-header { + padding: 0px; + margin: 0px; + height: inherit; +} + +.jexcel .jdropdown-picker +{ + border:0px !important; + padding:0px !important; + width:inherit; + height:inherit; +} + +.jexcel .jexcel_comments +{ + background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFuGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTAxLTMxVDE4OjU1OjA4WiIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wMS0zMVQxODo1NTowOFoiIHhtcDpNb2RpZnlEYXRlPSIyMDE5LTAxLTMxVDE4OjU1OjA4WiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDphMTlhZDJmOC1kMDI2LTI1NDItODhjOS1iZTRkYjkyMmQ0MmQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpkOGI5NDUyMS00ZjEwLWQ5NDktYjUwNC0wZmU1N2I3Nzk1MDEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplMzdjYmE1ZS1hYTMwLWNkNDUtYTAyNS1lOWYxZjk2MzUzOGUiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplMzdjYmE1ZS1hYTMwLWNkNDUtYTAyNS1lOWYxZjk2MzUzOGUiIHN0RXZ0OndoZW49IjIwMTktMDEtMzFUMTg6NTU6MDhaIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmExOWFkMmY4LWQwMjYtMjU0Mi04OGM5LWJlNGRiOTIyZDQyZCIgc3RFdnQ6d2hlbj0iMjAxOS0wMS0zMVQxODo1NTowOFoiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4En6MDAAAAX0lEQVQYlX3KOw6AIBBAwS32RpJADXfx0pTET+ERZJ8F8RODFtONsG0QAoh0CSDM82dqodaBdQXnfoLZQM7gPai+wjNNE8R4pTuAYNZSKZASqL7CMy0LxNgJp30fKYUDi3+vIqb/+rUAAAAASUVORK5CYII='); + background-repeat: no-repeat; + background-position: top right; +} + +.jexcel .sp-replacer +{ + margin: 2px; + border:0px; +} + +.jexcel > thead > tr.jexcel_filter > td > input +{ + border:0px; + width:100%; + outline:none; +} + +.jexcel_about { + float: right; + font-size: 0.7em; + padding: 2px; + text-transform: uppercase; + letter-spacing: 1px; + display: none; +} +.jexcel_about a { + color: #ccc; + text-decoration: none; +} + +.jexcel_about img { + display: none; +} + +.jexcel_filter +{ + display:flex; + justify-content:space-between; + margin-bottom:4px; +} + +.jexcel_filter > div +{ + padding:8px; + align-items:center; +} + +.jexcel_pagination +{ + display:flex; + justify-content:space-between; + align-items:center; +} + +.jexcel_pagination > div +{ + display:flex; + padding:10px; +} + +.jexcel_pagination > div:last-child +{ + padding-right:10px; + padding-top:10px; +} + +.jexcel_pagination > div > div +{ + text-align:center; + width:36px; + height:36px; + line-height:34px; + border:1px solid #ccc; + box-sizing: border-box; + margin-left:2px; + cursor:pointer; +} + +.jexcel_page +{ + font-size:0.8em; +} + +.jexcel_page_selected +{ + font-weight:bold; + background-color:#f3f3f3; +} + +.jexcel_toolbar +{ + display:flex; + background-color:#f3f3f3; + border:1px solid #ccc; + padding:4px; + margin:0px 2px 4px 1px; + position:sticky; + top:0px; + z-index:21; +} + +.jexcel_toolbar:empty +{ + display:none; +} + +.jexcel_toolbar i.jexcel_toolbar_item +{ + width:24px; + height:24px; + padding:4px; + cursor:pointer; + display:inline-block; +} + +.jexcel_toolbar i.jexcel_toolbar_item:hover +{ + background-color:#ddd; +} + +.jexcel_toolbar select.jexcel_toolbar_item +{ + margin-left:2px; + margin-right:2px; + display:inline-block; + border:0px; + background-color:transparent; + padding-right:10px; +} + +.jexcel .dragging-left +{ + background-repeat: no-repeat; + background-position:top 50% left 0px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M14 7l-5 5 5 5V7z'/%3E%3Cpath fill='none' d='M24 0v24H0V0h24z'/%3E%3C/svg%3E"); +} + +.jexcel .dragging-right +{ + background-repeat: no-repeat; + background-position:top 50% right 0px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M10 17l5-5-5-5v10z'/%3E%3Cpath fill='none' d='M0 24V0h24v24H0z'/%3E%3C/svg%3E"); +} + +.jexcel_tabs .jexcel_tab +{ + display:none; +} + +.jexcel_tabs .jexcel_tab_link +{ + display:inline-block; + padding:10px; + padding-left:20px; + padding-right:20px; + margin-right:5px; + margin-bottom:5px; + background-color:#f3f3f3; + cursor:pointer; +} + +.jexcel_tabs .jexcel_tab_link.selected +{ + background-color:#ddd; +} + +.jexcel_hidden_index > tbody > tr > td:first-child, +.jexcel_hidden_index > thead > tr > td:first-child, +.jexcel_hidden_index > tfoot > tr > td:first-child, +.jexcel_hidden_index > colgroup > col:first-child +{ + display:none; +} + + + +.jexcel .jrating { + display: inline-flex; +} +.jexcel .jrating > div { + zoom: 0.55; +} + +.jexcel .copying-top { + border-top:1px dashed #000; +} + +.jexcel .copying-left { + border-left:1px dashed #000; +} + +.jexcel .copying-right { + border-right:1px dashed #000; +} + +.jexcel .copying-bottom { + border-bottom:1px dashed #000; +} + +.jexcel .jexcel_column_filter { + background-repeat: no-repeat; + background-position: top 50% right 5px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='gray' width='18px' height='18px'%3E%3Cpath d='M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); + text-overflow: ellipsis; + overflow: hidden; + padding: 0px; + padding-left: 6px; + padding-right: 20px; +} + +.jexcel thead .jexcel_freezed, .jexcel tfoot .jexcel_freezed { + left: 0px; + z-index: 3 !important; + box-shadow: 2px 0px 2px 0.2px #ccc !important; + -webkit-box-shadow: 2px 0px 2px 0.2px #ccc !important; + -moz-box-shadow: 2px 0px 2px 0.2px #ccc !important; +} + +.jexcel tbody .jexcel_freezed { + position: relative; + background-color: #fff; + box-shadow: 1px 1px 1px 1px #ccc !important; + -webkit-box-shadow: 2px 4px 4px 0.1px #ccc !important; + -moz-box-shadow: 2px 4px 4px 0.1px #ccc !important; +} + +.red { + color: red; +} + +.jexcel > tbody > tr > td.readonly > input[type=checkbox], +.jexcel > tbody > tr > td.readonly > input[type=radio] { + pointer-events: none; + opacity: 0.5; +} From 83d5f3ef62c57c46e4624e634858efbf64ce9b35 Mon Sep 17 00:00:00 2001 From: Chris Millar Date: Tue, 14 Jan 2025 15:05:35 -0700 Subject: [PATCH 15/15] ACL - Fix sheet bugs... 404, etc. --- blocks/edit/da-title/da-title.css | 3 +-- blocks/sheet/utils/index.js | 12 +++++++----- blocks/sheet/utils/utils.js | 1 - 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/blocks/edit/da-title/da-title.css b/blocks/edit/da-title/da-title.css index d6d482fc..7f6e92d7 100644 --- a/blocks/edit/da-title/da-title.css +++ b/blocks/edit/da-title/da-title.css @@ -46,10 +46,9 @@ h1 { position: absolute; width: 18px; height: 18px; - top: 50%; + top: 18px; left: -36px; background: url(/blocks/edit/img/Smock_LockClosed_18_N.svg) center center / 18px no-repeat; - transform: translateY(-50%); } .da-title-name-label { diff --git a/blocks/sheet/utils/index.js b/blocks/sheet/utils/index.js index 7932bcf6..80e70048 100644 --- a/blocks/sheet/utils/index.js +++ b/blocks/sheet/utils/index.js @@ -6,7 +6,7 @@ import '../da-sheet-tabs.js'; const { loadStyle } = await import(`${getNx()}/scripts/nexter.js`); const loadScript = (await import(`${getNx()}/utils/script.js`)).default; -const SHEET_TEMPLATE = { sheetName: 'data' }; +const SHEET_TEMPLATE = { minDimensions: [20, 20], sheetName: 'data' }; let permissions; let canWrite; @@ -39,7 +39,7 @@ function finishSetup(el, data) { function getDefaultSheet() { return [ - { ...SHEET_TEMPLATE }, + { ...SHEET_TEMPLATE, minDimensions: [20, 20] }, ]; } @@ -71,7 +71,8 @@ const getColWidths = (colWidths, headers) => { function getSheet(json, sheetName) { const data = getSheetData(json.data); - const templ = canWrite ? { ...SHEET_TEMPLATE, minDimensions: [20, 20] } : SHEET_TEMPLATE; + const templ = { ...SHEET_TEMPLATE }; + if (!canWrite) delete templ.minDimensions; return { ...templ, @@ -87,15 +88,16 @@ export function getPermissions() { export async function getData(url) { const resp = await daFetch(url); - if (!resp.ok) return getDefaultSheet(); - // Set permissions + // Set permissions even if the file is a 404 const daTitle = document.querySelector('da-title'); if (daTitle) daTitle.permissions = resp.permissions; permissions = resp.permissions; canWrite = resp.permissions.some((permission) => permission === 'write'); + if (!resp.ok) return getDefaultSheet(); + const sheets = []; // Get base data diff --git a/blocks/sheet/utils/utils.js b/blocks/sheet/utils/utils.js index 2b3d011f..51802e7d 100644 --- a/blocks/sheet/utils/utils.js +++ b/blocks/sheet/utils/utils.js @@ -11,7 +11,6 @@ function debounce(func, wait) { } export const saveSheets = async (sheets) => { - const daTitle = document.querySelector('da-title'); document.querySelector('da-sheet-panes').data = convertSheets(sheets); const { hash } = window.location;