From 1d56b697c108e4ee60de95be7a8639d75b837aaa Mon Sep 17 00:00:00 2001 From: Chris Millar Date: Sat, 23 Mar 2024 08:32:50 -0600 Subject: [PATCH] GH-54 - Search & Replace * Creates new search tab in browse view * Ability to search in current folder * Ability to replace found search term Resolves: GH-54 --- blocks/browse/da-browse/da-browse.css | 106 ++++++++++++++--- blocks/browse/da-browse/da-browse.js | 106 +++++++++++++---- blocks/browse/da-browse/da-search.css | 144 +++++++++++++++++++++++ blocks/browse/da-browse/da-search.js | 162 ++++++++++++++++++++++++++ blocks/shared/constants.js | 1 + 5 files changed, 481 insertions(+), 38 deletions(-) create mode 100644 blocks/browse/da-browse/da-search.css create mode 100644 blocks/browse/da-browse/da-search.js diff --git a/blocks/browse/da-browse/da-browse.css b/blocks/browse/da-browse/da-browse.css index aac6c44c..37a36570 100644 --- a/blocks/browse/da-browse/da-browse.css +++ b/blocks/browse/da-browse/da-browse.css @@ -19,6 +19,62 @@ input, button { font-family: var(--body-font-family); } +/* Tab List */ +.da-browse-tab-header { + display: flex; + gap: 18px; + margin-bottom: 24px; +} + +.da-browse-tab-header button { + position: relative; + display: block; + background: none; + border: none; + padding: 0 0 6px; + margin: 0; + box-sizing: border-box; + color: #8f8f8f; +} + +.da-browse-tab-header button::after { + display: block; + content: ''; + position: absolute; + bottom: 0; + height: 3px; + width: 100%; + opacity: 0; + transition: opacity 0.2s ease-in-out; + background: #131313; + border-radius: 3px; +} + +.da-browse-tab-header h2 { + margin: 0; + text-transform: uppercase; + font-size: 22px; +} + +.da-browse-tab-header button[aria-selected="true"] { + color: #131313; +} + +.da-browse-tab-header button[aria-selected="true"]::after { + opacity: 1; +} + + +.da-browse-tab-panel { + display: none; +} + +.da-browse-tab-panel-active { + display: block; +} + +/* Tab List End */ + /* Item List */ .da-item-list { @@ -193,6 +249,10 @@ input[type="checkbox"] { } /* Breadcrumbs */ +.da-breadcrumb { + margin-bottom: 12px; +} + .da-breadcrumb-list { margin: 0 0 12px; padding: 0; @@ -264,9 +324,18 @@ input[type="checkbox"] { height: 32px; } +@media (width >= 600px) { + .da-breadcrumb-list { + margin: 0; + } + + .da-breadcrumb:has(da-search) .da-breadcrumb-list { + margin-bottom: 12px; + } +} + /* Actions */ .da-actions-create { - margin: 0 0 12px; padding: 0; display: flex; list-style: none; @@ -324,19 +393,21 @@ input[type="checkbox"] { .da-actions-new-button, .da-actions-button { - position: relative; - display: block; - font-size: 14px; - font-weight: 700; - padding: 0px 10px; - line-height: 24px; - background: #EFEFEF; - border: none; - font-size: 14px; - background-color: #cee4ff; - color: #066ce7; - border-radius: 6px; - cursor: pointer; + background-color: var(--spectrum-blue-800); + border-radius: 8px; + border: 2px solid var(--spectrum-blue-800); + border-color: var(--spectrum-blue-800); + color: #FFF; + display: inline-block; + font-size: 15px; + font-style: normal; + font-weight: 700; + line-height: 18px; + padding: 5px 14px; + text-decoration: none; + outline-offset: 0; + outline-color: var(--spectrum-blue-800); + transition: outline-offset .2s; } .da-actions-new-button { @@ -438,7 +509,7 @@ li.da-actions-menu-item button:hover { /* Empty list */ .empty-list { border: 1px solid rgb(234, 234, 234); - background-color: rgb(255, 255, 255); + background-color: rgb(248, 248, 248); border-radius: 6px; display: flex; justify-content: center; @@ -449,7 +520,12 @@ li.da-actions-menu-item button:hover { @media (min-width: 900px) { .da-breadcrumb { + margin-bottom: 12px; display: flex; gap: 24px; } + + .da-breadcrumb:has(da-search) { + display: block; + } } diff --git a/blocks/browse/da-browse/da-browse.js b/blocks/browse/da-browse/da-browse.js index 23a3d490..67571273 100644 --- a/blocks/browse/da-browse/da-browse.js +++ b/blocks/browse/da-browse/da-browse.js @@ -1,19 +1,24 @@ -import { LitElement, html } from '../../../deps/lit/lit-core.min.js'; -import { getDaAdmin } from '../../shared/constants.js'; +import { LitElement, html, nothing } from '../../../deps/lit/lit-core.min.js'; +import { DA_ORIGIN } from '../../shared/constants.js'; import inlinesvg from '../../shared/inlinesvg.js'; - -import getSheet from '../../shared/sheet.js'; import { saveToDa, daFetch } from '../../shared/utils.js'; +import { getNx } from '../../../scripts/utils.js'; -const sheet = await getSheet('/blocks/browse/da-browse/da-browse.css'); +// Components +import './da-search.js'; -const DA_ORIGIN = getDaAdmin(); +// Styles +const { default: getStyle } = await import(`${getNx()}/utils/styles.js`); +const style = await getStyle(import.meta.url); +// Icons const ICONS = ['/blocks/browse/da-browse/img/Smock_Settings_18_N.svg']; export default class DaBrowse extends LitElement { static properties = { details: { attribute: false }, + searchItems: { attribute: false }, + _tabItems: { state: true }, _listItems: { state: true }, _selectedItems: { state: true }, _breadcrumbs: {}, @@ -27,11 +32,22 @@ export default class DaBrowse extends LitElement { constructor() { super(); + this.searchItems = []; this._selectedItems = []; this._createShow = ''; this._createName = ''; this._createFile = ''; this._fileLabel = 'Select file'; + this._tabItems = [ + { id: 'browse', label: 'Browse', selected: true }, + { id: 'search', label: 'Search', selected: false }, + ]; + } + + connectedCallback() { + super.connectedCallback(); + this.shadowRoot.adoptedStyleSheets = [style]; + inlinesvg({ parent: this.shadowRoot, paths: ICONS }); } async getList() { @@ -132,12 +148,6 @@ export default class DaBrowse extends LitElement { this._fileLabel = 'Select file'; } - connectedCallback() { - super.connectedCallback(); - this.shadowRoot.adoptedStyleSheets = [sheet]; - inlinesvg({ parent: this.shadowRoot, paths: ICONS }); - } - async update(props) { if (props.has('details')) { this._listItems = await this.getList(); @@ -202,6 +212,20 @@ export default class DaBrowse extends LitElement { this._canPaste = false; } + handleTab(idx) { + const current = this._tabItems.find((item) => item.selected); + if (this._tabItems[idx].id === current.id) return; + this._tabItems.forEach((item) => { + item.selected = false; + }); + this._tabItems[idx].selected = true; + this._tabItems = [...this._tabItems]; + } + + handeSearchList(e) { + this.searchItems = e.detail.items; + } + renderConfig(length, crumb, idx) { if (this.details.depth <= 2 && idx + 1 === length) { return html` @@ -281,17 +305,19 @@ export default class DaBrowse extends LitElement { `; } - listView() { + listView(items, allowSelect) { return html`