From 806b0ecff1574babde632b3e8322f985e62ee923 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Sat, 2 Feb 2019 16:58:08 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B4=20SearchPage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/components/Reader/Reader.vue | 11 +- .../Reader/SearchPage/SearchPage.vue | 132 +++++++++++++++++- client/element.js | 5 +- 3 files changed, 138 insertions(+), 10 deletions(-) diff --git a/client/components/Reader/Reader.vue b/client/components/Reader/Reader.vue index 1fac4258..dbff37ee 100644 --- a/client/components/Reader/Reader.vue +++ b/client/components/Reader/Reader.vue @@ -59,7 +59,7 @@ - + @@ -299,12 +299,13 @@ class Reader extends Vue { searchToggle() { this.searchActive = !this.searchActive; - if (this.searchActive && this.activePage == 'TextPage' && this.lastOpenedBook) { + const page = this.$refs.page; + if (this.searchActive && this.activePage == 'TextPage' && page.parsed && this.lastOpenedBook) { this.closeAllTextPages(); this.searchActive = true; this.$nextTick(() => { - //this.$refs.searchPage + this.$refs.searchPage.init(page.parsed); }); } else { this.searchActive = false; @@ -640,9 +641,7 @@ class Reader extends Vue { } .tool-button { - margin: 0; - margin-left: 2px; - margin-right: 2px; + margin: 0 2px 0 2px; padding: 0; color: #3E843E; background-color: #E6EDF4; diff --git a/client/components/Reader/SearchPage/SearchPage.vue b/client/components/Reader/SearchPage/SearchPage.vue index 11d5747f..2d3e84f1 100644 --- a/client/components/Reader/SearchPage/SearchPage.vue +++ b/client/components/Reader/SearchPage/SearchPage.vue @@ -5,6 +5,21 @@ + +
+ {{ initPercentage }}% + +
+ +
{{ foundText }}
+
+ + + + +
@@ -16,26 +31,106 @@ import Vue from 'vue'; import Component from 'vue-class-component'; import Window from '../../share/Window.vue'; +import {sleep} from '../../../share/utils'; export default @Component({ components: { Window, }, + watch: { + needle: function() { + this.find(); + + }, + foundText: function(newValue) { + this.$refs.input.style.paddingRight = newValue.length*12 + 'px'; + }, + }, }) class SearchPage extends Vue { header = null; + initStep = null; + initPercentage = 0; + needle = null; + foundList = []; + foundCur = -1; created() { this.commit = this.$store.commit; this.reader = this.$store.state.reader; + } + async init(parsed) { + this.parsed = parsed; + + this.initStep = true; + this.stopInit = false; + this.header = 'Подготовка'; + await this.$nextTick(); + + let prevPerc = 0; + let text = ''; + for (let i = 0; i < parsed.para.length; i++) { + const p = parsed.para[i]; + const parts = parsed.splitToStyle(p.text); + if (this.stopInit) + break; + + for (const part of parts) + text += part.text; + + const perc = Math.round(i/parsed.para.length*100); + + if (perc != prevPerc) { + this.initPercentage = perc; + await sleep(1); + prevPerc = perc; + } + } + this.text = text; + this.initStep = false; + + this.header = 'Найти'; + await this.$nextTick(); + this.$refs.input.focus(); + this.$refs.input.select(); + } + + get foundText() { + if (this.foundList.length && this.foundCur >= 0) + return `${this.foundCur}/${this.foundList.length}`; + else + return ''; + } + + find() { + let foundList = []; + let i = 0; + while (i < this.text.length) { + i++; + } + this.foundList = foundList; + } + + findNext() { + console.log('1'); + } + + findPrev() { + console.log('2'); } close() { + this.stopInit = true; this.$emit('search-toggle'); } keyHook(event) { + //недостатки сторонних ui + if (document.activeElement === this.$refs.input && event.type == 'keydown' && event.key == 'Enter') { + this.find(); + } + if (event.type == 'keydown' && (event.code == 'Escape')) { this.close(); } @@ -53,15 +148,46 @@ class SearchPage extends Vue { z-index: 40; display: flex; flex-direction: column; - justify-content: flex-start; + justify-content: center; align-items: center; } .mainWindow { width: 100%; - max-width: 400px; - height: 140px; + max-width: 500px; + height: 125px; display: flex; + position: relative; + top: -50px; } +.content { + flex: 1; + display: flex; + justify-content: center; + align-items: center; + padding: 10px; +} + +.input { + display: flex; + margin: 0; + padding: 0; + width: 100%; + position: relative; +} + +.button-group { + width: 150px; + margin: 0; + padding: 0; +} + +.el-button { + padding: 9px 17px 9px 17px; +} + +i { + font-size: 20px; +} \ No newline at end of file diff --git a/client/element.js b/client/element.js index 6f18602e..b58fece0 100644 --- a/client/element.js +++ b/client/element.js @@ -23,6 +23,9 @@ import './theme/menu-item.css'; import ElButton from 'element-ui/lib/button'; import './theme/button.css'; +import ElButtonGroup from 'element-ui/lib/button-group'; +import './theme/button-group.css'; + import ElCheckbox from 'element-ui/lib/checkbox'; import './theme/checkbox.css'; @@ -93,7 +96,7 @@ import MessageBox from 'element-ui/lib/message-box'; import './theme/message-box.css'; const components = { - ElMenu, ElMenuItem, ElButton, ElCheckbox, ElTabs, ElTabPane, ElTooltip, + ElMenu, ElMenuItem, ElButton, ElButtonGroup, ElCheckbox, ElTabs, ElTabPane, ElTooltip, ElCol, ElContainer, ElAside, ElMain, ElHeader, ElInput, ElInputNumber, ElSelect, ElOption, ElTable, ElTableColumn, ElProgress, ElSlider, ElForm, ElFormItem,