LibsPage.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <template>
  2. <Window ref="window" @close="close">
  3. <template slot="header">
  4. Библиотеки <span v-show="startLink">(выбрана {{ startLink }})</span>
  5. </template>
  6. <div class="col column" style="min-width: 600px">
  7. <div class="row items-center q-px-sm" style="height: 50px">
  8. <q-select class="q-mr-sm" v-model="externalLib" :options="externalLibOptions"
  9. style="width: 250px"
  10. dropdown-icon="la la-angle-down la-sm"
  11. rounded outlined dense emit-value map-options
  12. >
  13. <template v-slot:prepend>
  14. <q-btn class="q-mr-xs" round dense color="blue" icon="la la-plus" size="12px"/>
  15. <q-btn round dense color="blue" icon="la la-bars" size="12px"/>
  16. </template>
  17. </q-select>
  18. <q-select class="q-mr-sm" v-model="startPageModel" :options="startPageOptions" style="width: 50px"
  19. dropdown-icon="la la-angle-down la-sm"
  20. rounded outlined dense emit-value map-options
  21. />
  22. <q-input ref="input" class="col" rounded outlined dense bg-color="white" v-model="bookUrl" placeholder="Скопируйте сюда URL книги" @focus="onInputFocus">
  23. <template v-slot:prepend>
  24. <q-btn round dense color="blue" icon="la la-angle-double-down" @click="openBookUrlInFrame" size="12px"/>
  25. </template>
  26. </q-input>
  27. <q-btn class="q-mx-sm" rounded color="green-5" no-caps size="14px">Открыть</q-btn>
  28. </div>
  29. <div class="separator"></div>
  30. <iframe class="col fit" :src="frameSrc" frameborder="0"></iframe>
  31. </div>
  32. </Window>
  33. </template>
  34. <script>
  35. //-----------------------------------------------------------------------------
  36. import Vue from 'vue';
  37. import Component from 'vue-class-component';
  38. import Window from '../../share/Window.vue';
  39. export default @Component({
  40. components: {
  41. Window
  42. },
  43. watch: {
  44. }
  45. })
  46. class LibsPage extends Vue {
  47. startLink = '';
  48. frameSrc = '';
  49. bookUrl = '';
  50. created() {
  51. this.commit = this.$store.commit;
  52. this.loadLibs();
  53. }
  54. init() {
  55. this.$refs.window.init();
  56. if (!this.frameSrc)
  57. this.frameSrc = this.libs.startLink;
  58. }
  59. get libs() {
  60. return this.$store.state.reader.libs;
  61. }
  62. loadLibs() {
  63. const libs = this.libs;
  64. this.startLink = this.removeProtocol(libs.startLink);
  65. }
  66. openBookUrlInFrame() {
  67. if (this.bookUrl)
  68. this.frameSrc = this.addProtocol(this.bookUrl);
  69. }
  70. addProtocol(url) {
  71. if ((url.indexOf('http://') != 0) && (url.indexOf('https://') != 0))
  72. return 'http://' + url;
  73. return url;
  74. }
  75. removeProtocol(url) {
  76. return url.replace(/(^\w+:|^)\/\//, '');
  77. }
  78. onInputFocus() {
  79. this.$refs.input.select();
  80. }
  81. close() {
  82. this.$emit('do-action', {action: 'libs'});
  83. }
  84. keyHook() {
  85. if (event.type == 'keydown' && (event.code == 'Escape')) {
  86. this.close();
  87. }
  88. return true;
  89. }
  90. }
  91. //-----------------------------------------------------------------------------
  92. </script>
  93. <style scoped>
  94. .separator {
  95. height: 1px;
  96. background-color: #A0A0A0;
  97. }</style>