SettingsPage.vue 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  1. <template>
  2. <div ref="main" class="main" @click="close">
  3. <div class="mainWindow" @click.stop>
  4. <Window @close="close">
  5. <template slot="header">
  6. Настройки
  7. </template>
  8. <el-tabs type="border-card" tab-position="left" v-model="selectedTab">
  9. <!-- Профили ------------------------------------------------------------------------->
  10. <el-tab-pane label="Профили">
  11. <el-form :model="form" size="small" label-width="100px" @submit.native.prevent>
  12. <div class="partHeader">Профили устройств</div>
  13. <el-form-item label="">
  14. <div class="text">
  15. Выберите или добавьте профиль устройства, чтобы начать синхронизацию данных с сервером.
  16. При выборе "Нет" синхронизация отключается.
  17. </div>
  18. </el-form-item>
  19. <el-form-item label="Устройство">
  20. <el-select v-model="currentProfile" placeholder="">
  21. <el-option label="Нет" value=""></el-option>
  22. <el-option v-for="item in profilesArray"
  23. :key="item"
  24. :label="item"
  25. :value="item">
  26. </el-option>
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item label="">
  30. <el-button @click="addProfile">Добавить</el-button>
  31. <el-button @click="delProfile">Удалить</el-button>
  32. <el-button @click="delAllProfiles">Удалить все</el-button>
  33. </el-form-item>
  34. </el-form>
  35. <el-form :model="form" size="small" label-width="100px" @submit.native.prevent>
  36. <div class="partHeader">Ключ доступа</div>
  37. <el-form-item label="">
  38. <div class="text">
  39. Ключ доступа позволяет восстановить профили с настройками и список читаемых книг
  40. на другом устройстве. Для этого необходимо передать его через почту, мессенджер или другим способом.
  41. </div>
  42. <div>
  43. <b>{{ partialStorageKey }}</b> (часть вашего ключа)
  44. </div>
  45. </el-form-item>
  46. <el-form-item label="">
  47. <el-button style="width: 250px" @click="showServerStorageKey">Показать ключ доступа/ссылку</el-button>
  48. </el-form-item>
  49. <el-form-item label="">
  50. <el-button style="width: 250px" @click="enterServerStorageKey">Ввести ключ доступа</el-button>
  51. </el-form-item>
  52. <el-form-item label="">
  53. <el-button style="width: 250px" @click="generateServerStorageKey">Сгенерировать новый ключ</el-button>
  54. </el-form-item>
  55. <el-form-item label="">
  56. <div class="text">
  57. Рекомендуется сохранить ключ в надежном месте, чтобы всегда иметь возможность восстановить настройки,
  58. например, после переустановки ОС или чистки/смены браузера.<br>
  59. ПРЕДУПРЕЖДЕНИЕ! При утере ключа, НИКТО не сможет восстановить ваши настройки, т.к. все данные сжимаются
  60. и шифруются ключом доступа перед отправкой на сервер.
  61. </div>
  62. </el-form-item>
  63. </el-form>
  64. </el-tab-pane>
  65. <!-- Вид ------------------------------------------------------------------------->
  66. <el-tab-pane label="Вид">
  67. <el-form :model="form" size="small" label-width="120px" @submit.native.prevent>
  68. <div class="partHeader">Цвет</div>
  69. <el-form-item label="Текст">
  70. <el-col :span="12">
  71. <el-color-picker v-model="textColor" color-format="hex" :predefine="predefineTextColors"></el-color-picker>
  72. <span class="color-picked"><b>{{ textColor }}</b></span>
  73. </el-col>
  74. <el-col :span="5">
  75. <span style="position: relative; top: 20px;">Обои:</span>
  76. </el-col>
  77. </el-form-item>
  78. <el-form-item label="Фон">
  79. <el-col :span="12">
  80. <el-color-picker v-model="backgroundColor" color-format="hex" :predefine="predefineBackgroundColors" :disabled="wallpaper != ''"></el-color-picker>
  81. <span v-show="wallpaper == ''" class="color-picked"><b>{{ backgroundColor }}</b></span>
  82. </el-col>
  83. <el-col :span="11">
  84. <el-select v-model="wallpaper">
  85. <el-option label="Нет" value=""></el-option>
  86. <el-option label="1" value="paper1"></el-option>
  87. <el-option label="2" value="paper2"></el-option>
  88. <el-option label="3" value="paper3"></el-option>
  89. <el-option label="4" value="paper4"></el-option>
  90. <el-option label="5" value="paper5"></el-option>
  91. <el-option label="6" value="paper6"></el-option>
  92. <el-option label="7" value="paper7"></el-option>
  93. <el-option label="8" value="paper8"></el-option>
  94. <el-option label="9" value="paper9"></el-option>
  95. </el-select>
  96. </el-col>
  97. </el-form-item>
  98. </el-form>
  99. <el-form :model="form" size="mini" label-width="120px" @submit.native.prevent>
  100. <div class="partHeader">Шрифт</div>
  101. <el-form-item label="Локальный/веб">
  102. <el-col :span="11">
  103. <el-select v-model="fontName" placeholder="Шрифт" :disabled="webFontName != ''">
  104. <el-option v-for="item in fonts"
  105. :key="item.name"
  106. :label="item.label"
  107. :value="item.name">
  108. </el-option>
  109. </el-select>
  110. </el-col>
  111. <el-col :span="1">
  112. &nbsp;
  113. </el-col>
  114. <el-col :span="11">
  115. <el-tooltip :open-delay="500" effect="light" placement="top">
  116. <template slot="content">
  117. Веб шрифты дают большое разнообразие,<br>
  118. однако есть шанс, что шрифт будет загружаться<br>
  119. очень медленно или вовсе не загрузится
  120. </template>
  121. <el-select v-model="webFontName">
  122. <el-option label="Нет" value=""></el-option>
  123. <el-option v-for="item in webFonts"
  124. :key="item.name"
  125. :value="item.name">
  126. </el-option>
  127. </el-select>
  128. </el-tooltip>
  129. </el-col>
  130. </el-form-item>
  131. <el-form-item label="Размер">
  132. <el-col :span="17">
  133. <el-input-number v-model="fontSize" :min="5" :max="200"></el-input-number>
  134. </el-col>
  135. <el-col :span="1">
  136. <a href="https://fonts.google.com/?subset=cyrillic" target="_blank">Примеры</a>
  137. </el-col>
  138. </el-form-item>
  139. <el-form-item label="Сдвиг">
  140. <el-tooltip :open-delay="500" effect="light">
  141. <template slot="content">
  142. Сдвиг шрифта по вертикали в процентах от размера.<br>
  143. Отрицательное значение сдвигает вверх, положительное -<br>
  144. вниз. Значение зависит от метрики шрифта.
  145. </template>
  146. <el-input-number v-model="vertShift" :min="-100" :max="100"></el-input-number>
  147. </el-tooltip>
  148. </el-form-item>
  149. <el-form-item label="Стиль">
  150. <el-col :span="8">
  151. <el-checkbox v-model="fontBold">Жирный</el-checkbox>
  152. </el-col>
  153. <el-col :span="8">
  154. <el-checkbox v-model="fontItalic">Курсив</el-checkbox>
  155. </el-col>
  156. </el-form-item>
  157. </el-form>
  158. <el-form :model="form" size="mini" label-width="120px" @submit.native.prevent>
  159. <div class="partHeader">Текст</div>
  160. <el-form-item label="Интервал">
  161. <el-input-number v-model="lineInterval" :min="0" :max="200"></el-input-number>
  162. </el-form-item>
  163. <el-form-item label="Параграф">
  164. <el-input-number v-model="p" :min="0" :max="2000"></el-input-number>
  165. </el-form-item>
  166. <el-form-item label="Отступ">
  167. <el-col :span="11">
  168. <el-tooltip :open-delay="500" effect="light">
  169. <template slot="content">
  170. Слева/справа
  171. </template>
  172. <el-input-number v-model="indentLR" :min="0" :max="2000"></el-input-number>
  173. </el-tooltip>
  174. </el-col>
  175. <el-col :span="1">
  176. &nbsp;
  177. </el-col>
  178. <el-col :span="11">
  179. <el-tooltip :open-delay="500" effect="light">
  180. <template slot="content">
  181. Сверху/снизу
  182. </template>
  183. <el-input-number v-model="indentTB" :min="0" :max="2000"></el-input-number>
  184. </el-tooltip>
  185. </el-col>
  186. </el-form-item>
  187. <el-form-item label="Сдвиг">
  188. <el-tooltip :open-delay="500" effect="light">
  189. <template slot="content">
  190. Сдвиг текста по вертикали в процентах от размера шрифта.<br>
  191. Отрицательное значение сдвигает вверх, положительное -<br>
  192. вниз.
  193. </template>
  194. <el-input-number v-model="textVertShift" :min="-100" :max="100"></el-input-number>
  195. </el-tooltip>
  196. </el-form-item>
  197. <el-form-item label="Скроллинг">
  198. <el-col :span="11">
  199. <el-tooltip :open-delay="500" effect="light">
  200. <template slot="content">
  201. Замедление скроллинга в миллисекундах.<br>
  202. Определяет время, за которое текст<br>
  203. прокручивается на одну строку.
  204. </template>
  205. <el-input-number v-model="scrollingDelay" :min="1" :max="10000"></el-input-number>
  206. </el-tooltip>
  207. </el-col>
  208. <el-col :span="1">
  209. &nbsp;
  210. </el-col>
  211. <el-col :span="11">
  212. <el-tooltip :open-delay="500" effect="light" placement="top">
  213. <template slot="content">
  214. Вид скроллинга: линейный,<br>
  215. ускорение-замедление и пр.
  216. </template>
  217. <el-select v-model="scrollingType">
  218. <el-option value="linear"></el-option>
  219. <el-option value="ease"></el-option>
  220. <el-option value="ease-in"></el-option>
  221. <el-option value="ease-out"></el-option>
  222. <el-option value="ease-in-out"></el-option>
  223. </el-select>
  224. </el-tooltip>
  225. </el-col>
  226. </el-form-item>
  227. <el-form-item label="Выравнивание">
  228. <el-checkbox v-model="textAlignJustify">По ширине</el-checkbox>
  229. <el-checkbox v-model="wordWrap">Перенос по слогам</el-checkbox>
  230. </el-form-item>
  231. <el-form-item label="Обработка">
  232. <el-checkbox v-model="cutEmptyParagraphs">Убирать пустые строки</el-checkbox>
  233. </el-form-item>
  234. <el-form-item label="">
  235. <el-col :span="12">
  236. Добавлять пустые
  237. </el-col>
  238. <el-input-number v-model="addEmptyParagraphs" :min="0" :max="2"></el-input-number>
  239. </el-form-item>
  240. <el-form-item label="Изображения">
  241. <el-col :span="11">
  242. <el-checkbox v-model="showImages">Показывать</el-checkbox>
  243. </el-col>
  244. <el-col :span="1">
  245. &nbsp;
  246. </el-col>
  247. <el-col :span="11">
  248. <el-tooltip :open-delay="500" effect="light" placement="top">
  249. <template slot="content">
  250. Выносить все изображения в центр экрана
  251. </template>
  252. <el-checkbox v-model="showInlineImagesInCenter" @change="needReload" :disabled="!showImages">Инлайн в центр</el-checkbox>
  253. </el-tooltip>
  254. </el-col>
  255. </el-form-item>
  256. <el-form-item label="">
  257. <el-checkbox v-model="imageFitWidth" :disabled="!showImages">Ширина не более размера экрана</el-checkbox>
  258. </el-form-item>
  259. <el-form-item label="">
  260. <el-col :span="12">
  261. Высота не более
  262. </el-col>
  263. <el-tooltip :open-delay="500" effect="light" placement="top">
  264. <template slot="content">
  265. Определяет высоту изображения количеством строк.<br>
  266. В случае превышения высоты, изображение будет<br>
  267. уменьшено с сохранением пропорций так, чтобы<br>
  268. помещаться в указанное количество строк.
  269. </template>
  270. <el-input-number v-model="imageHeightLines" :min="1" :max="100" :disabled="!showImages"></el-input-number>
  271. </el-tooltip>
  272. </el-form-item>
  273. </el-form>
  274. <el-form :model="form" size="mini" label-width="120px" @submit.native.prevent>
  275. <div class="partHeader">Строка статуса</div>
  276. <el-form-item label="Статус">
  277. <el-checkbox v-model="showStatusBar">Показывать</el-checkbox>
  278. <el-checkbox v-model="statusBarTop" :disabled="!showStatusBar">Вверху/внизу</el-checkbox>
  279. </el-form-item>
  280. <el-form-item label="Высота">
  281. <el-input-number v-model="statusBarHeight" :min="5" :max="100" :disabled="!showStatusBar"></el-input-number>
  282. </el-form-item>
  283. <el-form-item label="Прозрачность">
  284. <el-input-number v-model="statusBarColorAlpha" :min="0" :max="1" :precision="2" :step="0.1" :disabled="!showStatusBar"></el-input-number>
  285. </el-form-item>
  286. </el-form>
  287. </el-tab-pane>
  288. <!-- Листание ------------------------------------------------------------------------->
  289. <el-tab-pane label="Листание">
  290. <el-form :model="form" size="mini" label-width="120px" @submit.native.prevent>
  291. <div class="partHeader">Анимация</div>
  292. <el-form-item label="Тип">
  293. <el-col :span="11">
  294. <el-select v-model="pageChangeAnimation">
  295. <el-option label="Нет" value=""></el-option>
  296. <el-option label="Вверх-вниз" value="downShift"></el-option>
  297. <el-option label="Вправо-влево" value="rightShift"></el-option>
  298. <el-option label="Протаивание" value="thaw"></el-option>
  299. <el-option label="Мерцание" value="blink"></el-option>
  300. </el-select>
  301. </el-col>
  302. </el-form-item>
  303. <el-form-item label="Скорость">
  304. <el-input-number v-model="pageChangeAnimationSpeed" :min="0" :max="100" :disabled="pageChangeAnimation == ''"></el-input-number>
  305. </el-form-item>
  306. </el-form>
  307. <el-form :model="form" size="mini" label-width="120px" @submit.native.prevent>
  308. <div class="partHeader">Другое</div>
  309. <el-form-item label="Страница">
  310. <el-tooltip :open-delay="500" effect="light">
  311. <template slot="content">
  312. Переносить последнюю строку страницы<br>
  313. в начало следующей при листании
  314. </template>
  315. <el-checkbox v-model="keepLastToFirst">Переносить последнюю строку</el-checkbox>
  316. </el-tooltip>
  317. </el-form-item>
  318. </el-form>
  319. </el-tab-pane>
  320. <!-- Прочее ------------------------------------------------------------------------->
  321. <el-tab-pane label="Прочее">
  322. <el-form :model="form" size="mini" label-width="120px" @submit.native.prevent>
  323. <el-form-item label="Управление">
  324. <el-checkbox v-model="clickControl">Включить управление кликом</el-checkbox>
  325. </el-form-item>
  326. <el-form-item label="Подсказка">
  327. <el-tooltip :open-delay="500" effect="light">
  328. <template slot="content">
  329. Показывать или нет подсказку при каждой загрузке книги
  330. </template>
  331. <el-checkbox v-model="showClickMapPage" :disabled="!clickControl">Показывать области управления кликом</el-checkbox>
  332. </el-tooltip>
  333. </el-form-item>
  334. <el-form-item label="Подсказка">
  335. <el-tooltip :open-delay="500" effect="light">
  336. <template slot="content">
  337. Мерцать сообщением в строке статуса и на кнопке<br>
  338. обновления при загрузке книги из кэша
  339. </template>
  340. <el-checkbox v-model="blinkCachedLoad">Предупреждать о загрузке из кэша</el-checkbox>
  341. </el-tooltip>
  342. </el-form-item>
  343. <el-form-item label="URL">
  344. <el-tooltip :open-delay="500" effect="light">
  345. <template slot="content">
  346. Добавление параметра "__p" в строке браузера<br>
  347. позволяет передавать ссылку на книгу в читалке<br>
  348. без потери текущей позиции. Однако в этом случае<br>
  349. при листании забивается история браузера, т.к. на<br>
  350. каждое изменение позиции происходит смена URL.
  351. </template>
  352. <el-checkbox v-model="allowUrlParamBookPos">Добавлять параметр "__p"</el-checkbox>
  353. </el-tooltip>
  354. </el-form-item>
  355. <el-form-item label="Парсинг">
  356. <el-tooltip :open-delay="500" effect="light">
  357. <template slot="content">
  358. Включение этой опции позволяет делать предварительную<br>
  359. обработку текста в ленивом режиме сразу после загрузки<br>
  360. книги. Это может повысить отзывчивость читалки, но<br>
  361. нагружает процессор каждый раз при открытии книги.
  362. </template>
  363. <el-checkbox v-model="lazyParseEnabled">Предварительная обработка текста</el-checkbox>
  364. </el-tooltip>
  365. </el-form-item>
  366. <el-form-item label="Копирование">
  367. <el-tooltip :open-delay="500" effect="light">
  368. <template slot="content">
  369. Загружать весь текст в окно<br>
  370. копирования текста со страницы
  371. </template>
  372. <el-checkbox v-model="copyFullText">Загружать весь текст</el-checkbox>
  373. </el-tooltip>
  374. </el-form-item>
  375. </el-form>
  376. </el-tab-pane>
  377. <!-- Сброс ------------------------------------------------------------------------->
  378. <el-tab-pane label="Сброс">
  379. <el-button @click="setDefaults">Установить по-умолчанию</el-button>
  380. </el-tab-pane>
  381. </el-tabs>
  382. </Window>
  383. </div>
  384. </div>
  385. </template>
  386. <script>
  387. //-----------------------------------------------------------------------------
  388. import Vue from 'vue';
  389. import Component from 'vue-class-component';
  390. //import _ from 'lodash';
  391. import Window from '../../share/Window.vue';
  392. import rstore from '../../../store/modules/reader';
  393. export default @Component({
  394. components: {
  395. Window,
  396. },
  397. data: function() {
  398. return Object.assign({}, rstore.settingDefaults);
  399. },
  400. watch: {
  401. form: function(newValue) {
  402. this.commit('reader/setSettings', newValue);
  403. },
  404. fontBold: function(newValue) {
  405. this.fontWeight = (newValue ? 'bold' : '');
  406. },
  407. fontItalic: function(newValue) {
  408. this.fontStyle = (newValue ? 'italic' : '');
  409. },
  410. vertShift: function(newValue) {
  411. const font = (this.webFontName ? this.webFontName : this.fontName);
  412. this.fontShifts = Object.assign({}, this.fontShifts, {[font]: newValue});
  413. this.fontVertShift = newValue;
  414. },
  415. fontName: function(newValue) {
  416. const font = (this.webFontName ? this.webFontName : newValue);
  417. this.vertShift = this.fontShifts[font] || 0;
  418. },
  419. webFontName: function(newValue) {
  420. const font = (newValue ? newValue : this.fontName);
  421. this.vertShift = this.fontShifts[font] || 0;
  422. },
  423. },
  424. })
  425. class SettingsPage extends Vue {
  426. selectedTab = null;
  427. form = {};
  428. fontBold = false;
  429. fontItalic = false;
  430. vertShift = 0;
  431. webFonts = [];
  432. fonts = [];
  433. created() {
  434. this.commit = this.$store.commit;
  435. this.reader = this.$store.state.reader;
  436. this.form = Object.assign({}, this.settings);
  437. for (let prop in rstore.settingDefaults) {
  438. this[prop] = this.form[prop];
  439. this.$watch(prop, (newValue) => {
  440. this.form = Object.assign({}, this.form, {[prop]: newValue});
  441. });
  442. }
  443. this.fontBold = (this.fontWeight == 'bold');
  444. this.fontItalic = (this.fontStyle == 'italic');
  445. this.fonts = rstore.fonts;
  446. this.webFonts = rstore.webFonts;
  447. const font = (this.webFontName ? this.webFontName : this.fontName);
  448. this.vertShift = this.fontShifts[font] || 0;
  449. }
  450. get settings() {
  451. return this.$store.state.reader.settings;
  452. }
  453. get profiles() {
  454. return this.$store.state.reader.profiles;
  455. }
  456. get profilesArray() {
  457. return Object.keys(this.profiles);
  458. }
  459. get currentProfile() {
  460. return this.$store.state.reader.currentProfile;
  461. }
  462. set currentProfile(newValue) {
  463. this.commit('reader/setCurrentProfile', newValue);
  464. }
  465. get partialStorageKey() {
  466. return this.serverStorageKey.substr(0, 7) + '***';
  467. }
  468. get serverStorageKey() {
  469. return this.$store.state.reader.serverStorageKey;
  470. }
  471. get predefineTextColors() {
  472. return [
  473. '#ffffff',
  474. '#000000',
  475. '#202020',
  476. '#323232',
  477. '#aaaaaa',
  478. '#00c0c0',
  479. ];
  480. }
  481. get predefineBackgroundColors() {
  482. return [
  483. '#ffffff',
  484. '#000000',
  485. '#202020',
  486. '#ebe2c9',
  487. '#cfdc99',
  488. '#478355',
  489. '#a6caf0',
  490. '#909080',
  491. '#808080',
  492. '#c8c8c8',
  493. ];
  494. }
  495. needReload() {
  496. this.$notify.warning({message: 'Необходимо обновить страницу (F5), чтобы изменения возымели эффект'});
  497. }
  498. close() {
  499. this.$emit('settings-toggle');
  500. }
  501. async setDefaults() {
  502. try {
  503. if (await this.$confirm('Подтвердите установку настроек по-умолчанию:', '', {
  504. confirmButtonText: 'OK',
  505. cancelButtonText: 'Отмена',
  506. type: 'warning'
  507. })) {
  508. this.form = Object.assign({}, rstore.settingDefaults);
  509. for (let prop in rstore.settingDefaults) {
  510. this[prop] = this.form[prop];
  511. }
  512. }
  513. } catch (e) {
  514. //
  515. }
  516. }
  517. async addProfile() {
  518. try {
  519. if (Object.keys(this.profiles).length >= 100) {
  520. this.$alert('Достигнут предел количества профилей', 'Ошибка');
  521. return;
  522. }
  523. const result = await this.$prompt('Введите произвольное название для профиля устройства:', '', {
  524. confirmButtonText: 'OK',
  525. cancelButtonText: 'Отмена',
  526. inputValidator: (str) => { if (!str) return 'Название не должно быть пустым'; else if (str.length > 50) return 'Слишком длинное название'; else return true; },
  527. });
  528. if (result.value) {
  529. if (this.profiles[result.value]) {
  530. this.$alert('Такой профиль уже существует', 'Ошибка');
  531. } else {
  532. this.currentProfile = result.value;
  533. await this.$nextTick();//даем возможность обновить currentProfile
  534. const newProfiles = Object.assign({}, this.profiles, {[result.value]: 1});
  535. this.commit('reader/setProfiles', newProfiles);
  536. }
  537. }
  538. } catch (e) {
  539. //
  540. }
  541. }
  542. async delProfile() {
  543. if (!this.currentProfile)
  544. return;
  545. try {
  546. const result = await this.$prompt(`<b>Предупреждение!</b> Удаление профиля '${this.currentProfile}' необратимо.` +
  547. `<br>Все настройки профиля будут потеряны,<br>однако список читаемых книг сохранится.` +
  548. `<br><br>Введите 'да' для подтверждения удаления:`, '', {
  549. dangerouslyUseHTMLString: true,
  550. confirmButtonText: 'OK',
  551. cancelButtonText: 'Отмена',
  552. inputValidator: (str) => { if (str && str.toLowerCase() === 'да') return true; else return 'Удаление не подтверждено'; },
  553. type: 'warning'
  554. });
  555. if (result.value && result.value.toLowerCase() == 'да') {
  556. if (this.profiles[this.currentProfile]) {
  557. const newProfiles = Object.assign({}, this.profiles);
  558. delete newProfiles[this.currentProfile];
  559. this.commit('reader/setProfiles', newProfiles);
  560. await this.$nextTick();//даем возможность сохранить profiles
  561. this.currentProfile = '';
  562. }
  563. }
  564. } catch (e) {
  565. //
  566. }
  567. }
  568. async delAllProfiles() {
  569. if (!Object.keys(this.profiles).length)
  570. return;
  571. try {
  572. const result = await this.$prompt(`<b>Предупреждение!</b> Удаление ВСЕХ профилей необратимо.` +
  573. `<br><br>Введите 'да' для подтверждения удаления:`, '', {
  574. dangerouslyUseHTMLString: true,
  575. confirmButtonText: 'OK',
  576. cancelButtonText: 'Отмена',
  577. inputValidator: (str) => { if (str && str.toLowerCase() === 'да') return true; else return 'Удаление не подтверждено'; },
  578. type: 'warning'
  579. });
  580. if (result.value && result.value.toLowerCase() == 'да') {
  581. if (!this.currentProfile)
  582. this.currentProfile = Object.keys(this.profiles)[0];
  583. await this.$nextTick();//даем возможность обновить currentProfile
  584. this.commit('reader/setProfiles', {});
  585. await this.$nextTick();//даем возможность сохранить profiles
  586. this.currentProfile = '';
  587. }
  588. } catch (e) {
  589. //
  590. }
  591. }
  592. async showServerStorageKey() {
  593. }
  594. async enterServerStorageKey() {
  595. }
  596. async generateServerStorageKey() {
  597. }
  598. keyHook(event) {
  599. if (event.type == 'keydown' && event.code == 'Escape') {
  600. this.close();
  601. }
  602. return true;
  603. }
  604. }
  605. //-----------------------------------------------------------------------------
  606. </script>
  607. <style scoped>
  608. .main {
  609. position: absolute;
  610. width: 100%;
  611. height: 100%;
  612. z-index: 60;
  613. display: flex;
  614. flex-direction: column;
  615. justify-content: center;
  616. align-items: center;
  617. }
  618. .mainWindow {
  619. height: 70%;
  620. display: flex;
  621. position: relative;
  622. }
  623. .text {
  624. font-size: 90%;
  625. line-height: 130%;
  626. }
  627. .el-form {
  628. border-top: 2px solid #bbbbbb;
  629. margin-bottom: 5px;
  630. }
  631. .el-form-item {
  632. padding: 0;
  633. margin: 0;
  634. margin-bottom: 5px;
  635. }
  636. .color-picked {
  637. margin-left: 10px;
  638. position: relative;
  639. top: -11px;
  640. }
  641. .partHeader {
  642. font-weight: bold;
  643. margin-bottom: 5px;
  644. }
  645. .el-tabs {
  646. flex: 1;
  647. display: flex;
  648. }
  649. .el-tab-pane {
  650. flex: 1;
  651. display: flex;
  652. flex-direction: column;
  653. width: 420px;
  654. overflow-y: auto;
  655. padding: 15px;
  656. }
  657. </style>